From patchwork Thu Apr 18 16:43:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 237682 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6495E2C01EE for ; Fri, 19 Apr 2013 02:44:47 +1000 (EST) Received: from localhost ([::1]:56240 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USrwz-0006Zr-A2 for incoming@patchwork.ozlabs.org; Thu, 18 Apr 2013 12:44:45 -0400 Received: from eggs.gnu.org ([208.118.235.92]:60368) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USrwU-0006Yt-1Z for qemu-devel@nongnu.org; Thu, 18 Apr 2013 12:44:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1USrwS-0006Ll-Is for qemu-devel@nongnu.org; Thu, 18 Apr 2013 12:44:13 -0400 Received: from mail-ea0-x22d.google.com ([2a00:1450:4013:c01::22d]:59934) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1USrwS-0006Lg-8a for qemu-devel@nongnu.org; Thu, 18 Apr 2013 12:44:12 -0400 Received: by mail-ea0-f173.google.com with SMTP id k11so1401162eaj.32 for ; Thu, 18 Apr 2013 09:44:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=6Slab0J6nz/9urVdkVLGIXA6Gli2o6kuuBrj95z0mp0=; b=oKAmIyOZWLTvLqBaJA2oUkosIg51c+tbeWC0rAVNfvd8t7r9RUPYfw1RhYBTJM1rNf xkI8NqO/Dnbxr+DGtUQfL/muT63PA7zjtf75C2L8ui8nT9yxxDqfP1TadULQjC2Mb0lR yROtvvxouGpajj0VIQFs4b7FP5vf9De3Kkn+GyslfOwBNH16F8Jy+dY1YjE+Qds5JNHc QEfudBg6xshiFZrTSW6Hy7F7cYn5zVVIrTPqXlgV/x6McDiUVok5IAwAmGGS/CGA/1Aa BpWDBV/zrQK9Iv1VFKvubRDbqQN4axEblZSRg6y9HwjmWxlQW5YzVu5Ga65Cs5IFm8au WcmA== X-Received: by 10.14.219.130 with SMTP id m2mr31996557eep.32.1366303451345; Thu, 18 Apr 2013 09:44:11 -0700 (PDT) Received: from playground.lan (93-34-176-20.ip50.fastwebnet.it. [93.34.176.20]) by mx.google.com with ESMTPS id f9sm1873198eeu.11.2013.04.18.09.44.09 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 18 Apr 2013 09:44:10 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Apr 2013 18:43:57 +0200 Message-Id: <1366303444-24620-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1366303444-24620-1-git-send-email-pbonzini@redhat.com> References: <1366303444-24620-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4013:c01::22d Cc: av1474@comtv.ru Subject: [Qemu-devel] [PATCH 1/8] adlib: qdev-ify X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Paolo Bonzini Reviewed-by: Andreas Färber --- RFC->v1: follow QOM guidelines (Andreas) hw/audio/adlib.c | 83 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/hw/audio/adlib.c b/hw/audio/adlib.c index 4a58e6e..fb41f9d 100644 --- a/hw/audio/adlib.c +++ b/hw/audio/adlib.c @@ -31,6 +31,12 @@ #define ADLIB_KILL_TIMERS 1 +#ifdef HAS_YMF262 +#define ADLIB_DESC "Yamaha YMF262 (OPL3)" +#else +#define ADLIB_DESC "Yamaha YM3812 (OPL2)" +#endif + #ifdef DEBUG #include "qemu/timer.h" #endif @@ -56,13 +62,15 @@ void YMF262UpdateOneQEMU (int which, INT16 *dst, int length); #define IO_WRITE_PROTO(name) \ void name (void *opaque, uint32_t nport, uint32_t val) -static struct { - int port; - int freq; -} conf = {0x220, 44100}; +#define TYPE_ADLIB "adlib" +#define ADLIB(obj) OBJECT_CHECK(AdlibState, (obj), TYPE_ADLIB) typedef struct { + ISADevice parent_obj; + QEMUSoundCard card; + uint32_t freq; + uint32_t port; int ticking[2]; int enabled; int active; @@ -80,7 +88,7 @@ typedef struct { #endif } AdlibState; -static AdlibState glob_adlib; +static AdlibState *glob_adlib; static void adlib_stop_opl_timer (AdlibState *s, size_t n) { @@ -150,7 +158,7 @@ static IO_READ_PROTO (adlib_read) static void timer_handler (int c, double interval_Sec) { - AdlibState *s = &glob_adlib; + AdlibState *s = glob_adlib; unsigned n = c & 1; #ifdef DEBUG double interval; @@ -275,14 +283,20 @@ static void Adlib_fini (AdlibState *s) AUD_remove_card (&s->card); } -int Adlib_init (ISABus *bus) +static int Adlib_initfn (ISADevice *dev) { - AdlibState *s = &glob_adlib; + AdlibState *s = ADLIB(dev); struct audsettings as; + if (glob_adlib) { + dolog ("Cannot create more than 1 adlib device\n"); + return -1; + } + glob_adlib = s; + #ifdef HAS_YMF262 - if (YMF262Init (1, 14318180, conf.freq)) { - dolog ("YMF262Init %d failed\n", conf.freq); + if (YMF262Init (1, 14318180, s->freq)) { + dolog ("YMF262Init %d failed\n", s->freq); return -1; } else { @@ -290,9 +304,9 @@ int Adlib_init (ISABus *bus) s->enabled = 1; } #else - s->opl = OPLCreate (OPL_TYPE_YM3812, 3579545, conf.freq); + s->opl = OPLCreate (OPL_TYPE_YM3812, 3579545, s->freq); if (!s->opl) { - dolog ("OPLCreate %d failed\n", conf.freq); + dolog ("OPLCreate %d failed\n", s->freq); return -1; } else { @@ -301,7 +315,7 @@ int Adlib_init (ISABus *bus) } #endif - as.freq = conf.freq; + as.freq = s->freq; as.nchannels = SHIFT; as.fmt = AUD_FMT_S16; as.endianness = AUDIO_HOST_ENDIANNESS; @@ -327,11 +341,46 @@ int Adlib_init (ISABus *bus) register_ioport_read (0x388, 4, 1, adlib_read, s); register_ioport_write (0x388, 4, 1, adlib_write, s); - register_ioport_read (conf.port, 4, 1, adlib_read, s); - register_ioport_write (conf.port, 4, 1, adlib_write, s); + register_ioport_read (s->port, 4, 1, adlib_read, s); + register_ioport_write (s->port, 4, 1, adlib_write, s); - register_ioport_read (conf.port + 8, 2, 1, adlib_read, s); - register_ioport_write (conf.port + 8, 2, 1, adlib_write, s); + register_ioport_read (s->port + 8, 2, 1, adlib_read, s); + register_ioport_write (s->port + 8, 2, 1, adlib_write, s); return 0; } + +static Property adlib_properties[] = { + DEFINE_PROP_HEX32 ("iobase", AdlibState, port, 0x220), + DEFINE_PROP_UINT32 ("freq", AdlibState, freq, 44100), + DEFINE_PROP_END_OF_LIST (), +}; + +static void adlib_class_initfn (ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS (klass); + ISADeviceClass *ic = ISA_DEVICE_CLASS (klass); + ic->init = Adlib_initfn; + dc->desc = ADLIB_DESC; + dc->props = adlib_properties; +} + +static const TypeInfo adlib_info = { + .name = TYPE_ADLIB, + .parent = TYPE_ISA_DEVICE, + .instance_size = sizeof (AdlibState), + .class_init = adlib_class_initfn, +}; + +int Adlib_init (ISABus *bus) +{ + isa_create_simple (bus, TYPE_ADLIB); + return 0; +} + +static void adlib_register_types (void) +{ + type_register_static (&adlib_info); +} + +type_init (adlib_register_types)