Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 10 Dec 2009 03:52:13 +0000 (19:52 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 10 Dec 2009 03:52:13 +0000 (19:52 -0800)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: ice1724 - aureon - modify WM8770 Master & DAC volume
  ALSA: hda/realtek: quirk for D945GCLF2 mainboard
  ALSA: hda - Terradici HDA controllers does not support 64-bit mode
  ALSA: document: Add direct git link to grub hda-analyzer
  ALSA: radio/sound/miro: fix build, cleanup depends/selects
  ALSA: hda - Generalize EAPD inversion check in patch_analog.c
  ASoC: Wrong variable returned on error
  ALSA: snd-usb-us122l: add product IDs of US-122MKII and US-144MKII
  ALSA: hda - Exclude unusable ADCs for ALC88x
  ALSA: hda - Add missing Line-Out and PCM switches as slave
  ALSA: hda - iMac 9,1 sound patch.
  ALSA: opti93x: set MC indirect registers base from PnP data

1  2 
drivers/media/radio/Kconfig
sound/isa/opti9xx/opti92x-ad1848.c
sound/pci/hda/patch_realtek.c

index d4389963b3120c6560427f01d313b056cccee58b,dcc7af2f331909f8404bbb139a5ffd3f61d1d1b8..4c2b8a246772c968f8747d37b14f9c1a0bc81291
@@@ -197,7 -197,8 +197,8 @@@ config RADIO_MAESTR
  
  config RADIO_MIROPCM20
        tristate "miroSOUND PCM20 radio"
-       depends on ISA && VIDEO_V4L2
+       depends on ISA && VIDEO_V4L2 && SND
+       select SND_ISA
        select SND_MIRO
        ---help---
          Choose Y here if you have this FM radio card. You also need to enable
@@@ -419,16 -420,4 +420,16 @@@ config RADIO_TEA5764_XTA
          Say Y here if TEA5764 have a 32768 Hz crystal in circuit, say N
          here if TEA5764 reference frequency is connected in FREQIN.
  
 +config RADIO_TEF6862
 +      tristate "TEF6862 Car Radio Enhanced Selectivity Tuner"
 +      depends on I2C && VIDEO_V4L2
 +      ---help---
 +        Say Y here if you want to use the TEF6862 Car Radio Enhanced
 +        Selectivity Tuner, found for instance on the Russellville development
 +        board. On the russellville the device is connected to internal
 +        timberdale I2C bus.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called TEF6862.
 +
  endif # RADIO_ADAPTERS
index d622d2906862ec2b1a0c95b2d9f1c828c522613d,8c88401c79bcde0d21a64b44c4c0d7ea3e420067..106be6e471f7c051c98872dbe4bc8d92ac0de059
@@@ -135,6 -135,8 +135,8 @@@ struct snd_opti9xx 
        unsigned long mc_base_size;
  #ifdef OPTi93X
        unsigned long mc_indir_index;
+       unsigned long mc_indir_size;
+       struct resource *res_mc_indir;
        struct snd_wss *codec;
  #endif        /* OPTi93X */
        unsigned long pwd_reg;
@@@ -177,7 -179,7 +179,7 @@@ MODULE_DEVICE_TABLE(pnp_card, snd_opti9
  #endif
  
  static char * snd_opti9xx_names[] = {
 -      "unkown",
 +      "unknown",
        "82C928",       "82C929",
        "82C924",       "82C925",
        "82C930",       "82C931",       "82C933"
@@@ -231,7 -233,10 +233,10 @@@ static int __devinit snd_opti9xx_init(s
        case OPTi9XX_HW_82C931:
        case OPTi9XX_HW_82C933:
                chip->mc_base = (hardware == OPTi9XX_HW_82C930) ? 0xf8f : 0xf8d;
-               chip->mc_indir_index = 0xe0e;
+               if (!chip->mc_indir_index) {
+                       chip->mc_indir_index = 0xe0e;
+                       chip->mc_indir_size = 2;
+               }
                chip->password = 0xe4;
                chip->pwd_reg = 0;
                break;
@@@ -560,57 -565,69 +565,69 @@@ static irqreturn_t snd_opti93x_interrup
  
  #endif /* OPTi93X */
  
- static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
-                                            struct snd_opti9xx *chip)
+ static int __devinit snd_opti9xx_read_check(struct snd_opti9xx *chip)
  {
-       int i, err;
+       unsigned char value;
+ #ifdef OPTi93X
+       unsigned long flags;
+ #endif
  
+       chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size,
+                                          "OPTi9xx MC");
+       if (chip->res_mc_base == NULL)
+               return -EBUSY;
  #ifndef OPTi93X
-       for (i = OPTi9XX_HW_82C928; i < OPTi9XX_HW_82C930; i++) {
-               unsigned char value;
+       value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(1));
+       if (value != 0xff && value != inb(chip->mc_base + OPTi9XX_MC_REG(1)))
+               if (value == snd_opti9xx_read(chip, OPTi9XX_MC_REG(1)))
+                       return 0;
+ #else /* OPTi93X */
+       chip->res_mc_indir = request_region(chip->mc_indir_index,
+                                           chip->mc_indir_size,
+                                           "OPTi93x MC");
+       if (chip->res_mc_indir == NULL)
+               return -EBUSY;
  
-               if ((err = snd_opti9xx_init(chip, i)) < 0)
-                       return err;
+       spin_lock_irqsave(&chip->lock, flags);
+       outb(chip->password, chip->mc_base + chip->pwd_reg);
+       outb(((chip->mc_indir_index & 0x1f0) >> 4), chip->mc_base);
+       spin_unlock_irqrestore(&chip->lock, flags);
  
-               if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL)
-                       continue;
+       value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(7));
+       snd_opti9xx_write(chip, OPTi9XX_MC_REG(7), 0xff - value);
+       if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value)
+               return 0;
  
-               value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(1));
-               if ((value != 0xff) && (value != inb(chip->mc_base + 1)))
-                       if (value == snd_opti9xx_read(chip, OPTi9XX_MC_REG(1)))
-                               return 1;
+       release_and_free_resource(chip->res_mc_indir);
+       chip->res_mc_indir = NULL;
+ #endif        /* OPTi93X */
+       release_and_free_resource(chip->res_mc_base);
+       chip->res_mc_base = NULL;
  
-               release_and_free_resource(chip->res_mc_base);
-               chip->res_mc_base = NULL;
+       return -ENODEV;
+ }
  
-       }
- #else /* OPTi93X */
-       for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
-               unsigned long flags;
-               unsigned char value;
+ static int __devinit snd_card_opti9xx_detect(struct snd_card *card,
+                                            struct snd_opti9xx *chip)
+ {
+       int i, err;
  
-               if ((err = snd_opti9xx_init(chip, i)) < 0)
+ #ifndef OPTi93X
+       for (i = OPTi9XX_HW_82C928; i < OPTi9XX_HW_82C930; i++) {
+ #else
+       for (i = OPTi9XX_HW_82C931; i >= OPTi9XX_HW_82C930; i--) {
+ #endif
+               err = snd_opti9xx_init(chip, i);
+               if (err < 0)
                        return err;
  
-               if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL)
-                       continue;
-               spin_lock_irqsave(&chip->lock, flags);
-               outb(chip->password, chip->mc_base + chip->pwd_reg);
-               outb(((chip->mc_indir_index & (1 << 8)) >> 4) |
-                       ((chip->mc_indir_index & 0xf0) >> 4), chip->mc_base);
-               spin_unlock_irqrestore(&chip->lock, flags);
-               value = snd_opti9xx_read(chip, OPTi9XX_MC_REG(7));
-               snd_opti9xx_write(chip, OPTi9XX_MC_REG(7), 0xff - value);
-               if (snd_opti9xx_read(chip, OPTi9XX_MC_REG(7)) == 0xff - value)
+               err = snd_opti9xx_read_check(chip);
+               if (err == 0)
                        return 1;
-               release_and_free_resource(chip->res_mc_base);
-               chip->res_mc_base = NULL;
+ #ifdef OPTi93X
+               chip->mc_indir_index = 0;
+ #endif
        }
- #endif        /* OPTi93X */
        return -ENODEV;
  }
  
@@@ -639,6 -656,8 +656,8 @@@ static int __devinit snd_card_opti9xx_p
  #ifdef OPTi93X
        port = pnp_port_start(pdev, 0) - 4;
        fm_port = pnp_port_start(pdev, 1) + 8;
+       chip->mc_indir_index = pnp_port_start(pdev, 3) + 2;
+       chip->mc_indir_size = pnp_port_len(pdev, 3) - 2;
  #else
        if (pid->driver_data != 0x0924)
                port = pnp_port_start(pdev, 1);
  static void snd_card_opti9xx_free(struct snd_card *card)
  {
        struct snd_opti9xx *chip = card->private_data;
-         
        if (chip) {
  #ifdef OPTi93X
                struct snd_wss *codec = chip->codec;
                        disable_irq(codec->irq);
                        free_irq(codec->irq, codec);
                }
+               release_and_free_resource(chip->res_mc_indir);
  #endif
                release_and_free_resource(chip->res_mc_base);
        }
@@@ -696,11 -716,6 +716,6 @@@ static int __devinit snd_opti9xx_probe(
        struct snd_rawmidi *rmidi;
        struct snd_hwdep *synth;
  
-       if (! chip->res_mc_base &&
-           (chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size,
-                                               "OPTi9xx MC")) == NULL)
-               return -ENOMEM;
  #if defined(CS4231) || defined(OPTi93X)
        xdma2 = dma2;
  #else
@@@ -954,6 -969,13 +969,13 @@@ static int __devinit snd_opti9xx_pnp_pr
        }
        if (hw <= OPTi9XX_HW_82C930)
                chip->mc_base -= 0x80;
+       error = snd_opti9xx_read_check(chip);
+       if (error) {
+               snd_printk(KERN_ERR "OPTI chip not found\n");
+               snd_card_free(card);
+               return error;
+       }
        snd_card_set_dev(card, &pcard->card->dev);
        if ((error = snd_opti9xx_probe(card)) < 0) {
                snd_card_free(card);
index db4a7367b6259086cf8041bcc0a0e54849759435,deecdd2d5d37de88eb780f21c8c11dd3b6ea503d..888b6313eecad1c7e017db46c5d6ef046795f338
@@@ -208,6 -208,7 +208,7 @@@ enum 
        ALC885_MBP3,
        ALC885_MB5,
        ALC885_IMAC24,
+       ALC885_IMAC91,
        ALC883_3ST_2ch_DIG,
        ALC883_3ST_6ch_DIG,
        ALC883_3ST_6ch,
@@@ -2400,6 -2401,8 +2401,8 @@@ static const char *alc_slave_sws[] = 
        "Speaker Playback Switch",
        "Mono Playback Switch",
        "IEC958 Playback Switch",
+       "Line-Out Playback Switch",
+       "PCM Playback Switch",
        NULL,
  };
  
@@@ -6618,7 -6621,7 +6621,7 @@@ static struct hda_input_mux alc889A_mb3
                /* Front Mic (0x01) unused */
                { "Line", 0x2 },
                /* Line 2 (0x03) unused */
 -              /* CD (0x04) unsused? */
 +              /* CD (0x04) unused? */
        },
  };
  
@@@ -7050,6 -7053,20 +7053,20 @@@ static struct snd_kcontrol_new alc885_m
        { } /* end */
  };
  
+ static struct snd_kcontrol_new alc885_imac91_mixer[] = {
+       HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
+       HDA_BIND_MUTE   ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
+       HDA_CODEC_MUTE  ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
+       HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
+       { } /* end */
+ };
  static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
        HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
@@@ -7505,6 -7522,66 +7522,66 @@@ static struct hda_verb alc885_mbp3_init
        { }
  };
  
+ /* iMac 9,1 */
+ static struct hda_verb alc885_imac91_init_verbs[] = {
+       /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
+       {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       /* Rear mixer */
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       /* HP Pin: output 0 (0x0c) */
+       {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
+       {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
+       {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
+       /* Internal Speakers: output 0 (0x0d) */
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
+       /* Mic (rear) pin: input vref at 80% */
+       {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* Front Mic pin: input vref at 80% */
+       {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* Line In pin: use output 1 when in LineOut mode */
+       {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
+       {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
+       /* FIXME: use matrix-type input source selection */
+       /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
+       /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
+       {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
+       {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
+       {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
+       /* Input mixer2 */
+       {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
+       {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
+       {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
+       /* Input mixer3 */
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
+       {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
+       /* ADC1: mute amp left and right */
+       {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
+       /* ADC2: mute amp left and right */
+       {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
+       /* ADC3: mute amp left and right */
+       {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
+       { }
+ };
  /* iMac 24 mixer. */
  static struct snd_kcontrol_new alc885_imac24_mixer[] = {
        HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
@@@ -7551,6 -7628,26 +7628,26 @@@ static void alc885_mbp3_setup(struct hd
        spec->autocfg.speaker_pins[0] = 0x14;
  }
  
+ static void alc885_imac91_automute(struct hda_codec *codec)
+ {
+       unsigned int present;
+       present = snd_hda_codec_read(codec, 0x14, 0,
+                                    AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
+       snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
+                                HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
+       snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
+                                HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
+ }
+ static void alc885_imac91_unsol_event(struct hda_codec *codec,
+                                   unsigned int res)
+ {
+       /* Headphone insertion or removal. */
+       if ((res >> 26) == ALC880_HP_EVENT)
+               alc885_imac91_automute(codec);
+ }
  
  static struct hda_verb alc882_targa_verbs[] = {
        {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
@@@ -8718,6 -8815,7 +8815,7 @@@ static const char *alc882_models[ALC882
        [ALC885_MB5]            = "mb5",
        [ALC885_MBP3]           = "mbp3",
        [ALC885_IMAC24]         = "imac24",
+       [ALC885_IMAC91]         = "imac91",
        [ALC883_3ST_2ch_DIG]    = "3stack-2ch-dig",
        [ALC883_3ST_6ch_DIG]    = "3stack-6ch-dig",
        [ALC883_3ST_6ch]        = "3stack-6ch",
@@@ -8891,6 -8989,7 +8989,7 @@@ static struct snd_pci_quirk alc882_ssid
        SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
        SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
        SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
+       SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
        SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
        /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
         * so apparently no perfect solution yet
@@@ -9002,6 -9101,20 +9101,20 @@@ static struct alc_config_preset alc882_
                .setup = alc885_imac24_setup,
                .init_hook = alc885_imac24_init_hook,
        },
+       [ALC885_IMAC91] = {
+               .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
+               .init_verbs = { alc885_imac91_init_verbs,
+                               alc880_gpio1_init_verbs },
+               .num_dacs = ARRAY_SIZE(alc882_dac_nids),
+               .dac_nids = alc882_dac_nids,
+               .channel_mode = alc885_mbp_4ch_modes,
+               .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
+               .input_mux = &alc882_capture_source,
+               .dig_out_nid = ALC882_DIGOUT_NID,
+               .dig_in_nid = ALC882_DIGIN_NID,
+               .unsol_event = alc885_imac91_unsol_event,
+               .init_hook = alc885_imac91_automute,
+       },
        [ALC882_TARGA] = {
                .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
                .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
@@@ -9908,10 -10021,12 +10021,12 @@@ static int patch_alc882(struct hda_code
                spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
  
        if (!spec->adc_nids && spec->input_mux) {
-               int i;
+               int i, j;
                spec->num_adc_nids = 0;
                for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
+                       const struct hda_input_mux *imux = spec->input_mux;
                        hda_nid_t cap;
+                       hda_nid_t items[16];
                        hda_nid_t nid = alc882_adc_nids[i];
                        unsigned int wcap = get_wcaps(codec, nid);
                        /* get type */
                        err = snd_hda_get_connections(codec, nid, &cap, 1);
                        if (err < 0)
                                continue;
+                       err = snd_hda_get_connections(codec, cap, items,
+                                                     ARRAY_SIZE(items));
+                       if (err < 0)
+                               continue;
+                       for (j = 0; j < imux->num_items; j++)
+                               if (imux->items[j].index >= err)
+                                       break;
+                       if (j < imux->num_items)
+                               continue;
                        spec->private_capsrc_nids[spec->num_adc_nids] = cap;
                        spec->num_adc_nids++;
                }
@@@ -16846,6 -16970,7 +16970,7 @@@ static struct snd_pci_quirk alc662_cfg_
                                        ALC662_3ST_6ch_DIG),
        SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
                           ALC663_ASUS_H13),
+       SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
        {}
  };