Lines Matching +full:ssc +full:- +full:on

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for AT73C213 16-bit stereo DAC connected to Atmel SSC
5 * Copyright (C) 2006-2007 Atmel Norway
14 #include <linux/dma-mapping.h>
27 #include <linux/atmel-ssc.h>
41 0x00, /* 00 - CTRL */
42 0x05, /* 01 - LLIG */
43 0x05, /* 02 - RLIG */
44 0x08, /* 03 - LPMG */
45 0x08, /* 04 - RPMG */
46 0x00, /* 05 - LLOG */
47 0x00, /* 06 - RLOG */
48 0x22, /* 07 - OLC */
49 0x09, /* 08 - MC */
50 0x00, /* 09 - CSFC */
51 0x00, /* 0A - MISC */
52 0x00, /* 0B - */
53 0x00, /* 0C - PRECH */
54 0x05, /* 0D - AUXG */
55 0x00, /* 0E - */
56 0x00, /* 0F - */
57 0x00, /* 10 - RST */
58 0x00, /* 11 - PA_CTRL */
69 struct ssc_device *ssc; member
75 /* Protect SSC registers against concurrent access. */
81 #define get_chip(card) ((struct snd_at73c213 *)card->private_data)
95 chip->spi_wbuffer[0] = reg; in snd_at73c213_write_reg()
96 chip->spi_wbuffer[1] = val; in snd_at73c213_write_reg()
98 msg_xfer.tx_buf = chip->spi_wbuffer; in snd_at73c213_write_reg()
99 msg_xfer.rx_buf = chip->spi_rbuffer; in snd_at73c213_write_reg()
102 retval = spi_sync(chip->spi, &msg); in snd_at73c213_write_reg()
105 chip->reg_image[reg] = val; in snd_at73c213_write_reg()
115 .rate_min = 8000, /* Replaced by chip->bitrate later. */
116 .rate_max = 50000, /* Replaced by chip->bitrate later. */
119 .buffer_bytes_max = 64 * 1024 - 1,
121 .period_bytes_max = 64 * 1024 - 1,
131 unsigned long ssc_rate = clk_get_rate(chip->ssc->clk); in snd_at73c213_set_bitrate()
146 /* SSC clock / (bitrate * stereo * 16-bit). */ in snd_at73c213_set_bitrate()
150 max_tries = (ssc_div_max - ssc_div_min) / 2; in snd_at73c213_set_bitrate()
159 ssc_div -= 2; in snd_at73c213_set_bitrate()
161 return -ENXIO; in snd_at73c213_set_bitrate()
166 /* SSC clock / (ssc divider * 16-bit * stereo). */ in snd_at73c213_set_bitrate()
168 return -ENXIO; in snd_at73c213_set_bitrate()
173 status = clk_round_rate(chip->board->dac_clk, dac_rate_new); in snd_at73c213_set_bitrate()
182 } while (--max_tries); in snd_at73c213_set_bitrate()
185 return -ENXIO; in snd_at73c213_set_bitrate()
188 status = clk_set_rate(chip->board->dac_clk, status); in snd_at73c213_set_bitrate()
192 /* Set divider in SSC device. */ in snd_at73c213_set_bitrate()
193 ssc_writel(chip->ssc->regs, CMR, ssc_div/2); in snd_at73c213_set_bitrate()
195 /* SSC clock / (ssc divider * 16-bit * stereo). */ in snd_at73c213_set_bitrate()
196 chip->bitrate = ssc_rate / (ssc_div * 16 * 2); in snd_at73c213_set_bitrate()
198 dev_info(&chip->spi->dev, in snd_at73c213_set_bitrate()
200 chip->bitrate, ssc_div); in snd_at73c213_set_bitrate()
208 struct snd_pcm_runtime *runtime = substream->runtime; in snd_at73c213_pcm_open()
216 snd_at73c213_playback_hw.rate_min = chip->bitrate; in snd_at73c213_pcm_open()
217 snd_at73c213_playback_hw.rate_max = chip->bitrate; in snd_at73c213_pcm_open()
218 runtime->hw = snd_at73c213_playback_hw; in snd_at73c213_pcm_open()
219 chip->substream = substream; in snd_at73c213_pcm_open()
221 err = clk_enable(chip->ssc->clk); in snd_at73c213_pcm_open()
231 chip->substream = NULL; in snd_at73c213_pcm_close()
232 clk_disable(chip->ssc->clk); in snd_at73c213_pcm_close()
243 val = ssc_readl(chip->ssc->regs, TFMR); in snd_at73c213_pcm_hw_params()
244 val = SSC_BFINS(TFMR_DATNB, channels - 1, val); in snd_at73c213_pcm_hw_params()
245 ssc_writel(chip->ssc->regs, TFMR, val); in snd_at73c213_pcm_hw_params()
253 struct snd_pcm_runtime *runtime = substream->runtime; in snd_at73c213_pcm_prepare()
256 block_size = frames_to_bytes(runtime, runtime->period_size); in snd_at73c213_pcm_prepare()
258 chip->period = 0; in snd_at73c213_pcm_prepare()
260 ssc_writel(chip->ssc->regs, PDC_TPR, in snd_at73c213_pcm_prepare()
261 (long)runtime->dma_addr); in snd_at73c213_pcm_prepare()
262 ssc_writel(chip->ssc->regs, PDC_TCR, in snd_at73c213_pcm_prepare()
263 runtime->period_size * runtime->channels); in snd_at73c213_pcm_prepare()
264 ssc_writel(chip->ssc->regs, PDC_TNPR, in snd_at73c213_pcm_prepare()
265 (long)runtime->dma_addr + block_size); in snd_at73c213_pcm_prepare()
266 ssc_writel(chip->ssc->regs, PDC_TNCR, in snd_at73c213_pcm_prepare()
267 runtime->period_size * runtime->channels); in snd_at73c213_pcm_prepare()
278 spin_lock(&chip->lock); in snd_at73c213_pcm_trigger()
282 ssc_writel(chip->ssc->regs, IER, SSC_BIT(IER_ENDTX)); in snd_at73c213_pcm_trigger()
283 ssc_writel(chip->ssc->regs, PDC_PTCR, SSC_BIT(PDC_PTCR_TXTEN)); in snd_at73c213_pcm_trigger()
286 ssc_writel(chip->ssc->regs, PDC_PTCR, SSC_BIT(PDC_PTCR_TXTDIS)); in snd_at73c213_pcm_trigger()
287 ssc_writel(chip->ssc->regs, IDR, SSC_BIT(IDR_ENDTX)); in snd_at73c213_pcm_trigger()
290 dev_dbg(&chip->spi->dev, "spurious command %x\n", cmd); in snd_at73c213_pcm_trigger()
291 retval = -EINVAL; in snd_at73c213_pcm_trigger()
295 spin_unlock(&chip->lock); in snd_at73c213_pcm_trigger()
304 struct snd_pcm_runtime *runtime = substream->runtime; in snd_at73c213_pcm_pointer()
308 bytes = ssc_readl(chip->ssc->regs, PDC_TPR) in snd_at73c213_pcm_pointer()
309 - (unsigned long)runtime->dma_addr; in snd_at73c213_pcm_pointer()
312 if (pos >= runtime->buffer_size) in snd_at73c213_pcm_pointer()
313 pos -= runtime->buffer_size; in snd_at73c213_pcm_pointer()
332 retval = snd_pcm_new(chip->card, chip->card->shortname, in snd_at73c213_pcm_new()
337 pcm->private_data = chip; in snd_at73c213_pcm_new()
338 pcm->info_flags = SNDRV_PCM_INFO_BLOCK_TRANSFER; in snd_at73c213_pcm_new()
339 strcpy(pcm->name, "at73c213"); in snd_at73c213_pcm_new()
340 chip->pcm = pcm; in snd_at73c213_pcm_new()
344 snd_pcm_set_managed_buffer_all(chip->pcm, in snd_at73c213_pcm_new()
345 SNDRV_DMA_TYPE_DEV, &chip->ssc->pdev->dev, in snd_at73c213_pcm_new()
354 struct snd_pcm_runtime *runtime = chip->substream->runtime; in snd_at73c213_interrupt()
361 spin_lock(&chip->lock); in snd_at73c213_interrupt()
363 block_size = frames_to_bytes(runtime, runtime->period_size); in snd_at73c213_interrupt()
364 status = ssc_readl(chip->ssc->regs, IMR); in snd_at73c213_interrupt()
367 chip->period++; in snd_at73c213_interrupt()
368 if (chip->period == runtime->periods) in snd_at73c213_interrupt()
369 chip->period = 0; in snd_at73c213_interrupt()
370 next_period = chip->period + 1; in snd_at73c213_interrupt()
371 if (next_period == runtime->periods) in snd_at73c213_interrupt()
376 ssc_writel(chip->ssc->regs, PDC_TNPR, in snd_at73c213_interrupt()
377 (long)runtime->dma_addr + offset); in snd_at73c213_interrupt()
378 ssc_writel(chip->ssc->regs, PDC_TNCR, in snd_at73c213_interrupt()
379 runtime->period_size * runtime->channels); in snd_at73c213_interrupt()
383 ssc_readl(chip->ssc->regs, IMR); in snd_at73c213_interrupt()
384 spin_unlock(&chip->lock); in snd_at73c213_interrupt()
387 snd_pcm_period_elapsed(chip->substream); in snd_at73c213_interrupt()
399 int reg = kcontrol->private_value & 0xff; in snd_at73c213_mono_get()
400 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_mono_get()
401 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_at73c213_mono_get()
402 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_mono_get()
404 mutex_lock(&chip->mixer_lock); in snd_at73c213_mono_get()
406 ucontrol->value.integer.value[0] = in snd_at73c213_mono_get()
407 (chip->reg_image[reg] >> shift) & mask; in snd_at73c213_mono_get()
410 ucontrol->value.integer.value[0] = in snd_at73c213_mono_get()
411 mask - ucontrol->value.integer.value[0]; in snd_at73c213_mono_get()
413 mutex_unlock(&chip->mixer_lock); in snd_at73c213_mono_get()
422 int reg = kcontrol->private_value & 0xff; in snd_at73c213_mono_put()
423 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_mono_put()
424 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_at73c213_mono_put()
425 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_mono_put()
429 val = (ucontrol->value.integer.value[0] & mask); in snd_at73c213_mono_put()
431 val = mask - val; in snd_at73c213_mono_put()
434 mutex_lock(&chip->mixer_lock); in snd_at73c213_mono_put()
436 val = (chip->reg_image[reg] & ~(mask << shift)) | val; in snd_at73c213_mono_put()
437 change = val != chip->reg_image[reg]; in snd_at73c213_mono_put()
440 mutex_unlock(&chip->mixer_lock); in snd_at73c213_mono_put()
451 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_stereo_info()
454 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_at73c213_stereo_info()
456 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_at73c213_stereo_info()
458 uinfo->count = 2; in snd_at73c213_stereo_info()
459 uinfo->value.integer.min = 0; in snd_at73c213_stereo_info()
460 uinfo->value.integer.max = mask; in snd_at73c213_stereo_info()
469 int left_reg = kcontrol->private_value & 0xff; in snd_at73c213_stereo_get()
470 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_stereo_get()
471 int shift_left = (kcontrol->private_value >> 16) & 0x07; in snd_at73c213_stereo_get()
472 int shift_right = (kcontrol->private_value >> 19) & 0x07; in snd_at73c213_stereo_get()
473 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_stereo_get()
474 int invert = (kcontrol->private_value >> 22) & 1; in snd_at73c213_stereo_get()
476 mutex_lock(&chip->mixer_lock); in snd_at73c213_stereo_get()
478 ucontrol->value.integer.value[0] = in snd_at73c213_stereo_get()
479 (chip->reg_image[left_reg] >> shift_left) & mask; in snd_at73c213_stereo_get()
480 ucontrol->value.integer.value[1] = in snd_at73c213_stereo_get()
481 (chip->reg_image[right_reg] >> shift_right) & mask; in snd_at73c213_stereo_get()
484 ucontrol->value.integer.value[0] = in snd_at73c213_stereo_get()
485 mask - ucontrol->value.integer.value[0]; in snd_at73c213_stereo_get()
486 ucontrol->value.integer.value[1] = in snd_at73c213_stereo_get()
487 mask - ucontrol->value.integer.value[1]; in snd_at73c213_stereo_get()
490 mutex_unlock(&chip->mixer_lock); in snd_at73c213_stereo_get()
499 int left_reg = kcontrol->private_value & 0xff; in snd_at73c213_stereo_put()
500 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_stereo_put()
501 int shift_left = (kcontrol->private_value >> 16) & 0x07; in snd_at73c213_stereo_put()
502 int shift_right = (kcontrol->private_value >> 19) & 0x07; in snd_at73c213_stereo_put()
503 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_stereo_put()
504 int invert = (kcontrol->private_value >> 22) & 1; in snd_at73c213_stereo_put()
508 val1 = ucontrol->value.integer.value[0] & mask; in snd_at73c213_stereo_put()
509 val2 = ucontrol->value.integer.value[1] & mask; in snd_at73c213_stereo_put()
511 val1 = mask - val1; in snd_at73c213_stereo_put()
512 val2 = mask - val2; in snd_at73c213_stereo_put()
517 mutex_lock(&chip->mixer_lock); in snd_at73c213_stereo_put()
519 val1 = (chip->reg_image[left_reg] & ~(mask << shift_left)) | val1; in snd_at73c213_stereo_put()
520 val2 = (chip->reg_image[right_reg] & ~(mask << shift_right)) | val2; in snd_at73c213_stereo_put()
521 change = val1 != chip->reg_image[left_reg] in snd_at73c213_stereo_put()
522 || val2 != chip->reg_image[right_reg]; in snd_at73c213_stereo_put()
525 mutex_unlock(&chip->mixer_lock); in snd_at73c213_stereo_put()
530 mutex_unlock(&chip->mixer_lock); in snd_at73c213_stereo_put()
534 mutex_unlock(&chip->mixer_lock); in snd_at73c213_stereo_put()
548 int reg = kcontrol->private_value & 0xff; in snd_at73c213_mono_switch_get()
549 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_mono_switch_get()
550 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_mono_switch_get()
552 mutex_lock(&chip->mixer_lock); in snd_at73c213_mono_switch_get()
554 ucontrol->value.integer.value[0] = in snd_at73c213_mono_switch_get()
555 (chip->reg_image[reg] >> shift) & 0x01; in snd_at73c213_mono_switch_get()
558 ucontrol->value.integer.value[0] = in snd_at73c213_mono_switch_get()
559 0x01 - ucontrol->value.integer.value[0]; in snd_at73c213_mono_switch_get()
561 mutex_unlock(&chip->mixer_lock); in snd_at73c213_mono_switch_get()
570 int reg = kcontrol->private_value & 0xff; in snd_at73c213_mono_switch_put()
571 int shift = (kcontrol->private_value >> 8) & 0xff; in snd_at73c213_mono_switch_put()
572 int mask = (kcontrol->private_value >> 16) & 0xff; in snd_at73c213_mono_switch_put()
573 int invert = (kcontrol->private_value >> 24) & 0xff; in snd_at73c213_mono_switch_put()
577 if (ucontrol->value.integer.value[0]) in snd_at73c213_mono_switch_put()
583 val = mask - val; in snd_at73c213_mono_switch_put()
586 mutex_lock(&chip->mixer_lock); in snd_at73c213_mono_switch_put()
588 val |= (chip->reg_image[reg] & ~(mask << shift)); in snd_at73c213_mono_switch_put()
589 change = val != chip->reg_image[reg]; in snd_at73c213_mono_switch_put()
593 mutex_unlock(&chip->mixer_lock); in snd_at73c213_mono_switch_put()
604 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_at73c213_pa_volume_info()
605 uinfo->count = 1; in snd_at73c213_pa_volume_info()
606 uinfo->value.integer.min = 0; in snd_at73c213_pa_volume_info()
607 uinfo->value.integer.max = ((kcontrol->private_value >> 16) & 0xff) - 1; in snd_at73c213_pa_volume_info()
616 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_at73c213_line_capture_volume_info()
617 uinfo->count = 2; in snd_at73c213_line_capture_volume_info()
619 uinfo->value.integer.min = 14; in snd_at73c213_line_capture_volume_info()
620 uinfo->value.integer.max = 31; in snd_at73c213_line_capture_volume_info()
629 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_at73c213_aux_capture_volume_info()
630 uinfo->count = 1; in snd_at73c213_aux_capture_volume_info()
632 uinfo->value.integer.min = 14; in snd_at73c213_aux_capture_volume_info()
633 uinfo->value.integer.max = 31; in snd_at73c213_aux_capture_volume_info()
711 if (chip == NULL || chip->pcm == NULL) in snd_at73c213_mixer()
712 return -EINVAL; in snd_at73c213_mixer()
714 card = chip->card; in snd_at73c213_mixer()
716 strcpy(card->mixername, chip->pcm->name); in snd_at73c213_mixer()
741 * Starts on falling TF. in snd_at73c213_ssc_init()
743 * Periode is 16 bit (16 - 1). in snd_at73c213_ssc_init()
745 ssc_writel(chip->ssc->regs, TCMR, in snd_at73c213_ssc_init()
749 | SSC_BF(TCMR_PERIOD, 16 - 1)); in snd_at73c213_ssc_init()
751 * Data length is 16 bit (16 - 1). in snd_at73c213_ssc_init()
754 * Frame sync length is 16 bit (16 - 1). in snd_at73c213_ssc_init()
755 * Frame starts on negative pulse. in snd_at73c213_ssc_init()
757 ssc_writel(chip->ssc->regs, TFMR, in snd_at73c213_ssc_init()
758 SSC_BF(TFMR_DATLEN, 16 - 1) in snd_at73c213_ssc_init()
761 | SSC_BF(TFMR_FSLEN, 16 - 1) in snd_at73c213_ssc_init()
777 retval = clk_enable(chip->board->dac_clk); in snd_at73c213_chip_init()
781 /* Initialize at73c213 on SPI bus. */ in snd_at73c213_chip_init()
812 /* Stop precharging DAC, turn on master power. */ in snd_at73c213_chip_init()
819 /* Turn on DAC. */ in snd_at73c213_chip_init()
851 ssc_writel(chip->ssc->regs, CR, SSC_BIT(CR_TXEN)); in snd_at73c213_chip_init()
856 clk_disable(chip->board->dac_clk); in snd_at73c213_chip_init()
863 struct snd_at73c213 *chip = device->device_data; in snd_at73c213_dev_free()
865 ssc_writel(chip->ssc->regs, CR, SSC_BIT(CR_TXDIS)); in snd_at73c213_dev_free()
866 if (chip->irq >= 0) { in snd_at73c213_dev_free()
867 free_irq(chip->irq, chip); in snd_at73c213_dev_free()
868 chip->irq = -1; in snd_at73c213_dev_free()
883 irq = chip->ssc->irq; in snd_at73c213_dev_init()
887 spin_lock_init(&chip->lock); in snd_at73c213_dev_init()
888 mutex_init(&chip->mixer_lock); in snd_at73c213_dev_init()
889 chip->card = card; in snd_at73c213_dev_init()
890 chip->irq = -1; in snd_at73c213_dev_init()
892 retval = clk_enable(chip->ssc->clk); in snd_at73c213_dev_init()
898 dev_dbg(&chip->spi->dev, "unable to request irq %d\n", irq); in snd_at73c213_dev_init()
901 chip->irq = irq; in snd_at73c213_dev_init()
903 memcpy(&chip->reg_image, &snd_at73c213_original_image, in snd_at73c213_dev_init()
931 free_irq(chip->irq, chip); in snd_at73c213_dev_init()
932 chip->irq = -1; in snd_at73c213_dev_init()
934 clk_disable(chip->ssc->clk); in snd_at73c213_dev_init()
947 board = spi->dev.platform_data; in snd_at73c213_probe()
949 dev_dbg(&spi->dev, "no platform_data\n"); in snd_at73c213_probe()
950 return -ENXIO; in snd_at73c213_probe()
953 if (!board->dac_clk) { in snd_at73c213_probe()
954 dev_dbg(&spi->dev, "no DAC clk\n"); in snd_at73c213_probe()
955 return -ENXIO; in snd_at73c213_probe()
958 if (IS_ERR(board->dac_clk)) { in snd_at73c213_probe()
959 dev_dbg(&spi->dev, "no DAC clk\n"); in snd_at73c213_probe()
960 return PTR_ERR(board->dac_clk); in snd_at73c213_probe()
964 snprintf(id, sizeof id, "at73c213_%d", board->ssc_id); in snd_at73c213_probe()
965 retval = snd_card_new(&spi->dev, -1, id, THIS_MODULE, in snd_at73c213_probe()
970 chip = card->private_data; in snd_at73c213_probe()
971 chip->spi = spi; in snd_at73c213_probe()
972 chip->board = board; in snd_at73c213_probe()
974 chip->ssc = ssc_request(board->ssc_id); in snd_at73c213_probe()
975 if (IS_ERR(chip->ssc)) { in snd_at73c213_probe()
976 dev_dbg(&spi->dev, "could not get ssc%d device\n", in snd_at73c213_probe()
977 board->ssc_id); in snd_at73c213_probe()
978 retval = PTR_ERR(chip->ssc); in snd_at73c213_probe()
986 strcpy(card->driver, "at73c213"); in snd_at73c213_probe()
987 strcpy(card->shortname, board->shortname); in snd_at73c213_probe()
988 sprintf(card->longname, "%s on irq %d", card->shortname, chip->irq); in snd_at73c213_probe()
994 dev_set_drvdata(&spi->dev, card); in snd_at73c213_probe()
999 ssc_free(chip->ssc); in snd_at73c213_probe()
1008 struct snd_card *card = dev_get_drvdata(&spi->dev); in snd_at73c213_remove()
1009 struct snd_at73c213 *chip = card->private_data; in snd_at73c213_remove()
1013 retval = clk_enable(chip->ssc->clk); in snd_at73c213_remove()
1016 ssc_writel(chip->ssc->regs, CR, SSC_BIT(CR_TXDIS)); in snd_at73c213_remove()
1017 clk_disable(chip->ssc->clk); in snd_at73c213_remove()
1044 chip->reg_image[PA_CTRL] | 0x0f); in snd_at73c213_remove()
1069 clk_disable(chip->board->dac_clk); in snd_at73c213_remove()
1071 ssc_free(chip->ssc); in snd_at73c213_remove()
1078 struct snd_at73c213 *chip = card->private_data; in snd_at73c213_suspend()
1080 ssc_writel(chip->ssc->regs, CR, SSC_BIT(CR_TXDIS)); in snd_at73c213_suspend()
1081 clk_disable(chip->ssc->clk); in snd_at73c213_suspend()
1082 clk_disable(chip->board->dac_clk); in snd_at73c213_suspend()
1090 struct snd_at73c213 *chip = card->private_data; in snd_at73c213_resume()
1093 retval = clk_enable(chip->board->dac_clk); in snd_at73c213_resume()
1096 retval = clk_enable(chip->ssc->clk); in snd_at73c213_resume()
1098 clk_disable(chip->board->dac_clk); in snd_at73c213_resume()
1101 ssc_writel(chip->ssc->regs, CR, SSC_BIT(CR_TXEN)); in snd_at73c213_resume()
1120 MODULE_AUTHOR("Hans-Christian Egtvedt <egtvedt@samfundet.no>");
1121 MODULE_DESCRIPTION("Sound driver for AT73C213 with Atmel SSC");