static struct dz_port dz_ports[DZ_NB_PORT];
 
+static inline struct dz_port *to_dport(struct uart_port *uport)
+{
+       return container_of(uport, struct dz_port, port);
+}
+
 /*
  * ------------------------------------------------------------
  * dz_in () and dz_out ()
 
 static void dz_stop_tx(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned short tmp, mask = 1 << dport->port.line;
 
        tmp = dz_in(dport, DZ_TCR);     /* read the TX flag */
 
 static void dz_start_tx(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned short tmp, mask = 1 << dport->port.line;
 
        tmp = dz_in(dport, DZ_TCR);     /* read the TX flag */
 
 static void dz_stop_rx(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
 
        dport->cflag &= ~DZ_RXENAB;
        dz_out(dport, DZ_LPR, dport->cflag);
        /*
         * FIXME: Handle the 3100/5000 as appropriate. --macro
         */
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned int mctrl = TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
 
        if (dport->port.line == DZ_MODEM) {
        /*
         * FIXME: Handle the 3100/5000 as appropriate. --macro
         */
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned short tmp;
 
        if (dport->port.line == DZ_MODEM) {
  */
 static int dz_startup(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned long flags;
        unsigned short tmp;
 
  */
 static void dz_shutdown(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned long flags;
 
        spin_lock_irqsave(&dport->port.lock, flags);
  */
 static unsigned int dz_tx_empty(struct uart_port *uport)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned short tmp, mask = 1 << dport->port.line;
 
        tmp = dz_in(dport, DZ_TCR);
         * FIXME: Can't access BREAK bits in TDR easily;
         * reuse the code for polled TX. --macro
         */
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned long flags;
        unsigned short tmp, mask = 1 << dport->port.line;
 
 static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
                           struct ktermios *old_termios)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned long flags;
        unsigned int cflag, baud;
        int bflag;
  */
 static void dz_console_putchar(struct uart_port *uport, int ch)
 {
-       struct dz_port *dport = (struct dz_port *)uport;
+       struct dz_port *dport = to_dport(uport);
        unsigned long flags;
        unsigned short csr, tcr, trdy, mask;
        int loops = 10000;