From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS, UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F292C04AB1 for ; Mon, 13 May 2019 05:54:46 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 15ACD20873 for ; Mon, 13 May 2019 05:54:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 15ACD20873 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=users.sourceforge.jp Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([127.0.0.1]:51455 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQ3vB-0004hl-7V for qemu-devel@archiver.kernel.org; Mon, 13 May 2019 01:54:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:59280) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQ3uL-0004Oi-So for qemu-devel@nongnu.org; Mon, 13 May 2019 01:53:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hQ3uI-0001pp-GL for qemu-devel@nongnu.org; Mon, 13 May 2019 01:53:53 -0400 Received: from mail01.asahi-net.or.jp ([202.224.55.13]:50054) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hQ3uI-0001oZ-2v for qemu-devel@nongnu.org; Mon, 13 May 2019 01:53:50 -0400 Received: from h61-195-96-97.vps.ablenet.jp (h61-195-96-97.vps.ablenet.jp [61.195.96.97]) (Authenticated sender: PQ4Y-STU) by mail01.asahi-net.or.jp (Postfix) with ESMTPA id 5BD9211BF7E; Mon, 13 May 2019 14:53:45 +0900 (JST) Received: from yo-satoh-debian.ysato.ml (ZM005235.ppp.dion.ne.jp [222.8.5.235]) by h61-195-96-97.vps.ablenet.jp (Postfix) with ESMTPSA id E2C8B240085; Mon, 13 May 2019 14:53:43 +0900 (JST) Date: Mon, 13 May 2019 14:53:38 +0900 Message-ID: <87ftpi528t.wl-ysato@users.sourceforge.jp> From: Yoshinori Sato To: Philippe =?ISO-8859-1?Q?Mathieu-Daud=E9?= In-Reply-To: References: <20190508145611.107133-1-ysato@users.sourceforge.jp> <20190508145611.107133-9-ysato@users.sourceforge.jp> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL/10.8 EasyPG/1.0.0 Emacs/25.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 202.224.55.13 Subject: Re: [Qemu-devel] [PATCH v10 08/13] hw/char: RX62N serial communication interface (SCI) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, richard.henderson@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" On Thu, 09 May 2019 01:16:58 +0900, Philippe Mathieu-Daud=E9 wrote: >=20 > On 5/8/19 4:56 PM, Yoshinori Sato wrote: > > This module supported only non FIFO type. > > Hardware manual. > > https://www.renesas.com/us/en/doc/products/mpumcu/doc/rx_family/r01uh00= 33ej0140_rx62n.pdf > >=20 > > Signed-off-by: Yoshinori Sato > > --- > > include/hw/char/renesas_sci.h | 45 ++++++ > > hw/char/renesas_sci.c | 340 ++++++++++++++++++++++++++++++++++= ++++++++ > > hw/char/Kconfig | 3 + > > hw/char/Makefile.objs | 2 +- > > 4 files changed, 389 insertions(+), 1 deletion(-) > > create mode 100644 include/hw/char/renesas_sci.h > > create mode 100644 hw/char/renesas_sci.c > >=20 > > diff --git a/include/hw/char/renesas_sci.h b/include/hw/char/renesas_sc= i.h > > new file mode 100644 > > index 0000000000..50d1336944 > > --- /dev/null > > +++ b/include/hw/char/renesas_sci.h > > @@ -0,0 +1,45 @@ > > +/* > > + * Renesas Serial Communication Interface > > + * > > + * Copyright (c) 2018 Yoshinori Sato > > + * > > + * This code is licensed under the GPL version 2 or later. > > + * > > + */ > > + > > +#include "chardev/char-fe.h" > > +#include "qemu/timer.h" > > +#include "hw/sysbus.h" > > + > > +#define TYPE_RENESAS_SCI "renesas-sci" > > +#define RSCI(obj) OBJECT_CHECK(RSCIState, (obj), TYPE_RENESAS_SCI) > > + > > +enum { > > + ERI =3D 0, > > + RXI =3D 1, > > + TXI =3D 2, > > + TEI =3D 3, > > + SCI_NR_IRQ =3D 4, > > +}; > > + > > +typedef struct { > > + SysBusDevice parent_obj; > > + MemoryRegion memory; > > + > > + uint8_t smr; > > + uint8_t brr; > > + uint8_t scr; > > + uint8_t tdr; > > + uint8_t ssr; > > + uint8_t rdr; > > + uint8_t scmr; > > + uint8_t semr; > > + > > + uint8_t read_ssr; > > + int64_t trtime; > > + int64_t rx_next; > > + QEMUTimer *timer; > > + CharBackend chr; > > + uint64_t input_freq; > > + qemu_irq irq[SCI_NR_IRQ]; > > +} RSCIState; > > diff --git a/hw/char/renesas_sci.c b/hw/char/renesas_sci.c > > new file mode 100644 > > index 0000000000..2e7c3e460e > > --- /dev/null > > +++ b/hw/char/renesas_sci.c > > @@ -0,0 +1,340 @@ > > +/* > > + * Renesas Serial Communication Interface > > + * > > + * Datasheet: RX62N Group, RX621 Group User's Manual: Hardware > > + * (Rev.1.40 R01UH0033EJ0140) > > + * > > + * Copyright (c) 2019 Yoshinori Sato > > + * > > + * This program is free software; you can redistribute it and/or modif= y it > > + * under the terms and conditions of the GNU General Public License, > > + * version 2 or later, as published by the Free Software Foundation. > > + * > > + * This program is distributed in the hope it will be useful, but WITH= OUT > > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY = or > > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licen= se for > > + * more details. > > + * > > + * You should have received a copy of the GNU General Public License a= long with > > + * this program. If not, see . > > + */ > > + > > +#include "qemu/osdep.h" > > +#include "qemu/log.h" > > +#include "qapi/error.h" > > +#include "qemu-common.h" > > +#include "cpu.h" > > +#include "hw/hw.h" > > +#include "hw/sysbus.h" > > +#include "hw/registerfields.h" > > +#include "hw/char/renesas_sci.h" > > +#include "qemu/error-report.h" > > + > > +/* SCI register map */ > > +REG8(SMR, 0) > > + FIELD(SMR, CKS, 0, 2) > > + FIELD(SMR, MP, 2, 1) > > + FIELD(SMR, STOP, 3, 1) > > + FIELD(SMR, PM, 4, 1) > > + FIELD(SMR, PE, 5, 1) > > + FIELD(SMR, CHR, 6, 1) > > + FIELD(SMR, CM, 7, 1) > > +REG8(BRR, 1) > > +REG8(SCR, 2) > > + FIELD(SCR, CKE, 0, 2) > > + FIELD(SCR, TEIE, 2, 1) > > + FIELD(SCR, MPIE, 3, 1) > > + FIELD(SCR, RE, 4, 1) > > + FIELD(SCR, TE, 5, 1) > > + FIELD(SCR, RIE, 6, 1) > > + FIELD(SCR, TIE, 7, 1) > > +REG8(TDR, 3) > > +REG8(SSR, 4) > > + FIELD(SSR, MPBT, 0, 1) > > + FIELD(SSR, MPB, 1, 1) > > + FIELD(SSR, TEND, 2, 1) > > + FIELD(SSR, ERR, 3, 3) > > + FIELD(SSR, PER, 3, 1) > > + FIELD(SSR, FER, 4, 1) > > + FIELD(SSR, ORER, 5, 1) > > + FIELD(SSR, RDRF, 6, 1) > > + FIELD(SSR, TDRE, 7, 1) > > +REG8(RDR, 5) > > +REG8(SCMR, 6) > > + FIELD(SCMR, SMIF, 0, 1) > > + FIELD(SCMR, SINV, 2, 1) > > + FIELD(SCMR, SDIR, 3, 1) > > + FIELD(SCMR, BCP2, 7, 1) > > +REG8(SEMR, 7) > > + FIELD(SEMR, ACS0, 0, 1) > > + FIELD(SEMR, ABCS, 4, 1) > > + > > +static int can_receive(void *opaque) > > +{ > > + RSCIState *sci =3D RSCI(opaque); > > + if (sci->rx_next > qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)) { > > + return 0; > > + } else { > > + return FIELD_EX8(sci->scr, SCR, RE); > > + } > > +} > > + > > +static void receive(void *opaque, const uint8_t *buf, int size) > > +{ > > + RSCIState *sci =3D RSCI(opaque); > > + sci->rx_next =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + sci->trti= me; > > + if (FIELD_EX8(sci->ssr, SSR, RDRF) || size > 1) { > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, ORER, 1); > > + if (FIELD_EX8(sci->scr, SCR, RIE)) { > > + qemu_set_irq(sci->irq[ERI], 1); > > + } > > + } else { > > + sci->rdr =3D buf[0]; > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, RDRF, 1); > > + if (FIELD_EX8(sci->scr, SCR, RIE)) { > > + qemu_irq_pulse(sci->irq[RXI]); > > + } > > + } > > +} > > + > > +static void send_byte(RSCIState *sci) > > +{ > > + if (qemu_chr_fe_backend_connected(&sci->chr)) { > > + qemu_chr_fe_write_all(&sci->chr, &sci->tdr, 1); > > + } > > + timer_mod(sci->timer, > > + qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + sci->trtime); > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TEND, 0); > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TDRE, 1); > > + qemu_set_irq(sci->irq[TEI], 0); > > + if (FIELD_EX8(sci->scr, SCR, TIE)) { > > + qemu_irq_pulse(sci->irq[TXI]); > > + } > > +} > > + > > +static void txend(void *opaque) > > +{ > > + RSCIState *sci =3D RSCI(opaque); > > + if (!FIELD_EX8(sci->ssr, SSR, TDRE)) { > > + send_byte(sci); > > + } else { > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TEND, 1); > > + if (FIELD_EX8(sci->scr, SCR, TEIE)) { > > + qemu_set_irq(sci->irq[TEI], 1); > > + } > > + } > > +} > > + > > +static void update_trtime(RSCIState *sci) > > +{ > > + /* char per bits */ > > + sci->trtime =3D 8 - FIELD_EX8(sci->smr, SMR, CHR); > > + sci->trtime +=3D FIELD_EX8(sci->smr, SMR, PE); > > + sci->trtime +=3D FIELD_EX8(sci->smr, SMR, STOP) + 1; > > + /* x bit transmit time (32 * divrate * brr) / base freq */ > > + sci->trtime *=3D 32 * sci->brr; > > + sci->trtime *=3D 1 << (2 * FIELD_EX8(sci->smr, SMR, CKS)); > > + sci->trtime *=3D NANOSECONDS_PER_SECOND; > > + sci->trtime /=3D sci->input_freq; > > +} > > + > > +#define IS_TR_ENABLED(scr) \ > > + (FIELD_EX8(scr, SCR, TE) || FIELD_EX8(scr, SCR, RE)) > > + > > +static void sci_write(void *opaque, hwaddr addr, uint64_t val, unsigne= d size) > > +{ > > + hwaddr offset =3D addr & 0x07; > > + RSCIState *sci =3D RSCI(opaque); > > + > > + switch (offset) { > > + case A_SMR: > > + if (!IS_TR_ENABLED(sci->scr)) { > > + sci->smr =3D val; > > + update_trtime(sci); > > + } > > + break; > > + case A_BRR: > > + if (!IS_TR_ENABLED(sci->scr)) { > > + sci->brr =3D val; > > + update_trtime(sci); > > + } > > + break; > > + case A_SCR: > > + sci->scr =3D val; > > + if (FIELD_EX8(sci->scr, SCR, TE)) { > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TDRE, 1); > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TEND, 1); > > + if (FIELD_EX8(sci->scr, SCR, TIE)) { > > + qemu_irq_pulse(sci->irq[TXI]); > > + } > > + } > > + if (!FIELD_EX8(sci->scr, SCR, TEIE)) { > > + qemu_set_irq(sci->irq[TEI], 0); > > + } > > + if (!FIELD_EX8(sci->scr, SCR, RIE)) { > > + qemu_set_irq(sci->irq[ERI], 0); > > + } > > + break; > > + case A_TDR: > > + sci->tdr =3D val; > > + if (FIELD_EX8(sci->ssr, SSR, TEND)) { > > + send_byte(sci); > > + } else { > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, TDRE, 0); > > + } > > + break; > > + case A_SSR: > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, MPBT, > > + FIELD_EX8(val, SSR, MPBT)); > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, ERR, > > + FIELD_EX8(val, SSR, ERR) & 0x07); > > + if (FIELD_EX8(sci->read_ssr, SSR, ERR) && > > + FIELD_EX8(sci->ssr, SSR, ERR) =3D=3D 0) { > > + qemu_set_irq(sci->irq[ERI], 0); > > + } > > + break; > > + case A_RDR: > > + qemu_log_mask(LOG_GUEST_ERROR, "reneas_sci: RDR is read only.\= n"); > > + break; > > + case A_SCMR: > > + sci->scmr =3D val; break; > > + case A_SEMR: /* SEMR */ > > + sci->semr =3D val; break; > > + default: > > + qemu_log_mask(LOG_UNIMP, > > + "renesas_sci: Register %08lx not implemented\n",= offset); >=20 > On 32bit host I get: >=20 > In file included from qemu/hw/char/renesas_sci.c:23:0: > qemu/hw/char/renesas_sci.c: In function 'sci_write': > qemu/hw/char/renesas_sci.c:205:23: error: format '%lx' expects argument > of type 'long unsigned int', but argument 2 has type 'hwaddr {aka long > long unsigned int}' [-Werror=3Dformat=3D] > "renesas_sci: Register %08lx not implemented\n", > offset); > ^ > qemu/include/qemu/log.h:85:22: note: in definition of macro 'qemu_log_mas= k' > qemu_log(FMT, ## __VA_ARGS__); \ > ^ > qemu/hw/char/renesas_sci.c: In function 'sci_read': > qemu/hw/char/renesas_sci.c:235:23: error: format '%lx' expects argument > of type 'long unsigned int', but argument 2 has type 'hwaddr {aka long > long unsigned int}' [-Werror=3Dformat=3D] > "renesas_sci: Register %08lx not implemented.\n", > offset); > ^ > qemu/include/qemu/log.h:85:22: note: in definition of macro 'qemu_log_mas= k' > qemu_log(FMT, ## __VA_ARGS__); \ > ^ > cc1: all warnings being treated as errors >=20 > This snippet fixes the error: >=20 > -- >8 -- > diff --git a/hw/char/renesas_sci.c b/hw/char/renesas_sci.c > @@ -202,7 +202,8 @@ static void sci_write(void *opaque, hwaddr addr, > uint64_t val, unsigned size) > sci->semr =3D val; break; > default: > qemu_log_mask(LOG_UNIMP, > - "renesas_sci: Register %08lx not implemented\n", > offset); > + "renesas_sci: Register %08" HWADDR_PRIx > + " not implemented\n", offset); > } > } >=20 > @@ -232,7 +233,8 @@ static uint64_t sci_read(void *opaque, hwaddr addr, > unsigned size) > return sci->semr; > default: > qemu_log_mask(LOG_UNIMP, > - "renesas_sci: Register %08lx not implemented.\n", > offset); > + "renesas_sci: Register %08" HWADDR_PRIx > + " not implemented\n", offset); > } > return -1; > } > --- >=20 > > + } > > +} > > + > > +static uint64_t sci_read(void *opaque, hwaddr addr, unsigned size) > > +{ > > + hwaddr offset =3D addr & 0x07; > > + RSCIState *sci =3D RSCI(opaque); > > + > > + switch (offset) { > > + case A_SMR: > > + return sci->smr; > > + case A_BRR: > > + return sci->brr; > > + case A_SCR: > > + return sci->scr; > > + case A_TDR: > > + return sci->tdr; > > + case A_SSR: > > + sci->read_ssr =3D sci->ssr; > > + return sci->ssr; > > + case A_RDR: > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, RDRF, 0); > > + return sci->rdr; > > + case A_SCMR: > > + return sci->scmr; > > + case A_SEMR: > > + return sci->semr; > > + default: > > + qemu_log_mask(LOG_UNIMP, > > + "renesas_sci: Register %08lx not implemented.\n"= , offset); > > + } > > + return -1; > > +} > > + > > +static const MemoryRegionOps sci_ops =3D { > > + .write =3D sci_write, > > + .read =3D sci_read, > > + .endianness =3D DEVICE_NATIVE_ENDIAN, > > + .impl =3D { > > + .max_access_size =3D 1, > > + }, > > +}; > > + > > +static void rsci_reset(DeviceState *dev) > > +{ > > + RSCIState *sci =3D RSCI(dev); > > + sci->smr =3D sci->scr =3D 0x00; > > + sci->brr =3D 0xff; > > + sci->tdr =3D 0xff; > > + sci->rdr =3D 0x00; > > + sci->ssr =3D 0x84; > > + sci->scmr =3D 0x00; > > + sci->semr =3D 0x00; > > + sci->rx_next =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); > > +} > > + > > +static void sci_event(void *opaque, int event) > > +{ > > + RSCIState *sci =3D RSCI(opaque); > > + if (event =3D=3D CHR_EVENT_BREAK) { > > + sci->ssr =3D FIELD_DP8(sci->ssr, SSR, FER, 1); > > + if (FIELD_EX8(sci->scr, SCR, RIE)) { > > + qemu_set_irq(sci->irq[ERI], 1); > > + } > > + } > > +} > > + > > +static void rsci_realize(DeviceState *dev, Error **errp) > > +{ > > + RSCIState *sci =3D RSCI(dev); > > + > > + if (sci->input_freq =3D=3D 0) { > > + qemu_log_mask(LOG_GUEST_ERROR, > > + "renesas_sci: input-freq property must be set."); > > + return; > > + } > > + qemu_chr_fe_set_handlers(&sci->chr, can_receive, receive, > > + sci_event, NULL, sci, NULL, true); > > +} > > + > > +static void rsci_init(Object *obj) > > +{ > > + SysBusDevice *d =3D SYS_BUS_DEVICE(obj); > > + RSCIState *sci =3D RSCI(obj); > > + int i; > > + > > + memory_region_init_io(&sci->memory, OBJECT(sci), &sci_ops, > > + sci, "renesas-sci", 0x8); > > + sysbus_init_mmio(d, &sci->memory); > > + > > + for (i =3D 0; i < SCI_NR_IRQ; i++) { > > + sysbus_init_irq(d, &sci->irq[i]); > > + } > > + sci->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, txend, sci); > > +} > > + > > +static const VMStateDescription vmstate_rcmt =3D { > > + .name =3D "renesas-sci", > > + .version_id =3D 1, > > + .minimum_version_id =3D 1, > > + .fields =3D (VMStateField[]) { > > + VMSTATE_END_OF_LIST() > > + } > > +}; > > + > > +static Property rsci_properties[] =3D { > > + DEFINE_PROP_UINT64("input-freq", RSCIState, input_freq, 0), > > + DEFINE_PROP_CHR("chardev", RSCIState, chr), > > + DEFINE_PROP_END_OF_LIST(), > > +}; > > + > > +static void rsci_class_init(ObjectClass *klass, void *data) > > +{ > > + DeviceClass *dc =3D DEVICE_CLASS(klass); > > + > > + dc->realize =3D rsci_realize; > > + dc->props =3D rsci_properties; > > + dc->vmsd =3D &vmstate_rcmt; > > + dc->reset =3D rsci_reset; > > +} > > + > > +static const TypeInfo rsci_info =3D { > > + .name =3D TYPE_RENESAS_SCI, > > + .parent =3D TYPE_SYS_BUS_DEVICE, > > + .instance_size =3D sizeof(RSCIState), > > + .instance_init =3D rsci_init, > > + .class_init =3D rsci_class_init, > > +}; > > + > > +static void rsci_register_types(void) > > +{ > > + type_register_static(&rsci_info); > > +} > > + > > +type_init(rsci_register_types) > > diff --git a/hw/char/Kconfig b/hw/char/Kconfig > > index 6360c9fffa..10c24ca87f 100644 > > --- a/hw/char/Kconfig > > +++ b/hw/char/Kconfig > > @@ -40,3 +40,6 @@ config SCLPCONSOLE > > =20 > > config TERMINAL3270 > > bool > > + > > +config RENESAS_SCI > > + bool >=20 > select SERIAL It my mistake. RX don't use SERIAL. So this line not needed. > > diff --git a/hw/char/Makefile.objs b/hw/char/Makefile.objs > > index cf086e7114..7567e89a49 100644 > > --- a/hw/char/Makefile.objs > > +++ b/hw/char/Makefile.objs > > @@ -15,7 +15,7 @@ common-obj-$(CONFIG_CADENCE) +=3D cadence_uart.o > > obj-$(CONFIG_EXYNOS4) +=3D exynos4210_uart.o > > obj-$(CONFIG_COLDFIRE) +=3D mcf_uart.o > > obj-$(CONFIG_OMAP) +=3D omap_uart.o > > -obj-$(CONFIG_SH4) +=3D sh_serial.o > > +obj-$(CONFIG_RENESAS_SCI) +=3D renesas_sci.o > > obj-$(CONFIG_PSERIES) +=3D spapr_vty.o > > obj-$(CONFIG_DIGIC) +=3D digic-uart.o > > obj-$(CONFIG_STM32F2XX_USART) +=3D stm32f2xx_usart.o > >=20 >=20 > Nice work! >=20 > Tested-by: Philippe Mathieu-Daud=E9 >=20 --=20 Yosinori Sato