diff options
Diffstat (limited to 'sound')
413 files changed, 23360 insertions, 18267 deletions
diff --git a/sound/ac97/Kconfig b/sound/ac97/Kconfig index f8a64e15e5bf..baa5f8ef89d2 100644 --- a/sound/ac97/Kconfig +++ b/sound/ac97/Kconfig @@ -5,7 +5,6 @@ config AC97_BUS_NEW tristate - select AC97 help This is the new AC97 bus type, successor of AC97_BUS. The ported drivers which benefit from the AC97 automatic probing should "select" diff --git a/sound/core/control.c b/sound/core/control.c index 0b3026d937b1..8a77620a3854 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -889,7 +889,7 @@ static int snd_ctl_elem_read(struct snd_card *card, index_offset = snd_ctl_get_ioff(kctl, &control->id); vd = &kctl->vd[index_offset]; - if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) && kctl->get == NULL) + if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_READ) || kctl->get == NULL) return -EPERM; snd_ctl_build_ioff(&control->id, kctl, index_offset); diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index b044c0a5a674..02298c9c6020 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -1762,10 +1762,9 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file) return -ENOMEM; _snd_pcm_hw_params_any(params); err = snd_pcm_hw_refine(substream, params); - format_mask = hw_param_mask_c(params, SNDRV_PCM_HW_PARAM_FORMAT); - kfree(params); if (err < 0) - return err; + goto error; + format_mask = hw_param_mask_c(params, SNDRV_PCM_HW_PARAM_FORMAT); for (fmt = 0; fmt < 32; ++fmt) { if (snd_mask_test(format_mask, fmt)) { int f = snd_pcm_oss_format_to(fmt); @@ -1773,7 +1772,10 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file) formats |= f; } } - return formats; + + error: + kfree(params); + return err < 0 ? err : formats; } static int snd_pcm_oss_set_format(struct snd_pcm_oss_file *pcm_oss_file, int format) diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index 60db32785f62..61a07fe34cd2 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -255,12 +255,12 @@ static int seq_free_client1(struct snd_seq_client *client) if (!client) return 0; - snd_seq_delete_all_ports(client); - snd_seq_queue_client_leave(client->number); spin_lock_irqsave(&clients_lock, flags); clienttablock[client->number] = 1; clienttab[client->number] = NULL; spin_unlock_irqrestore(&clients_lock, flags); + snd_seq_delete_all_ports(client); + snd_seq_queue_client_leave(client->number); snd_use_lock_sync(&client->use_lock); snd_seq_queue_client_termination(client->number); if (client->pool) @@ -910,7 +910,8 @@ int snd_seq_dispatch_event(struct snd_seq_event_cell *cell, int atomic, int hop) static int snd_seq_client_enqueue_event(struct snd_seq_client *client, struct snd_seq_event *event, struct file *file, int blocking, - int atomic, int hop) + int atomic, int hop, + struct mutex *mutexp) { struct snd_seq_event_cell *cell; int err; @@ -948,7 +949,8 @@ static int snd_seq_client_enqueue_event(struct snd_seq_client *client, return -ENXIO; /* queue is not allocated */ /* allocate an event cell */ - err = snd_seq_event_dup(client->pool, event, &cell, !blocking || atomic, file); + err = snd_seq_event_dup(client->pool, event, &cell, !blocking || atomic, + file, mutexp); if (err < 0) return err; @@ -1003,7 +1005,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, { struct snd_seq_client *client = file->private_data; int written = 0, len; - int err = -EINVAL; + int err; struct snd_seq_event event; if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) @@ -1017,12 +1019,15 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, return -ENXIO; /* allocate the pool now if the pool is not allocated yet */ + mutex_lock(&client->ioctl_mutex); if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { - if (snd_seq_pool_init(client->pool) < 0) - return -ENOMEM; + err = snd_seq_pool_init(client->pool); + if (err < 0) + goto out; } /* only process whole events */ + err = -EINVAL; while (count >= sizeof(struct snd_seq_event)) { /* Read in the event header from the user */ len = sizeof(event); @@ -1069,7 +1074,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, /* ok, enqueue it */ err = snd_seq_client_enqueue_event(client, &event, file, !(file->f_flags & O_NONBLOCK), - 0, 0); + 0, 0, &client->ioctl_mutex); if (err < 0) break; @@ -1080,6 +1085,8 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, written += len; } + out: + mutex_unlock(&client->ioctl_mutex); return written ? written : err; } @@ -1834,9 +1841,11 @@ static int snd_seq_ioctl_set_client_pool(struct snd_seq_client *client, (! snd_seq_write_pool_allocated(client) || info->output_pool != client->pool->size)) { if (snd_seq_write_pool_allocated(client)) { + /* is the pool in use? */ + if (atomic_read(&client->pool->counter)) + return -EBUSY; /* remove all existing cells */ snd_seq_pool_mark_closing(client->pool); - snd_seq_queue_client_leave_cells(client->number); snd_seq_pool_done(client->pool); } client->pool->size = info->output_pool; @@ -2256,7 +2265,8 @@ static int kernel_client_enqueue(int client, struct snd_seq_event *ev, if (! cptr->accept_output) result = -EPERM; else /* send it */ - result = snd_seq_client_enqueue_event(cptr, ev, file, blocking, atomic, hop); + result = snd_seq_client_enqueue_event(cptr, ev, file, blocking, + atomic, hop, NULL); snd_seq_client_unlock(cptr); return result; diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c index a8c2822e0198..72c0302a55d2 100644 --- a/sound/core/seq/seq_fifo.c +++ b/sound/core/seq/seq_fifo.c @@ -125,7 +125,7 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f, return -EINVAL; snd_use_lock_use(&f->use_lock); - err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL); /* always non-blocking */ + err = snd_seq_event_dup(f->pool, event, &cell, 1, NULL, NULL); /* always non-blocking */ if (err < 0) { if ((err == -ENOMEM) || (err == -EAGAIN)) atomic_inc(&f->overflow); diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c index f763682584a8..ab1112e90f88 100644 --- a/sound/core/seq/seq_memory.c +++ b/sound/core/seq/seq_memory.c @@ -220,7 +220,8 @@ void snd_seq_cell_free(struct snd_seq_event_cell * cell) */ static int snd_seq_cell_alloc(struct snd_seq_pool *pool, struct snd_seq_event_cell **cellp, - int nonblock, struct file *file) + int nonblock, struct file *file, + struct mutex *mutexp) { struct snd_seq_event_cell *cell; unsigned long flags; @@ -244,7 +245,11 @@ static int snd_seq_cell_alloc(struct snd_seq_pool *pool, set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&pool->output_sleep, &wait); spin_unlock_irq(&pool->lock); + if (mutexp) + mutex_unlock(mutexp); schedule(); + if (mutexp) + mutex_lock(mutexp); spin_lock_irq(&pool->lock); remove_wait_queue(&pool->output_sleep, &wait); /* interrupted? */ @@ -287,7 +292,7 @@ __error: */ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, struct snd_seq_event_cell **cellp, int nonblock, - struct file *file) + struct file *file, struct mutex *mutexp) { int ncells, err; unsigned int extlen; @@ -304,7 +309,7 @@ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, if (ncells >= pool->total_elements) return -ENOMEM; - err = snd_seq_cell_alloc(pool, &cell, nonblock, file); + err = snd_seq_cell_alloc(pool, &cell, nonblock, file, mutexp); if (err < 0) return err; @@ -330,7 +335,8 @@ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, int size = sizeof(struct snd_seq_event); if (len < size) size = len; - err = snd_seq_cell_alloc(pool, &tmp, nonblock, file); + err = snd_seq_cell_alloc(pool, &tmp, nonblock, file, + mutexp); if (err < 0) goto __error; if (cell->event.data.ext.ptr == NULL) diff --git a/sound/core/seq/seq_memory.h b/sound/core/seq/seq_memory.h index 32f959c17786..3abe306c394a 100644 --- a/sound/core/seq/seq_memory.h +++ b/sound/core/seq/seq_memory.h @@ -66,7 +66,8 @@ struct snd_seq_pool { void snd_seq_cell_free(struct snd_seq_event_cell *cell); int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event, - struct snd_seq_event_cell **cellp, int nonblock, struct file *file); + struct snd_seq_event_cell **cellp, int nonblock, + struct file *file, struct mutex *mutexp); /* return number of unused (free) cells */ static inline int snd_seq_unused_cells(struct snd_seq_pool *pool) diff --git a/sound/core/seq/seq_prioq.c b/sound/core/seq/seq_prioq.c index bc1c8488fc2a..2bc6759e4adc 100644 --- a/sound/core/seq/seq_prioq.c +++ b/sound/core/seq/seq_prioq.c @@ -87,7 +87,7 @@ void snd_seq_prioq_delete(struct snd_seq_prioq **fifo) if (f->cells > 0) { /* drain prioQ */ while (f->cells > 0) - snd_seq_cell_free(snd_seq_prioq_cell_out(f)); + snd_seq_cell_free(snd_seq_prioq_cell_out(f, NULL)); } kfree(f); @@ -214,8 +214,18 @@ int snd_seq_prioq_cell_in(struct snd_seq_prioq * f, return 0; } +/* return 1 if the current time >= event timestamp */ +static int event_is_ready(struct snd_seq_event *ev, void *current_time) +{ + if ((ev->flags & SNDRV_SEQ_TIME_STAMP_MASK) == SNDRV_SEQ_TIME_STAMP_TICK) + return snd_seq_compare_tick_time(current_time, &ev->time.tick); + else + return snd_seq_compare_real_time(current_time, &ev->time.time); +} + /* dequeue cell from prioq */ -struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f) +struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f, + void *current_time) { struct snd_seq_event_cell *cell; unsigned long flags; @@ -227,6 +237,8 @@ struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f) spin_lock_irqsave(&f->lock, flags); cell = f->head; + if (cell && current_time && !event_is_ready(&cell->event, current_time)) + cell = NULL; if (cell) { f->head = cell->next; @@ -252,18 +264,6 @@ int snd_seq_prioq_avail(struct snd_seq_prioq * f) return f->cells; } - -/* peek at cell at the head of the prioq */ -struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq * f) -{ - if (f == NULL) { - pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n"); - return NULL; - } - return f->head; -} - - static inline int prioq_match(struct snd_seq_event_cell *cell, int client, int timestamp) { diff --git a/sound/core/seq/seq_prioq.h b/sound/core/seq/seq_prioq.h index d38bb78d9345..2c315ca10fc4 100644 --- a/sound/core/seq/seq_prioq.h +++ b/sound/core/seq/seq_prioq.h @@ -44,14 +44,12 @@ void snd_seq_prioq_delete(struct snd_seq_prioq **fifo); int snd_seq_prioq_cell_in(struct snd_seq_prioq *f, struct snd_seq_event_cell *cell); /* dequeue cell from prioq */ -struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f); +struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f, + void *current_time); /* return number of events available in prioq */ int snd_seq_prioq_avail(struct snd_seq_prioq *f); -/* peek at cell at the head of the prioq */ -struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq *f); - /* client left queue */ void snd_seq_prioq_leave(struct snd_seq_prioq *f, int client, int timestamp); diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c index 0428e9061b47..b377f5048352 100644 --- a/sound/core/seq/seq_queue.c +++ b/sound/core/seq/seq_queue.c @@ -277,30 +277,20 @@ void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) __again: /* Process tick queue... */ - while ((cell = snd_seq_prioq_cell_peek(q->tickq)) != NULL) { - if (snd_seq_compare_tick_time(&q->timer->tick.cur_tick, - &cell->event.time.tick)) { - cell = snd_seq_prioq_cell_out(q->tickq); - if (cell) - snd_seq_dispatch_event(cell, atomic, hop); - } else { - /* event remains in the queue */ + for (;;) { + cell = snd_seq_prioq_cell_out(q->tickq, + &q->timer->tick.cur_tick); + if (!cell) break; - } + snd_seq_dispatch_event(cell, atomic, hop); } - /* Process time queue... */ - while ((cell = snd_seq_prioq_cell_peek(q->timeq)) != NULL) { - if (snd_seq_compare_real_time(&q->timer->cur_time, - &cell->event.time.time)) { - cell = snd_seq_prioq_cell_out(q->timeq); - if (cell) - snd_seq_dispatch_event(cell, atomic, hop); - } else { - /* event remains in the queue */ + for (;;) { + cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time); + if (!cell) break; - } + snd_seq_dispatch_event(cell, atomic, hop); } /* free lock */ diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c index 0333143a1fa7..1063a4377502 100644 --- a/sound/drivers/aloop.c +++ b/sound/drivers/aloop.c @@ -192,6 +192,11 @@ static inline void loopback_timer_stop(struct loopback_pcm *dpcm) dpcm->timer.expires = 0; } +static inline void loopback_timer_stop_sync(struct loopback_pcm *dpcm) +{ + del_timer_sync(&dpcm->timer); +} + #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) #define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE) #define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE) @@ -326,6 +331,8 @@ static int loopback_prepare(struct snd_pcm_substream *substream) struct loopback_cable *cable = dpcm->cable; int bps, salign; + loopback_timer_stop_sync(dpcm); + salign = (snd_pcm_format_width(runtime->format) * runtime->channels) / 8; bps = salign * runtime->rate; @@ -659,7 +666,9 @@ static void free_cable(struct snd_pcm_substream *substream) return; if (cable->streams[!substream->stream]) { /* other stream is still alive */ + spin_lock_irq(&cable->lock); cable->streams[substream->stream] = NULL; + spin_unlock_irq(&cable->lock); } else { /* free the cable */ loopback->cables[substream->number][dev] = NULL; @@ -698,7 +707,6 @@ static int loopback_open(struct snd_pcm_substream *substream) loopback->cables[substream->number][dev] = cable; } dpcm->cable = cable; - cable->streams[substream->stream] = dpcm; snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); @@ -730,6 +738,11 @@ static int loopback_open(struct snd_pcm_substream *substream) runtime->hw = loopback_pcm_hardware; else runtime->hw = cable->hw; + + spin_lock_irq(&cable->lock); + cable->streams[substream->stream] = dpcm; + spin_unlock_irq(&cable->lock); + unlock: if (err < 0) { free_cable(substream); @@ -744,7 +757,7 @@ static int loopback_close(struct snd_pcm_substream *substream) struct loopback *loopback = substream->private_data; struct loopback_pcm *dpcm = substream->runtime->private_data; - loopback_timer_stop(dpcm); + loopback_timer_stop_sync(dpcm); mutex_lock(&loopback->cable_lock); free_cable(substream); mutex_unlock(&loopback->cable_lock); diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c index 06f845e293cb..7ba100bb1c3f 100644 --- a/sound/hda/hdac_device.c +++ b/sound/hda/hdac_device.c @@ -3,6 +3,7 @@ */ #include <linux/init.h> +#include <linux/delay.h> #include <linux/device.h> #include <linux/slab.h> #include <linux/module.h> @@ -1064,3 +1065,37 @@ bool snd_hdac_check_power_state(struct hdac_device *hdac, return (state == target_state); } EXPORT_SYMBOL_GPL(snd_hdac_check_power_state); +/** + * snd_hdac_sync_power_state - wait until actual power state matches + * with the target state + * + * @hdac: the HDAC device + * @nid: NID to send the command + * @target_state: target state to check for + * + * Return power state or PS_ERROR if codec rejects GET verb. + */ +unsigned int snd_hdac_sync_power_state(struct hdac_device *codec, + hda_nid_t nid, unsigned int power_state) +{ + unsigned long end_time = jiffies + msecs_to_jiffies(500); + unsigned int state, actual_state, count; + + for (count = 0; count < 500; count++) { + state = snd_hdac_codec_read(codec, nid, 0, + AC_VERB_GET_POWER_STATE, 0); + if (state & AC_PWRST_ERROR) { + msleep(20); + break; + } + actual_state = (state >> 4) & 0x0f; + if (actual_state == power_state) + break; + if (time_after_eq(jiffies, end_time)) + break; + /* wait until the codec reachs to the target state */ + msleep(1); + } + return state; +} +EXPORT_SYMBOL_GPL(snd_hdac_sync_power_state); diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index e018ecbf78a8..5bc3a7468e17 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -2702,32 +2702,6 @@ void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg, } EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all); -/* - * wait until the state is reached, returns the current state - */ -static unsigned int hda_sync_power_state(struct hda_codec *codec, - hda_nid_t fg, - unsigned int power_state) -{ - unsigned long end_time = jiffies + msecs_to_jiffies(500); - unsigned int state, actual_state; - - for (;;) { - state = snd_hda_codec_read(codec, fg, 0, - AC_VERB_GET_POWER_STATE, 0); - if (state & AC_PWRST_ERROR) - break; - actual_state = (state >> 4) & 0x0f; - if (actual_state == power_state) - break; - if (time_after_eq(jiffies, end_time)) - break; - /* wait until the codec reachs to the target state */ - msleep(1); - } - return state; -} - /** * snd_hda_codec_eapd_power_filter - A power filter callback for EAPD * @codec: the HDA codec @@ -2790,7 +2764,7 @@ static unsigned int hda_set_power_state(struct hda_codec *codec, state); snd_hda_codec_set_power_to_all(codec, fg, power_state); } - state = hda_sync_power_state(codec, fg, power_state); + state = snd_hda_sync_power_state(codec, fg, power_state); if (!(state & AC_PWRST_ERROR)) break; } diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c71dcacea807..c507c69029e3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -186,6 +186,10 @@ module_param(power_save, xint, 0644); MODULE_PARM_DESC(power_save, "Automatic power-saving timeout " "(in second, 0 = disable)."); +static bool pm_blacklist = true; +module_param(pm_blacklist, bool, 0644); +MODULE_PARM_DESC(pm_blacklist, "Enable power-management blacklist"); + /* reset the HD-audio controller in power save mode. * this may give more power-saving, but will take longer time to * wake up. @@ -371,6 +375,7 @@ enum { ((pci)->device == 0x160c)) #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) +#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) static char *driver_short_names[] = { [AZX_DRIVER_ICH] = "HDA Intel", @@ -1740,6 +1745,10 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, else chip->bdl_pos_adj = bdl_pos_adj[dev]; + /* Workaround for a communication error on CFL (bko#199007) */ + if (IS_CFL(pci)) + chip->polling_mode = 1; + err = azx_bus_init(chip, model[dev], &pci_hda_io_ops); if (err < 0) { kfree(hda); @@ -2186,6 +2195,24 @@ out_free: return err; } +#ifdef CONFIG_PM +/* On some boards setting power_save to a non 0 value leads to clicking / + * popping sounds when ever we enter/leave powersaving mode. Ideally we would + * figure out how to avoid these sounds, but that is not always feasible. + * So we keep a list of devices where we disable powersaving as its known + * to causes problems on these devices. + */ +static struct snd_pci_quirk power_save_blacklist[] = { + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + SND_PCI_QUIRK(0x1849, 0x0c0c, "Asrock B85M-ITX", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + SND_PCI_QUIRK(0x1043, 0x8733, "Asus Prime X370-Pro", 0), + /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */ + SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0), + {} +}; +#endif /* CONFIG_PM */ + /* number of codec slots for each chipset: 0 = default slots (i.e. 4) */ static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = { [AZX_DRIVER_NVIDIA] = 8, @@ -2198,6 +2225,7 @@ static int azx_probe_continue(struct azx *chip) struct hdac_bus *bus = azx_bus(chip); struct pci_dev *pci = chip->pci; int dev = chip->dev_index; + int val; int err; hda->probe_continued = 1; @@ -2278,7 +2306,21 @@ static int azx_probe_continue(struct azx *chip) chip->running = 1; azx_add_card_list(chip); - snd_hda_set_power_save(&chip->bus, power_save * 1000); + + val = power_save; +#ifdef CONFIG_PM + if (pm_blacklist) { + const struct snd_pci_quirk *q; + + q = snd_pci_quirk_lookup(chip->pci, power_save_blacklist); + if (q && val) { + dev_info(chip->card->dev, "device %04x:%04x is on the power_save blacklist, forcing power_save to 0\n", + q->subvendor, q->subdevice); + val = 0; + } + } +#endif /* CONFIG_PM */ + snd_hda_set_power_save(&chip->bus, val * 1000); if (azx_has_pm_runtime(chip) || hda->use_vga_switcheroo) pm_runtime_put_autosuspend(&pci->dev); diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index 5b5c324c99b9..321e78baa63c 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h @@ -622,7 +622,11 @@ snd_hda_check_power_state(struct hda_codec *codec, hda_nid_t nid, { return snd_hdac_check_power_state(&codec->core, nid, target_state); } - +static inline bool snd_hda_sync_power_state(struct hda_codec *codec, + hda_nid_t nid, unsigned int target_state) +{ + return snd_hdac_sync_power_state(&codec->core, nid, target_state); +} unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec, hda_nid_t nid, unsigned int power_state); diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 37e1cf8218ff..5b4dbcec6de8 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -957,6 +957,8 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT_FIXUP_ASPIRE_DMIC), SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", CXT_FIXUP_ASPIRE_DMIC), SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK), + SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK), + SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK), SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE), SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 23475888192b..aef1f52db7d9 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -3130,6 +3130,8 @@ static void alc256_init(struct hda_codec *codec) alc_update_coef_idx(codec, 0x46, 3 << 12, 0); alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); } static void alc256_shutup(struct hda_codec *codec) @@ -3465,6 +3467,19 @@ static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec, spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; } +static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec, + const struct hda_fixup *fix, + int action) +{ + unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21); + unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19); + + if (cfg_headphone && cfg_headset_mic == 0x411111f0) + snd_hda_codec_set_pincfg(codec, 0x19, + (cfg_headphone & ~AC_DEFCFG_DEVICE) | + (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT)); +} + static void alc269_fixup_hweq(struct hda_codec *codec, const struct hda_fixup *fix, int action) { @@ -3583,8 +3598,12 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); pinval &= ~AC_PINCTL_VREFEN; pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; - if (spec->mute_led_nid) + if (spec->mute_led_nid) { + /* temporarily power up/down for setting VREF */ + snd_hda_power_up_pm(codec); snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); + snd_hda_power_down_pm(codec); + } } /* Make sure the led works even in runtime suspend */ @@ -4972,6 +4991,29 @@ static void alc_fixup_tpt440_dock(struct hda_codec *codec, } } +static void alc_fixup_tpt470_dock(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + static const struct hda_pintbl pincfgs[] = { + { 0x17, 0x21211010 }, /* dock headphone */ + { 0x19, 0x21a11010 }, /* dock mic */ + { } + }; + struct alc_spec *spec = codec->spec; + + if (action == HDA_FIXUP_ACT_PRE_PROBE) { + spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; + snd_hda_apply_pincfgs(codec, pincfgs); + } else if (action == HDA_FIXUP_ACT_INIT) { + /* Enable DOCK device */ + snd_hda_codec_write(codec, 0x17, 0, + AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); + /* Enable DOCK device */ + snd_hda_codec_write(codec, 0x19, 0, + AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); + } +} + static void alc_shutup_dell_xps13(struct hda_codec *codec) { struct alc_spec *spec = codec->spec; @@ -5238,6 +5280,16 @@ static void alc298_fixup_speaker_volume(struct hda_codec *codec, } } +/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */ +static void alc295_fixup_disable_dac3(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + if (action == HDA_FIXUP_ACT_PRE_PROBE) { + hda_nid_t conn[2] = { 0x02, 0x03 }; + snd_hda_override_conn_list(codec, 0x17, 2, conn); + } +} + /* Hook to update amp GPIO4 for automute */ static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack) @@ -5351,6 +5403,7 @@ enum { ALC269_FIXUP_LIFEBOOK_EXTMIC, ALC269_FIXUP_LIFEBOOK_HP_PIN, ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT, + ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, ALC269_FIXUP_AMIC, ALC269_FIXUP_DMIC, ALC269VB_FIXUP_AMIC, @@ -5429,6 +5482,7 @@ enum { ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, ALC255_FIXUP_DELL_SPK_NOISE, ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC295_FIXUP_DISABLE_DAC3, ALC280_FIXUP_HP_HEADSET_MIC, ALC221_FIXUP_HP_FRONT_MIC, ALC292_FIXUP_TPT460, @@ -5443,9 +5497,13 @@ enum { ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, ALC233_FIXUP_LENOVO_MULTI_CODECS, ALC294_FIXUP_LENOVO_MIC_LOCATION, + ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, ALC700_FIXUP_INTEL_REFERENCE, ALC274_FIXUP_DELL_BIND_DACS, ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, + ALC298_FIXUP_TPT470_DOCK, + ALC255_FIXUP_DUMMY_LINEOUT_VERB, + ALC255_FIXUP_DELL_HEADSET_MIC, }; static const struct hda_fixup alc269_fixups[] = { @@ -5556,6 +5614,10 @@ static const struct hda_fixup alc269_fixups[] = { .type = HDA_FIXUP_FUNC, .v.func = alc269_fixup_pincfg_no_hp_to_lineout, }, + [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_pincfg_U7x7_headset_mic, + }, [ALC269_FIXUP_AMIC] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) { @@ -6156,6 +6218,10 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, }, + [ALC295_FIXUP_DISABLE_DAC3] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc295_fixup_disable_dac3, + }, [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) { @@ -6241,6 +6307,18 @@ static const struct hda_fixup alc269_fixups[] = { { } }, }, + [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x16, 0x0101102f }, /* Rear Headset HP */ + { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */ + { 0x1a, 0x01a19030 }, /* Rear Headset MIC */ + { 0x1b, 0x02011020 }, + { } + }, + .chained = true, + .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC + }, [ALC700_FIXUP_INTEL_REFERENCE] = { .type = HDA_FIXUP_VERBS, .v.verbs = (const struct hda_verb[]) { @@ -6271,6 +6349,28 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC274_FIXUP_DELL_BIND_DACS }, + [ALC298_FIXUP_TPT470_DOCK] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_tpt470_dock, + .chained = true, + .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE + }, + [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x14, 0x0201101f }, + { } + }, + .chained = true, + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE + }, + [ALC255_FIXUP_DELL_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ + { } + }, + }, }; static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -6319,8 +6419,15 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), + SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3), SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), + SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), + SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), + SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), + SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), + SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), + SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), @@ -6422,6 +6529,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT), SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN), SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN), + SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC), SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), @@ -6450,8 +6558,18 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460), SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), + SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460), + SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), @@ -6472,7 +6590,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460), SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460), SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460), + SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), + SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), + SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ @@ -6735,6 +6858,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x14, 0x90170110}, {0x21, 0x02211020}), SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, + {0x12, 0x90a60130}, + {0x14, 0x90170110}, + {0x14, 0x01011020}, + {0x21, 0x0221101f}), + SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, ALC256_STANDARD_PINS), SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC, {0x14, 0x90170110}, @@ -6803,6 +6931,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { {0x12, 0x90a60120}, {0x14, 0x90170110}, {0x21, 0x0321101f}), + SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, + {0x12, 0xb7a60130}, + {0x14, 0x90170110}, + {0x21, 0x04211020}), SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, ALC290_STANDARD_PINS, {0x15, 0x04211040}, @@ -7038,6 +7170,8 @@ static int patch_alc269(struct hda_codec *codec) break; case 0x10ec0257: spec->codec_variant = ALC269_TYPE_ALC257; + spec->shutup = alc256_shutup; + spec->init_hook = alc256_init; spec->gen.mixer_nid = 0; break; case 0x10ec0215: diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig index 84c3582f3982..41af6b9cc350 100644 --- a/sound/soc/Kconfig +++ b/sound/soc/Kconfig @@ -45,7 +45,6 @@ source "sound/soc/amd/Kconfig" source "sound/soc/atmel/Kconfig" source "sound/soc/au1x/Kconfig" source "sound/soc/bcm/Kconfig" -source "sound/soc/blackfin/Kconfig" source "sound/soc/cirrus/Kconfig" source "sound/soc/davinci/Kconfig" source "sound/soc/dwc/Kconfig" diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 74cd1858d38b..8d92492183d2 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile @@ -29,7 +29,6 @@ obj-$(CONFIG_SND_SOC) += amd/ obj-$(CONFIG_SND_SOC) += atmel/ obj-$(CONFIG_SND_SOC) += au1x/ obj-$(CONFIG_SND_SOC) += bcm/ -obj-$(CONFIG_SND_SOC) += blackfin/ obj-$(CONFIG_SND_SOC) += cirrus/ obj-$(CONFIG_SND_SOC) += davinci/ obj-$(CONFIG_SND_SOC) += dwc/ diff --git a/sound/soc/amd/Kconfig b/sound/soc/amd/Kconfig index d5838402f667..6cbf9cf4d1a4 100644 --- a/sound/soc/amd/Kconfig +++ b/sound/soc/amd/Kconfig @@ -3,6 +3,15 @@ config SND_SOC_AMD_ACP help This option enables ACP DMA support on AMD platform. +config SND_SOC_AMD_CZ_DA7219MX98357_MACH + tristate "AMD CZ support for DA7219 and MAX9835" + select SND_SOC_DA7219 + select SND_SOC_MAX98357A + select SND_SOC_ADAU7002 + depends on SND_SOC_AMD_ACP && I2C + help + This option enables machine driver for DA7219 and MAX9835. + config SND_SOC_AMD_CZ_RT5645_MACH tristate "AMD CZ support for RT5645" select SND_SOC_RT5645 diff --git a/sound/soc/amd/Makefile b/sound/soc/amd/Makefile index f07fd2e2870a..79b0622fa5d3 100644 --- a/sound/soc/amd/Makefile +++ b/sound/soc/amd/Makefile @@ -1,5 +1,7 @@ acp_audio_dma-objs := acp-pcm-dma.o +snd-soc-acp-da7219mx98357-mach-objs := acp-da7219-max98357a.o snd-soc-acp-rt5645-mach-objs := acp-rt5645.o obj-$(CONFIG_SND_SOC_AMD_ACP) += acp_audio_dma.o +obj-$(CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH) += snd-soc-acp-da7219mx98357-mach.o obj-$(CONFIG_SND_SOC_AMD_CZ_RT5645_MACH) += snd-soc-acp-rt5645-mach.o diff --git a/sound/soc/amd/acp-da7219-max98357a.c b/sound/soc/amd/acp-da7219-max98357a.c new file mode 100644 index 000000000000..b205c782e494 --- /dev/null +++ b/sound/soc/amd/acp-da7219-max98357a.c @@ -0,0 +1,276 @@ +/* + * Machine driver for AMD ACP Audio engine using DA7219 & MAX98357 codec + * + * Copyright 2017 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#include <sound/core.h> +#include <sound/soc.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc-dapm.h> +#include <sound/jack.h> +#include <linux/clk.h> +#include <linux/gpio.h> +#include <linux/module.h> +#include <linux/i2c.h> +#include <linux/acpi.h> + +#include "../codecs/da7219.h" +#include "../codecs/da7219-aad.h" + +#define CZ_PLAT_CLK 24000000 +#define MCLK_RATE 24576000 +#define DUAL_CHANNEL 2 + +static struct snd_soc_jack cz_jack; +struct clk *da7219_dai_clk; + +static int cz_da7219_init(struct snd_soc_pcm_runtime *rtd) +{ + int ret; + struct snd_soc_card *card = rtd->card; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + struct snd_soc_component *component = codec_dai->component; + + dev_info(rtd->dev, "codec dai name = %s\n", codec_dai->name); + + ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, + CZ_PLAT_CLK, SND_SOC_CLOCK_IN); + if (ret < 0) { + dev_err(rtd->dev, "can't set codec sysclk: %d\n", ret); + return ret; + } + + ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL, + CZ_PLAT_CLK, MCLK_RATE); + if (ret < 0) { + dev_err(rtd->dev, "can't set codec pll: %d\n", ret); + return ret; + } + + da7219_dai_clk = clk_get(component->dev, "da7219-dai-clks"); + + ret = snd_soc_card_jack_new(card, "Headset Jack", + SND_JACK_HEADPHONE | SND_JACK_MICROPHONE | + SND_JACK_BTN_0 | SND_JACK_BTN_1 | + SND_JACK_BTN_2 | SND_JACK_BTN_3, + &cz_jack, NULL, 0); + if (ret) { + dev_err(card->dev, "HP jack creation failed %d\n", ret); + return ret; + } + + da7219_aad_jack_det(component, &cz_jack); + + return 0; +} + +static int cz_da7219_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + int ret = 0; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + + ret = clk_prepare_enable(da7219_dai_clk); + if (ret < 0) { + dev_err(rtd->dev, "can't enable master clock %d\n", ret); + return ret; + } + + return ret; +} + +static int cz_da7219_hw_free(struct snd_pcm_substream *substream) +{ + clk_disable_unprepare(da7219_dai_clk); + + return 0; +} + +static const unsigned int channels[] = { + DUAL_CHANNEL, +}; + +static const unsigned int rates[] = { + 48000, +}; + +static const struct snd_pcm_hw_constraint_list constraints_rates = { + .count = ARRAY_SIZE(rates), + .list = rates, + .mask = 0, +}; + +static const struct snd_pcm_hw_constraint_list constraints_channels = { + .count = ARRAY_SIZE(channels), + .list = channels, + .mask = 0, +}; + +static int cz_fe_startup(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + /* + * On this platform for PCM device we support stereo + */ + + runtime->hw.channels_max = DUAL_CHANNEL; + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, + &constraints_channels); + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, + &constraints_rates); + + return 0; +} + +static struct snd_soc_ops cz_da7219_cap_ops = { + .hw_params = cz_da7219_hw_params, + .hw_free = cz_da7219_hw_free, + .startup = cz_fe_startup, +}; + +static struct snd_soc_ops cz_max_play_ops = { + .hw_params = cz_da7219_hw_params, + .hw_free = cz_da7219_hw_free, +}; + +static struct snd_soc_ops cz_dmic_cap_ops = { + .hw_params = cz_da7219_hw_params, + .hw_free = cz_da7219_hw_free, +}; + +static struct snd_soc_dai_link cz_dai_7219_98357[] = { + { + .name = "amd-da7219-play-cap", + .stream_name = "Playback and Capture", + .platform_name = "acp_audio_dma.0.auto", + .cpu_dai_name = "designware-i2s.3.auto", + .codec_dai_name = "da7219-hifi", + .codec_name = "i2c-DLGS7219:00", + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF + | SND_SOC_DAIFMT_CBM_CFM, + .init = cz_da7219_init, + .dpcm_playback = 1, + .dpcm_capture = 1, + .ops = &cz_da7219_cap_ops, + }, + { + .name = "amd-max98357-play", + .stream_name = "HiFi Playback", + .platform_name = "acp_audio_dma.0.auto", + .cpu_dai_name = "designware-i2s.1.auto", + .codec_dai_name = "HiFi", + .codec_name = "MX98357A:00", + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF + | SND_SOC_DAIFMT_CBM_CFM, + .dpcm_playback = 1, + .ops = &cz_max_play_ops, + }, + { + .name = "dmic", + .stream_name = "DMIC Capture", + .platform_name = "acp_audio_dma.0.auto", + .cpu_dai_name = "designware-i2s.2.auto", + .codec_dai_name = "adau7002-hifi", + .codec_name = "ADAU7002:00", + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF + | SND_SOC_DAIFMT_CBM_CFM, + .dpcm_capture = 1, + .ops = &cz_dmic_cap_ops, + }, +}; + +static const struct snd_soc_dapm_widget cz_widgets[] = { + SND_SOC_DAPM_HP("Headphones", NULL), + SND_SOC_DAPM_SPK("Speakers", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Int Mic", NULL), +}; + +static const struct snd_soc_dapm_route cz_audio_route[] = { + {"Headphones", NULL, "HPL"}, + {"Headphones", NULL, "HPR"}, + {"MIC", NULL, "Headset Mic"}, + {"Speakers", NULL, "Speaker"}, + {"PDM_DAT", NULL, "Int Mic"}, +}; + +static const struct snd_kcontrol_new cz_mc_controls[] = { + SOC_DAPM_PIN_SWITCH("Headphones"), + SOC_DAPM_PIN_SWITCH("Speakers"), + SOC_DAPM_PIN_SWITCH("Headset Mic"), + SOC_DAPM_PIN_SWITCH("Int Mic"), +}; + +static struct snd_soc_card cz_card = { + .name = "acpd7219m98357", + .owner = THIS_MODULE, + .dai_link = cz_dai_7219_98357, + .num_links = ARRAY_SIZE(cz_dai_7219_98357), + .dapm_widgets = cz_widgets, + .num_dapm_widgets = ARRAY_SIZE(cz_widgets), + .dapm_routes = cz_audio_route, + .num_dapm_routes = ARRAY_SIZE(cz_audio_route), + .controls = cz_mc_controls, + .num_controls = ARRAY_SIZE(cz_mc_controls), +}; + +static int cz_probe(struct platform_device *pdev) +{ + int ret; + struct snd_soc_card *card; + + card = &cz_card; + cz_card.dev = &pdev->dev; + platform_set_drvdata(pdev, card); + ret = devm_snd_soc_register_card(&pdev->dev, &cz_card); + if (ret) { + dev_err(&pdev->dev, + "devm_snd_soc_register_card(%s) failed: %d\n", + cz_card.name, ret); + return ret; + } + return 0; +} + +static const struct acpi_device_id cz_audio_acpi_match[] = { + { "AMD7219", 0 }, + {}, +}; +MODULE_DEVICE_TABLE(acpi, cz_audio_acpi_match); + +static struct platform_driver cz_pcm_driver = { + .driver = { + .name = "cz-da7219-max98357a", + .acpi_match_table = ACPI_PTR(cz_audio_acpi_match), + .pm = &snd_soc_pm_ops, + }, + .probe = cz_probe, +}; + +module_platform_driver(cz_pcm_driver); + +MODULE_AUTHOR("akshu.agrawal@amd.com"); +MODULE_DESCRIPTION("DA7219 & MAX98357A audio support"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c index c33a512283a4..540088d317f2 100644 --- a/sound/soc/amd/acp-pcm-dma.c +++ b/sound/soc/amd/acp-pcm-dma.c @@ -23,6 +23,8 @@ #include <drm/amd_asic_type.h> #include "acp.h" +#define DRV_NAME "acp_audio_dma" + #define PLAYBACK_MIN_NUM_PERIODS 2 #define PLAYBACK_MAX_NUM_PERIODS 2 #define PLAYBACK_MAX_PERIOD_SIZE 16384 @@ -182,19 +184,18 @@ static void config_dma_descriptor_in_sram(void __iomem *acp_mmio, * system memory <-> ACP SRAM */ static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio, - u32 size, int direction, - u32 pte_offset, u32 asic_type) + u32 size, int direction, u32 pte_offset, + u16 ch, u32 sram_bank, + u16 dma_dscr_idx, u32 asic_type) { u16 i; - u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12; acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL]; for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) { dmadscr[i].xfer_val = 0; if (direction == SNDRV_PCM_STREAM_PLAYBACK) { - dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12 + i; - dmadscr[i].dest = ACP_SHARED_RAM_BANK_1_ADDRESS - + (i * (size/2)); + dma_dscr_idx = dma_dscr_idx + i; + dmadscr[i].dest = sram_bank + (i * (size/2)); dmadscr[i].src = ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS + (pte_offset * SZ_4K) + (i * (size/2)); switch (asic_type) { @@ -209,25 +210,19 @@ static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio, (size / 2); } } else { - dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH14 + i; + dma_dscr_idx = dma_dscr_idx + i; + dmadscr[i].src = sram_bank + (i * (size/2)); + dmadscr[i].dest = + ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS + + (pte_offset * SZ_4K) + (i * (size/2)); switch (asic_type) { case CHIP_STONEY: - dmadscr[i].src = ACP_SHARED_RAM_BANK_3_ADDRESS + - (i * (size/2)); - dmadscr[i].dest = - ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS + - (pte_offset * SZ_4K) + (i * (size/2)); dmadscr[i].xfer_val |= BIT(22) | (ACP_DMA_ATTRIBUTES_SHARED_MEM_TO_DAGB_GARLIC << 16) | (size / 2); break; default: - dmadscr[i].src = ACP_SHARED_RAM_BANK_5_ADDRESS + - (i * (size/2)); - dmadscr[i].dest = - ACP_INTERNAL_APERTURE_WINDOW_0_ADDRESS + - (pte_offset * SZ_4K) + (i * (size/2)); dmadscr[i].xfer_val |= BIT(22) | (ACP_DMA_ATTRIBUTES_SHAREDMEM_TO_DAGB_ONION << 16) | @@ -237,72 +232,49 @@ static void set_acp_sysmem_dma_descriptors(void __iomem *acp_mmio, config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx, &dmadscr[i]); } - if (direction == SNDRV_PCM_STREAM_PLAYBACK) - config_acp_dma_channel(acp_mmio, SYSRAM_TO_ACP_CH_NUM, - PLAYBACK_START_DMA_DESCR_CH12, - NUM_DSCRS_PER_CHANNEL, - ACP_DMA_PRIORITY_LEVEL_NORMAL); - else - config_acp_dma_channel(acp_mmio, ACP_TO_SYSRAM_CH_NUM, - CAPTURE_START_DMA_DESCR_CH14, - NUM_DSCRS_PER_CHANNEL, - ACP_DMA_PRIORITY_LEVEL_NORMAL); + config_acp_dma_channel(acp_mmio, ch, + dma_dscr_idx - 1, + NUM_DSCRS_PER_CHANNEL, + ACP_DMA_PRIORITY_LEVEL_NORMAL); } /* Initialize the DMA descriptor information for transfer between * ACP SRAM <-> I2S */ -static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio, - u32 size, int direction, - u32 asic_type) +static void set_acp_to_i2s_dma_descriptors(void __iomem *acp_mmio, u32 size, + int direction, u32 sram_bank, + u16 destination, u16 ch, + u16 dma_dscr_idx, u32 asic_type) { u16 i; - u16 dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13; acp_dma_dscr_transfer_t dmadscr[NUM_DSCRS_PER_CHANNEL]; for (i = 0; i < NUM_DSCRS_PER_CHANNEL; i++) { dmadscr[i].xfer_val = 0; if (direction == SNDRV_PCM_STREAM_PLAYBACK) { - dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13 + i; - dmadscr[i].src = ACP_SHARED_RAM_BANK_1_ADDRESS + - (i * (size/2)); + dma_dscr_idx = dma_dscr_idx + i; + dmadscr[i].src = sram_bank + (i * (size/2)); /* dmadscr[i].dest is unused by hardware. */ dmadscr[i].dest = 0; - dmadscr[i].xfer_val |= BIT(22) | (TO_ACP_I2S_1 << 16) | + dmadscr[i].xfer_val |= BIT(22) | (destination << 16) | (size / 2); } else { - dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH15 + i; + dma_dscr_idx = dma_dscr_idx + i; /* dmadscr[i].src is unused by hardware. */ dmadscr[i].src = 0; - switch (asic_type) { - case CHIP_STONEY: - dmadscr[i].dest = - ACP_SHARED_RAM_BANK_3_ADDRESS + - (i * (size / 2)); - break; - default: - dmadscr[i].dest = - ACP_SHARED_RAM_BANK_5_ADDRESS + - (i * (size / 2)); - } + dmadscr[i].dest = + sram_bank + (i * (size / 2)); dmadscr[i].xfer_val |= BIT(22) | - (FROM_ACP_I2S_1 << 16) | (size / 2); + (destination << 16) | (size / 2); } config_dma_descriptor_in_sram(acp_mmio, dma_dscr_idx, &dmadscr[i]); } /* Configure the DMA channel with the above descriptore */ - if (direction == SNDRV_PCM_STREAM_PLAYBACK) - config_acp_dma_channel(acp_mmio, ACP_TO_I2S_DMA_CH_NUM, - PLAYBACK_START_DMA_DESCR_CH13, - NUM_DSCRS_PER_CHANNEL, - ACP_DMA_PRIORITY_LEVEL_NORMAL); - else - config_acp_dma_channel(acp_mmio, I2S_TO_ACP_DMA_CH_NUM, - CAPTURE_START_DMA_DESCR_CH15, - NUM_DSCRS_PER_CHANNEL, - ACP_DMA_PRIORITY_LEVEL_NORMAL); + config_acp_dma_channel(acp_mmio, ch, dma_dscr_idx - 1, + NUM_DSCRS_PER_CHANNEL, + ACP_DMA_PRIORITY_LEVEL_NORMAL); } /* Create page table entries in ACP SRAM for the allocated memory */ @@ -344,23 +316,51 @@ static void config_acp_dma(void __iomem *acp_mmio, struct audio_substream_data *audio_config, u32 asic_type) { - u32 pte_offset; + u32 pte_offset, sram_bank; + u16 ch1, ch2, destination, dma_dscr_idx; - if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK) + if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK) { pte_offset = ACP_PLAYBACK_PTE_OFFSET; - else + ch1 = SYSRAM_TO_ACP_CH_NUM; + ch2 = ACP_TO_I2S_DMA_CH_NUM; + sram_bank = ACP_SHARED_RAM_BANK_1_ADDRESS; + destination = TO_ACP_I2S_1; + + } else { pte_offset = ACP_CAPTURE_PTE_OFFSET; + ch1 = SYSRAM_TO_ACP_CH_NUM; + ch2 = ACP_TO_I2S_DMA_CH_NUM; + switch (asic_type) { + case CHIP_STONEY: + sram_bank = ACP_SHARED_RAM_BANK_3_ADDRESS; + break; + default: + sram_bank = ACP_SHARED_RAM_BANK_5_ADDRESS; + } + destination = FROM_ACP_I2S_1; + } acp_pte_config(acp_mmio, audio_config->pg, audio_config->num_of_pages, pte_offset); + if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK) + dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH12; + else + dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH14; /* Configure System memory <-> ACP SRAM DMA descriptors */ set_acp_sysmem_dma_descriptors(acp_mmio, audio_config->size, - audio_config->direction, pte_offset, asic_type); + audio_config->direction, pte_offset, + ch1, sram_bank, dma_dscr_idx, asic_type); + if (audio_config->direction == SNDRV_PCM_STREAM_PLAYBACK) + dma_dscr_idx = PLAYBACK_START_DMA_DESCR_CH13; + else + dma_dscr_idx = CAPTURE_START_DMA_DESCR_CH15; /* Configure ACP SRAM <-> I2S DMA descriptors */ set_acp_to_i2s_dma_descriptors(acp_mmio, audio_config->size, - audio_config->direction, asic_type); + audio_config->direction, sram_bank, + destination, ch2, dma_dscr_idx, + asic_type); } /* Start a given DMA channel transfer */ @@ -579,13 +579,6 @@ static int acp_init(void __iomem *acp_mmio, u32 asic_type) for (bank = 1; bank < 48; bank++) acp_set_sram_bank_state(acp_mmio, bank, false); } - - /* Stoney supports 16bit resolution */ - if (asic_type == CHIP_STONEY) { - val = acp_reg_read(acp_mmio, mmACP_I2S_16BIT_RESOLUTION_EN); - val |= 0x03; - acp_reg_write(val, acp_mmio, mmACP_I2S_16BIT_RESOLUTION_EN); - } return 0; } @@ -662,7 +655,7 @@ static irqreturn_t dma_irq_handler(int irq, void *arg) 1, 0); acp_dma_start(acp_mmio, SYSRAM_TO_ACP_CH_NUM, false); - snd_pcm_period_elapsed(irq_data->play_stream); + snd_pcm_period_elapsed(irq_data->play_i2ssp_stream); acp_reg_write((intr_flag & BIT(ACP_TO_I2S_DMA_CH_NUM)) << 16, acp_mmio, mmACP_EXTERNAL_INTR_STAT); @@ -685,7 +678,7 @@ static irqreturn_t dma_irq_handler(int irq, void *arg) if ((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) != 0) { valid_irq = true; - snd_pcm_period_elapsed(irq_data->capture_stream); + snd_pcm_period_elapsed(irq_data->capture_i2ssp_stream); acp_reg_write((intr_flag & BIT(ACP_TO_SYSRAM_CH_NUM)) << 16, acp_mmio, mmACP_EXTERNAL_INTR_STAT); } @@ -702,8 +695,8 @@ static int acp_dma_open(struct snd_pcm_substream *substream) int ret = 0; struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *prtd = substream->private_data; - struct audio_drv_data *intr_data = dev_get_drvdata(prtd->platform->dev); - + struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); + struct audio_drv_data *intr_data = dev_get_drvdata(component->dev); struct audio_substream_data *adata = kzalloc(sizeof(struct audio_substream_data), GFP_KERNEL); if (adata == NULL) @@ -730,7 +723,7 @@ static int acp_dma_open(struct snd_pcm_substream *substream) ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); if (ret < 0) { - dev_err(prtd->platform->dev, "set integer constraint failed\n"); + dev_err(component->dev, "set integer constraint failed\n"); kfree(adata); return ret; } @@ -743,11 +736,11 @@ static int acp_dma_open(struct snd_pcm_substream *substream) * This enablement is not required for another stream, if current * stream is not closed */ - if (!intr_data->play_stream && !intr_data->capture_stream) + if (!intr_data->play_i2ssp_stream && !intr_data->capture_i2ssp_stream) acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - intr_data->play_stream = substream; + intr_data->play_i2ssp_stream = substream; /* For Stoney, Memory gating is disabled,i.e SRAM Banks * won't be turned off. The default state for SRAM banks is ON. * Setting SRAM bank state code skipped for STONEY platform. @@ -758,7 +751,7 @@ static int acp_dma_open(struct snd_pcm_substream *substream) bank, true); } } else { - intr_data->capture_stream = substream; + intr_data->capture_i2ssp_stream = substream; if (intr_data->asic_type != CHIP_STONEY) { for (bank = 5; bank <= 8; bank++) acp_set_sram_bank_state(intr_data->acp_mmio, @@ -774,11 +767,13 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream, { int status; uint64_t size; + u32 val = 0; struct page *pg; struct snd_pcm_runtime *runtime; struct audio_substream_data *rtd; struct snd_soc_pcm_runtime *prtd = substream->private_data; - struct audio_drv_data *adata = dev_get_drvdata(prtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); + struct audio_drv_data *adata = dev_get_drvdata(component->dev); runtime = substream->runtime; rtd = runtime->private_data; @@ -786,6 +781,14 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream, if (WARN_ON(!rtd)) return -EINVAL; + if (adata->asic_type == CHIP_STONEY) { + val = acp_reg_read(adata->acp_mmio, mmACP_I2S_16BIT_RESOLUTION_EN); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + val |= ACP_I2S_SP_16BIT_RESOLUTION_EN; + else + val |= ACP_I2S_MIC_16BIT_RESOLUTION_EN; + acp_reg_write(val, adata->acp_mmio, mmACP_I2S_16BIT_RESOLUTION_EN); + } size = params_buffer_bytes(params); status = snd_pcm_lib_malloc_pages(substream, size); if (status < 0) @@ -857,11 +860,11 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream) bytescount = acp_get_byte_count(rtd->acp_mmio, substream->stream); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (bytescount > rtd->renderbytescount) - bytescount = bytescount - rtd->renderbytescount; + if (bytescount > rtd->i2ssp_renderbytescount) + bytescount = bytescount - rtd->i2ssp_renderbytescount; } else { - if (bytescount > rtd->capturebytescount) - bytescount = bytescount - rtd->capturebytescount; + if (bytescount > rtd->i2ssp_capturebytescount) + bytescount = bytescount - rtd->i2ssp_capturebytescount; } pos = do_div(bytescount, buffersize); return bytes_to_frames(runtime, pos); @@ -907,6 +910,7 @@ static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd) struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *prtd = substream->private_data; struct audio_substream_data *rtd = runtime->private_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); if (!rtd) return -EINVAL; @@ -917,14 +921,14 @@ static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd) bytescount = acp_get_byte_count(rtd->acp_mmio, substream->stream); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (rtd->renderbytescount == 0) - rtd->renderbytescount = bytescount; + if (rtd->i2ssp_renderbytescount == 0) + rtd->i2ssp_renderbytescount = bytescount; acp_dma_start(rtd->acp_mmio, SYSRAM_TO_ACP_CH_NUM, false); while (acp_reg_read(rtd->acp_mmio, mmACP_DMA_CH_STS) & BIT(SYSRAM_TO_ACP_CH_NUM)) { if (!loops--) { - dev_err(prtd->platform->dev, + dev_err(component->dev, "acp dma start timeout\n"); return -ETIMEDOUT; } @@ -935,8 +939,8 @@ static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd) ACP_TO_I2S_DMA_CH_NUM, true); } else { - if (rtd->capturebytescount == 0) - rtd->capturebytescount = bytescount; + if (rtd->i2ssp_capturebytescount == 0) + rtd->i2ssp_capturebytescount = bytescount; acp_dma_start(rtd->acp_mmio, I2S_TO_ACP_DMA_CH_NUM, true); } @@ -952,12 +956,16 @@ static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd) */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { ret = acp_dma_stop(rtd->acp_mmio, + SYSRAM_TO_ACP_CH_NUM); + ret = acp_dma_stop(rtd->acp_mmio, ACP_TO_I2S_DMA_CH_NUM); - rtd->renderbytescount = 0; + rtd->i2ssp_renderbytescount = 0; } else { ret = acp_dma_stop(rtd->acp_mmio, I2S_TO_ACP_DMA_CH_NUM); - rtd->capturebytescount = 0; + ret = acp_dma_stop(rtd->acp_mmio, + ACP_TO_SYSRAM_CH_NUM); + rtd->i2ssp_capturebytescount = 0; } break; default: @@ -970,7 +978,8 @@ static int acp_dma_trigger(struct snd_pcm_substream *substream, int cmd) static int acp_dma_new(struct snd_soc_pcm_runtime *rtd) { int ret; - struct audio_drv_data *adata = dev_get_drvdata(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct audio_drv_data *adata = dev_get_drvdata(component->dev); switch (adata->asic_type) { case CHIP_STONEY: @@ -987,7 +996,7 @@ static int acp_dma_new(struct snd_soc_pcm_runtime *rtd) break; } if (ret < 0) - dev_err(rtd->platform->dev, + dev_err(component->dev, "buffer preallocation failer error:%d\n", ret); return ret; } @@ -998,12 +1007,13 @@ static int acp_dma_close(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct audio_substream_data *rtd = runtime->private_data; struct snd_soc_pcm_runtime *prtd = substream->private_data; - struct audio_drv_data *adata = dev_get_drvdata(prtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(prtd, DRV_NAME); + struct audio_drv_data *adata = dev_get_drvdata(component->dev); kfree(rtd); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - adata->play_stream = NULL; + adata->play_i2ssp_stream = NULL; /* For Stoney, Memory gating is disabled,i.e SRAM Banks * won't be turned off. The default state for SRAM banks is ON. * Setting SRAM bank state code skipped for STONEY platform. @@ -1015,7 +1025,7 @@ static int acp_dma_close(struct snd_pcm_substream *substream) false); } } else { - adata->capture_stream = NULL; + adata->capture_i2ssp_stream = NULL; if (adata->asic_type != CHIP_STONEY) { for (bank = 5; bank <= 8; bank++) acp_set_sram_bank_state(adata->acp_mmio, bank, @@ -1026,7 +1036,7 @@ static int acp_dma_close(struct snd_pcm_substream *substream) /* Disable ACP irq, when the current stream is being closed and * another stream is also not active. */ - if (!adata->play_stream && !adata->capture_stream) + if (!adata->play_i2ssp_stream && !adata->capture_i2ssp_stream) acp_reg_write(0, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB); return 0; @@ -1044,7 +1054,8 @@ static const struct snd_pcm_ops acp_dma_ops = { .prepare = acp_dma_prepare, }; -static struct snd_soc_platform_driver acp_asoc_platform = { +static struct snd_soc_component_driver acp_asoc_platform = { + .name = DRV_NAME, .ops = &acp_dma_ops, .pcm_new = acp_dma_new, }; @@ -1076,8 +1087,9 @@ static int acp_audio_probe(struct platform_device *pdev) * and device doesn't generate any interrupts. */ - audio_drv_data->play_stream = NULL; - audio_drv_data->capture_stream = NULL; + audio_drv_data->play_i2ssp_stream = NULL; + audio_drv_data->capture_i2ssp_stream = NULL; + audio_drv_data->asic_type = *pdata; res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); @@ -1102,7 +1114,8 @@ static int acp_audio_probe(struct platform_device *pdev) return status; } - status = snd_soc_register_platform(&pdev->dev, &acp_asoc_platform); + status = devm_snd_soc_register_component(&pdev->dev, + &acp_asoc_platform, NULL, 0); if (status != 0) { dev_err(&pdev->dev, "Fail to register ALSA platform device\n"); return status; @@ -1123,7 +1136,6 @@ static int acp_audio_remove(struct platform_device *pdev) status = acp_deinit(adata->acp_mmio); if (status) dev_err(&pdev->dev, "ACP Deinit failed status:%d\n", status); - snd_soc_unregister_platform(&pdev->dev); pm_runtime_disable(&pdev->dev); return 0; @@ -1141,7 +1153,7 @@ static int acp_pcm_resume(struct device *dev) return status; } - if (adata->play_stream && adata->play_stream->runtime) { + if (adata->play_i2ssp_stream && adata->play_i2ssp_stream->runtime) { /* For Stoney, Memory gating is disabled,i.e SRAM Banks * won't be turned off. The default state for SRAM banks is ON. * Setting SRAM bank state code skipped for STONEY platform. @@ -1152,17 +1164,17 @@ static int acp_pcm_resume(struct device *dev) true); } config_acp_dma(adata->acp_mmio, - adata->play_stream->runtime->private_data, + adata->play_i2ssp_stream->runtime->private_data, adata->asic_type); } - if (adata->capture_stream && adata->capture_stream->runtime) { + if (adata->capture_i2ssp_stream && adata->capture_i2ssp_stream->runtime) { if (adata->asic_type != CHIP_STONEY) { for (bank = 5; bank <= 8; bank++) acp_set_sram_bank_state(adata->acp_mmio, bank, true); } config_acp_dma(adata->acp_mmio, - adata->capture_stream->runtime->private_data, + adata->capture_i2ssp_stream->runtime->private_data, adata->asic_type); } acp_reg_write(1, adata->acp_mmio, mmACP_EXTERNAL_INTR_ENB); diff --git a/sound/soc/amd/acp-rt5645.c b/sound/soc/amd/acp-rt5645.c index 941aed6bb364..b79b922b08a0 100644 --- a/sound/soc/amd/acp-rt5645.c +++ b/sound/soc/amd/acp-rt5645.c @@ -71,9 +71,9 @@ static int cz_init(struct snd_soc_pcm_runtime *rtd) { int ret; struct snd_soc_card *card; - struct snd_soc_codec *codec; + struct snd_soc_component *codec; - codec = rtd->codec; + codec = rtd->codec_dai->component; card = rtd->card; ret = snd_soc_card_jack_new(card, "Headset Jack", diff --git a/sound/soc/amd/acp.h b/sound/soc/amd/acp.h index ecb458935d1e..ba01510eb818 100644 --- a/sound/soc/amd/acp.h +++ b/sound/soc/amd/acp.h @@ -70,6 +70,8 @@ #define CAPTURE_END_DMA_DESCR_CH15 7 #define mmACP_I2S_16BIT_RESOLUTION_EN 0x5209 +#define ACP_I2S_MIC_16BIT_RESOLUTION_EN 0x01 +#define ACP_I2S_SP_16BIT_RESOLUTION_EN 0x02 enum acp_dma_priority_level { /* 0x0 Specifies the DMA channel is given normal priority */ ACP_DMA_PRIORITY_LEVEL_NORMAL = 0x0, @@ -84,14 +86,14 @@ struct audio_substream_data { u16 num_of_pages; u16 direction; uint64_t size; - u64 renderbytescount; - u64 capturebytescount; + u64 i2ssp_renderbytescount; + u64 i2ssp_capturebytescount; void __iomem *acp_mmio; }; struct audio_drv_data { - struct snd_pcm_substream *play_stream; - struct snd_pcm_substream *capture_stream; + struct snd_pcm_substream *play_i2ssp_stream; + struct snd_pcm_substream *capture_i2ssp_stream; void __iomem *acp_mmio; u32 asic_type; }; diff --git a/sound/soc/atmel/atmel-classd.c b/sound/soc/atmel/atmel-classd.c index ebabed69f0e6..3d70061901a0 100644 --- a/sound/soc/atmel/atmel-classd.c +++ b/sound/soc/atmel/atmel-classd.c @@ -32,6 +32,7 @@ struct atmel_classd { struct regmap *regmap; struct clk *pclk; struct clk *gclk; + struct device *dev; int irq; const struct atmel_classd_pdata *pdata; }; @@ -165,7 +166,7 @@ atmel_classd_platform_configure_dma(struct snd_pcm_substream *substream, struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card); if (params_physical_width(params) != 16) { - dev_err(rtd->platform->dev, + dev_err(dd->dev, "only supports 16-bit audio data\n"); return -EINVAL; } @@ -247,9 +248,9 @@ static const char * const pwm_type[] = { "Single ended", "Differential" }; -static int atmel_classd_codec_probe(struct snd_soc_codec *codec) +static int atmel_classd_component_probe(struct snd_soc_component *component) { - struct snd_soc_card *card = snd_soc_codec_get_drvdata(codec); + struct snd_soc_card *card = snd_soc_component_get_drvdata(component); struct atmel_classd *dd = snd_soc_card_get_drvdata(card); const struct atmel_classd_pdata *pdata = dd->pdata; u32 mask, val; @@ -283,16 +284,16 @@ static int atmel_classd_codec_probe(struct snd_soc_codec *codec) default: val |= (CLASSD_MR_NOVR_VAL_10NS << CLASSD_MR_NOVR_VAL_SHIFT); - dev_warn(codec->dev, + dev_warn(component->dev, "non-overlapping value %d is invalid, the default value 10 is specified\n", pdata->non_overlap_time); break; } } - snd_soc_update_bits(codec, CLASSD_MR, mask, val); + snd_soc_component_update_bits(component, CLASSD_MR, mask, val); - dev_info(codec->dev, + dev_info(component->dev, "PWM modulation type is %s, non-overlapping is %s\n", pwm_type[pdata->pwm_type], pdata->non_overlap_enable?"enabled":"disabled"); @@ -300,21 +301,23 @@ static int atmel_classd_codec_probe(struct snd_soc_codec *codec) return 0; } -static int atmel_classd_codec_resume(struct snd_soc_codec *codec) +static int atmel_classd_component_resume(struct snd_soc_component *component) { - struct snd_soc_card *card = snd_soc_codec_get_drvdata(codec); + struct snd_soc_card *card = snd_soc_component_get_drvdata(component); struct atmel_classd *dd = snd_soc_card_get_drvdata(card); return regcache_sync(dd->regmap); } -static struct snd_soc_codec_driver soc_codec_dev_classd = { - .probe = atmel_classd_codec_probe, - .resume = atmel_classd_codec_resume, - .component_driver = { - .controls = atmel_classd_snd_controls, - .num_controls = ARRAY_SIZE(atmel_classd_snd_controls), - }, +static struct snd_soc_component_driver soc_component_dev_classd = { + .probe = atmel_classd_component_probe, + .resume = atmel_classd_component_resume, + .controls = atmel_classd_snd_controls, + .num_controls = ARRAY_SIZE(atmel_classd_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* codec dai component */ @@ -330,7 +333,7 @@ static int atmel_classd_codec_dai_startup(struct snd_pcm_substream *substream, static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u32 mask, val; mask = CLASSD_MR_LMUTE_MASK | CLASSD_MR_RMUTE_MASK; @@ -340,7 +343,7 @@ static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai, else val = 0; - snd_soc_update_bits(codec, CLASSD_MR, mask, val); + snd_soc_component_update_bits(component, CLASSD_MR, mask, val); return 0; } @@ -379,7 +382,7 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int fs; int i, best, best_val, cur_val, ret; u32 mask, val; @@ -397,7 +400,7 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream, } } - dev_dbg(codec->dev, + dev_dbg(component->dev, "Selected SAMPLE_RATE of %dHz, GCLK_RATE of %ldHz\n", sample_rates[best].rate, sample_rates[best].gclk_rate); @@ -411,7 +414,7 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream, val = (sample_rates[best].dsp_clk << CLASSD_INTPMR_DSP_CLK_FREQ_SHIFT) | (sample_rates[best].sample_rate << CLASSD_INTPMR_FRAME_SHIFT); - snd_soc_update_bits(codec, CLASSD_INTPMR, mask, val); + snd_soc_component_update_bits(component, CLASSD_INTPMR, mask, val); return clk_prepare_enable(dd->gclk); } @@ -429,9 +432,9 @@ atmel_classd_codec_dai_shutdown(struct snd_pcm_substream *substream, static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; - snd_soc_update_bits(codec, CLASSD_MR, + snd_soc_component_update_bits(component, CLASSD_MR, CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK, (CLASSD_MR_LEN_DIS << CLASSD_MR_LEN_SHIFT) |(CLASSD_MR_REN_DIS << CLASSD_MR_REN_SHIFT)); @@ -442,7 +445,7 @@ static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream, static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *codec_dai) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u32 mask, val; mask = CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK; @@ -463,7 +466,7 @@ static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, CLASSD_MR, mask, val); + snd_soc_component_update_bits(component, CLASSD_MR, mask, val); return 0; } @@ -580,13 +583,11 @@ static int atmel_classd_probe(struct platform_device *pdev) res = platform_get_resource(pdev, IORESOURCE_MEM, 0); io_base = devm_ioremap_resource(dev, res); - if (IS_ERR(io_base)) { - ret = PTR_ERR(io_base); - dev_err(dev, "failed to remap register memory: %d\n", ret); - return ret; - } + if (IS_ERR(io_base)) + return PTR_ERR(io_base); dd->phy_base = res->start; + dd->dev = dev; dd->regmap = devm_regmap_init_mmio(dev, io_base, &atmel_classd_regmap_config); @@ -612,10 +613,10 @@ static int atmel_classd_probe(struct platform_device *pdev) return ret; } - ret = snd_soc_register_codec(dev, &soc_codec_dev_classd, + ret = devm_snd_soc_register_component(dev, &soc_component_dev_classd, &atmel_classd_codec_dai, 1); if (ret) { - dev_err(dev, "could not register codec: %d\n", ret); + dev_err(dev, "could not register component: %d\n", ret); return ret; } @@ -643,13 +644,11 @@ static int atmel_classd_probe(struct platform_device *pdev) return 0; unregister_codec: - snd_soc_unregister_codec(dev); return ret; } static int atmel_classd_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/atmel/atmel-pcm-pdc.c b/sound/soc/atmel/atmel-pcm-pdc.c index 91b7069c3499..99ca23d527c9 100644 --- a/sound/soc/atmel/atmel-pcm-pdc.c +++ b/sound/soc/atmel/atmel-pcm-pdc.c @@ -393,7 +393,7 @@ static const struct snd_pcm_ops atmel_pcm_ops = { .mmap = atmel_pcm_mmap, }; -static struct snd_soc_platform_driver atmel_soc_platform = { +static struct snd_soc_component_driver atmel_soc_platform = { .ops = &atmel_pcm_ops, .pcm_new = atmel_pcm_new, .pcm_free = atmel_pcm_free, @@ -401,13 +401,13 @@ static struct snd_soc_platform_driver atmel_soc_platform = { int atmel_pcm_pdc_platform_register(struct device *dev) { - return snd_soc_register_platform(dev, &atmel_soc_platform); + return devm_snd_soc_register_component(dev, &atmel_soc_platform, + NULL, 0); } EXPORT_SYMBOL(atmel_pcm_pdc_platform_register); void atmel_pcm_pdc_platform_unregister(struct device *dev) { - snd_soc_unregister_platform(dev); } EXPORT_SYMBOL(atmel_pcm_pdc_platform_unregister); diff --git a/sound/soc/atmel/atmel-pdmic.c b/sound/soc/atmel/atmel-pdmic.c index 8e3d34be9e69..915c2b064de1 100644 --- a/sound/soc/atmel/atmel-pdmic.c +++ b/sound/soc/atmel/atmel-pdmic.c @@ -32,6 +32,7 @@ struct atmel_pdmic { struct regmap *regmap; struct clk *pclk; struct clk *gclk; + struct device *dev; int irq; struct snd_pcm_substream *substream; const struct atmel_pdmic_pdata *pdata; @@ -206,7 +207,7 @@ atmel_pdmic_platform_configure_dma(struct snd_pcm_substream *substream, ret = snd_hwparams_to_dma_slave_config(substream, params, slave_config); if (ret) { - dev_err(rtd->platform->dev, + dev_err(dd->dev, "hw params to dma slave configure failed\n"); return ret; } @@ -288,14 +289,14 @@ static const DECLARE_TLV_DB_RANGE(mic_gain_tlv, static int pdmic_get_mic_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int dgain_val, scale_val; int i; - dgain_val = (snd_soc_read(codec, PDMIC_DSPR1) & PDMIC_DSPR1_DGAIN_MASK) + dgain_val = (snd_soc_component_read32(component, PDMIC_DSPR1) & PDMIC_DSPR1_DGAIN_MASK) >> PDMIC_DSPR1_DGAIN_SHIFT; - scale_val = (snd_soc_read(codec, PDMIC_DSPR0) & PDMIC_DSPR0_SCALE_MASK) + scale_val = (snd_soc_component_read32(component, PDMIC_DSPR0) & PDMIC_DSPR0_SCALE_MASK) >> PDMIC_DSPR0_SCALE_SHIFT; for (i = 0; i < ARRAY_SIZE(mic_gain_table); i++) { @@ -312,7 +313,7 @@ static int pdmic_put_mic_volsw(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int max = mc->max; unsigned int val; int ret; @@ -322,12 +323,12 @@ static int pdmic_put_mic_volsw(struct snd_kcontrol *kcontrol, if (val > max) return -EINVAL; - ret = snd_soc_update_bits(codec, PDMIC_DSPR1, PDMIC_DSPR1_DGAIN_MASK, + ret = snd_soc_component_update_bits(component, PDMIC_DSPR1, PDMIC_DSPR1_DGAIN_MASK, mic_gain_table[val].dgain << PDMIC_DSPR1_DGAIN_SHIFT); if (ret < 0) return ret; - ret = snd_soc_update_bits(codec, PDMIC_DSPR0, PDMIC_DSPR0_SCALE_MASK, + ret = snd_soc_component_update_bits(component, PDMIC_DSPR0, PDMIC_DSPR0_SCALE_MASK, mic_gain_table[val].scale << PDMIC_DSPR0_SCALE_SHIFT); if (ret < 0) return ret; @@ -346,23 +347,25 @@ SOC_SINGLE("High Pass Filter Switch", PDMIC_DSPR0, SOC_SINGLE("SINCC Filter Switch", PDMIC_DSPR0, PDMIC_DSPR0_SINBYP_SHIFT, 1, 1), }; -static int atmel_pdmic_codec_probe(struct snd_soc_codec *codec) +static int atmel_pdmic_component_probe(struct snd_soc_component *component) { - struct snd_soc_card *card = snd_soc_codec_get_drvdata(codec); + struct snd_soc_card *card = snd_soc_component_get_drvdata(component); struct atmel_pdmic *dd = snd_soc_card_get_drvdata(card); - snd_soc_update_bits(codec, PDMIC_DSPR1, PDMIC_DSPR1_OFFSET_MASK, + snd_soc_component_update_bits(component, PDMIC_DSPR1, PDMIC_DSPR1_OFFSET_MASK, (u32)(dd->pdata->mic_offset << PDMIC_DSPR1_OFFSET_SHIFT)); return 0; } -static struct snd_soc_codec_driver soc_codec_dev_pdmic = { - .probe = atmel_pdmic_codec_probe, - .component_driver = { - .controls = atmel_pdmic_snd_controls, - .num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls), - }, +static struct snd_soc_component_driver soc_component_dev_pdmic = { + .probe = atmel_pdmic_component_probe, + .controls = atmel_pdmic_snd_controls, + .num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* codec dai component */ @@ -375,7 +378,7 @@ atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct atmel_pdmic *dd = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; unsigned int rate_min = substream->runtime->hw.rate_min; unsigned int rate_max = substream->runtime->hw.rate_max; int fs = params_rate(params); @@ -385,13 +388,13 @@ atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream, u32 mr_val, dspr0_val, pclk_prescal, gclk_prescal; if (params_channels(params) != 1) { - dev_err(codec->dev, + dev_err(component->dev, "only supports one channel\n"); return -EINVAL; } if ((fs < rate_min) || (fs > rate_max)) { - dev_err(codec->dev, + dev_err(component->dev, "sample rate is %dHz, min rate is %dHz, max rate is %dHz\n", fs, rate_min, rate_max); @@ -436,10 +439,10 @@ atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream, mr_val |= PDMIC_MR_CLKS_PCK << PDMIC_MR_CLKS_SHIFT; } - snd_soc_update_bits(codec, PDMIC_MR, + snd_soc_component_update_bits(component, PDMIC_MR, PDMIC_MR_PRESCAL_MASK | PDMIC_MR_CLKS_MASK, mr_val); - snd_soc_update_bits(codec, PDMIC_DSPR0, + snd_soc_component_update_bits(component, PDMIC_DSPR0, PDMIC_DSPR0_OSR_MASK | PDMIC_DSPR0_SIZE_MASK, dspr0_val); return 0; @@ -448,9 +451,9 @@ atmel_pdmic_codec_dai_hw_params(struct snd_pcm_substream *substream, static int atmel_pdmic_codec_dai_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; - snd_soc_update_bits(codec, PDMIC_CR, PDMIC_CR_ENPDM_MASK, + snd_soc_component_update_bits(component, PDMIC_CR, PDMIC_CR_ENPDM_MASK, PDMIC_CR_ENPDM_DIS << PDMIC_CR_ENPDM_SHIFT); return 0; @@ -459,7 +462,7 @@ static int atmel_pdmic_codec_dai_prepare(struct snd_pcm_substream *substream, static int atmel_pdmic_codec_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *codec_dai) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u32 val; switch (cmd) { @@ -477,7 +480,7 @@ static int atmel_pdmic_codec_dai_trigger(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, PDMIC_CR, PDMIC_CR_ENPDM_MASK, val); + snd_soc_component_update_bits(component, PDMIC_CR, PDMIC_CR_ENPDM_MASK, val); return 0; } @@ -596,6 +599,7 @@ static int atmel_pdmic_probe(struct platform_device *pdev) return -ENOMEM; dd->pdata = pdata; + dd->dev = dev; dd->irq = platform_get_irq(pdev, 0); if (dd->irq < 0) { @@ -629,11 +633,8 @@ static int atmel_pdmic_probe(struct platform_device *pdev) res = platform_get_resource(pdev, IORESOURCE_MEM, 0); io_base = devm_ioremap_resource(dev, res); - if (IS_ERR(io_base)) { - ret = PTR_ERR(io_base); - dev_err(dev, "failed to remap register memory: %d\n", ret); - return ret; - } + if (IS_ERR(io_base)) + return PTR_ERR(io_base); dd->phy_base = res->start; @@ -679,10 +680,10 @@ static int atmel_pdmic_probe(struct platform_device *pdev) /* register codec and codec dai */ atmel_pdmic_codec_dai.capture.rate_min = rate_min; atmel_pdmic_codec_dai.capture.rate_max = rate_max; - ret = snd_soc_register_codec(dev, &soc_codec_dev_pdmic, + ret = devm_snd_soc_register_component(dev, &soc_component_dev_pdmic, &atmel_pdmic_codec_dai, 1); if (ret) { - dev_err(dev, "could not register codec: %d\n", ret); + dev_err(dev, "could not register component: %d\n", ret); return ret; } @@ -710,13 +711,11 @@ static int atmel_pdmic_probe(struct platform_device *pdev) return 0; unregister_codec: - snd_soc_unregister_codec(dev); return ret; } static int atmel_pdmic_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/au1x/dbdma2.c b/sound/soc/au1x/dbdma2.c index 6a035ca0f521..fb650659c3a3 100644 --- a/sound/soc/au1x/dbdma2.c +++ b/sound/soc/au1x/dbdma2.c @@ -32,6 +32,8 @@ /*#define PCM_DEBUG*/ +#define DRV_NAME "dbdma2" + #define MSG(x...) printk(KERN_INFO "au1xpsc_pcm: " x) #ifdef PCM_DEBUG #define DBG MSG @@ -187,8 +189,8 @@ out: static inline struct au1xpsc_audio_dmadata *to_dmadata(struct snd_pcm_substream *ss) { struct snd_soc_pcm_runtime *rtd = ss->private_data; - struct au1xpsc_audio_dmadata *pcd = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct au1xpsc_audio_dmadata *pcd = snd_soc_component_get_drvdata(component); return &pcd[ss->stream]; } @@ -327,7 +329,8 @@ static int au1xpsc_pcm_new(struct snd_soc_pcm_runtime *rtd) } /* au1xpsc audio platform */ -static struct snd_soc_platform_driver au1xpsc_soc_platform = { +static struct snd_soc_component_driver au1xpsc_soc_component = { + .name = DRV_NAME, .ops = &au1xpsc_pcm_ops, .pcm_new = au1xpsc_pcm_new, }; @@ -344,8 +347,8 @@ static int au1xpsc_pcm_drvprobe(struct platform_device *pdev) platform_set_drvdata(pdev, dmadata); - return devm_snd_soc_register_platform(&pdev->dev, - &au1xpsc_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, + &au1xpsc_soc_component, NULL, 0); } static struct platform_driver au1xpsc_pcm_driver = { diff --git a/sound/soc/au1x/dma.c b/sound/soc/au1x/dma.c index 19457e2b351e..efff1e293a1b 100644 --- a/sound/soc/au1x/dma.c +++ b/sound/soc/au1x/dma.c @@ -21,6 +21,8 @@ #include "psc.h" +#define DRV_NAME "au1x_dma" + struct pcm_period { u32 start; u32 relative_end; /* relative to start of buffer */ @@ -174,7 +176,8 @@ static const struct snd_pcm_hardware alchemy_pcm_hardware = { static inline struct alchemy_pcm_ctx *ss_to_ctx(struct snd_pcm_substream *ss) { struct snd_soc_pcm_runtime *rtd = ss->private_data; - return snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + return snd_soc_component_get_drvdata(component); } static inline struct audio_stream *ss_to_as(struct snd_pcm_substream *ss) @@ -297,7 +300,8 @@ static int alchemy_pcm_new(struct snd_soc_pcm_runtime *rtd) return 0; } -static struct snd_soc_platform_driver alchemy_pcm_soc_platform = { +static struct snd_soc_component_driver alchemy_pcm_soc_component = { + .name = DRV_NAME, .ops = &alchemy_pcm_ops, .pcm_new = alchemy_pcm_new, }; @@ -312,8 +316,8 @@ static int alchemy_pcm_drvprobe(struct platform_device *pdev) platform_set_drvdata(pdev, ctx); - return devm_snd_soc_register_platform(&pdev->dev, - &alchemy_pcm_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, + &alchemy_pcm_soc_component, NULL, 0); } static struct platform_driver alchemy_pcmdma_driver = { diff --git a/sound/soc/bcm/cygnus-pcm.c b/sound/soc/bcm/cygnus-pcm.c index d616e096462e..123ecf5479d7 100644 --- a/sound/soc/bcm/cygnus-pcm.c +++ b/sound/soc/bcm/cygnus-pcm.c @@ -820,7 +820,7 @@ static int cygnus_dma_new(struct snd_soc_pcm_runtime *rtd) return 0; } -static struct snd_soc_platform_driver cygnus_soc_platform = { +static struct snd_soc_component_driver cygnus_soc_platform = { .ops = &cygnus_pcm_ops, .pcm_new = cygnus_dma_new, .pcm_free = cygnus_dma_free_dma_buffers, @@ -840,7 +840,8 @@ int cygnus_soc_platform_register(struct device *dev, return rc; } - rc = snd_soc_register_platform(dev, &cygnus_soc_platform); + rc = devm_snd_soc_register_component(dev, &cygnus_soc_platform, + NULL, 0); if (rc) { dev_err(dev, "%s failed\n", __func__); return rc; @@ -851,8 +852,6 @@ int cygnus_soc_platform_register(struct device *dev, int cygnus_soc_platform_unregister(struct device *dev) { - snd_soc_unregister_platform(dev); - return 0; } diff --git a/sound/soc/bcm/cygnus-ssp.c b/sound/soc/bcm/cygnus-ssp.c index abafadc0b534..b733f1446353 100644 --- a/sound/soc/bcm/cygnus-ssp.c +++ b/sound/soc/bcm/cygnus-ssp.c @@ -1281,7 +1281,7 @@ static int cygnus_ssp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *child_node; - struct resource *res = pdev->resource; + struct resource *res; struct cygnus_audio *cygaud; int err = -EINVAL; int node_count; diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig deleted file mode 100644 index 6410aa2cc2cf..000000000000 --- a/sound/soc/blackfin/Kconfig +++ /dev/null @@ -1,205 +0,0 @@ -config SND_BF5XX_I2S - tristate "SoC I2S Audio for the ADI Blackfin chip" - depends on BLACKFIN - select SND_BF5XX_SOC_SPORT if !BF60x - select SND_BF6XX_SOC_SPORT if BF60x - help - Say Y or M if you want to add support for codecs attached to - the Blackfin SPORT (synchronous serial ports) interface in I2S - mode (supports single stereo In/Out). - You will also need to select the audio interfaces to support below. - -config SND_BF5XX_SOC_SSM2602 - tristate "SoC SSM2602 Audio Codec Add-On Card support" - depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI - select SND_BF5XX_SOC_I2S if !BF60x - select SND_BF6XX_SOC_I2S if BF60x - select SND_SOC_SSM2602_SPI if SPI_MASTER - select SND_SOC_SSM2602_I2C if I2C - help - Say Y if you want to add support for the Analog Devices - SSM2602 Audio Codec Add-On Card. - -config SND_SOC_BFIN_EVAL_ADAU1701 - tristate "Support for the EVAL-ADAU1701MINIZ board on Blackfin eval boards" - depends on SND_BF5XX_I2S && I2C - select SND_BF5XX_SOC_I2S - select SND_SOC_ADAU1701 - help - Say Y if you want to add support for the Analog Devices EVAL-ADAU1701MINIZ - board connected to one of the Blackfin evaluation boards like the - BF5XX-STAMP or BF5XX-EZKIT. - -config SND_SOC_BFIN_EVAL_ADAU1373 - tristate "Support for the EVAL-ADAU1373 board on Blackfin eval boards" - depends on SND_BF5XX_I2S && I2C - select SND_BF5XX_SOC_I2S - select SND_SOC_ADAU1373 - help - Say Y if you want to add support for the Analog Devices EVAL-ADAU1373 - board connected to one of the Blackfin evaluation boards like the - BF5XX-STAMP or BF5XX-EZKIT. - - Note: This driver assumes that first ADAU1373 DAI is connected to the - first SPORT port on the BF5XX board. - -config SND_SOC_BFIN_EVAL_ADAU1X61 - tristate "Support for the EVAL-ADAU1X61 board on Blackfin eval boards" - depends on SND_BF5XX_I2S && I2C - select SND_BF5XX_SOC_I2S - select SND_SOC_ADAU1761_I2C - help - Say Y if you want to add support for the Analog Devices EVAL-ADAU1X61 - board connected to one of the Blackfin evaluation boards like the - BF5XX-STAMP or BF5XX-EZKIT. - - Note: This driver assumes that the ADAU1X61 is connected to the - first SPORT port on the BF5XX board. - -config SND_SOC_BFIN_EVAL_ADAU1X81 - tristate "Support for the EVAL-ADAU1X81 boards on Blackfin eval boards" - depends on SND_BF5XX_I2S && I2C - select SND_BF5XX_SOC_I2S - select SND_SOC_ADAU1781_I2C - help - Say Y if you want to add support for the Analog Devices EVAL-ADAU1X81 - board connected to one of the Blackfin evaluation boards like the - BF5XX-STAMP or BF5XX-EZKIT. - - Note: This driver assumes that the ADAU1X81 is connected to the - first SPORT port on the BF5XX board. - -config SND_SOC_BFIN_EVAL_ADAV80X - tristate "Support for the EVAL-ADAV80X boards on Blackfin eval boards" - depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI - select SND_BF5XX_SOC_I2S - select SND_SOC_ADAV801 if SPI_MASTER - select SND_SOC_ADAV803 if I2C - help - Say Y if you want to add support for the Analog Devices EVAL-ADAV801 or - EVAL-ADAV803 board connected to one of the Blackfin evaluation boards - like the BF5XX-STAMP or BF5XX-EZKIT. - - Note: This driver assumes that the ADAV80X digital record and playback - interfaces are connected to the first SPORT port on the BF5XX board. - -config SND_BF5XX_SOC_AD1836 - tristate "SoC AD1836 Audio support for BF5xx" - depends on SND_BF5XX_I2S && SPI_MASTER - select SND_BF5XX_SOC_I2S - select SND_SOC_AD1836 - help - Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. - -config SND_BF5XX_SOC_AD193X - tristate "SoC AD193X Audio support for Blackfin" - depends on SND_BF5XX_I2S && SND_SOC_I2C_AND_SPI - select SND_BF5XX_SOC_I2S - select SND_SOC_AD193X_I2C if I2C - select SND_SOC_AD193X_SPI if SPI_MASTER - help - Say Y if you want to add support for AD193X codec on Blackfin. - This driver supports AD1936, AD1937, AD1938 and AD1939. - -config SND_BF5XX_SOC_AD73311 - tristate "SoC AD73311 Audio support for Blackfin" - depends on SND_BF5XX_I2S - select SND_BF5XX_SOC_I2S - select SND_SOC_AD73311 - help - Say Y if you want to add support for AD73311 codec on Blackfin. - -config SND_BFIN_AD73311_SE - int "PF pin for AD73311L Chip Select" - depends on SND_BF5XX_SOC_AD73311 - default 4 - help - Enter the GPIO used to control AD73311's SE pin. Acceptable - values are 0 to 7 - -config SND_BF5XX_AC97 - tristate "SoC AC97 Audio for the ADI BF5xx chip" - depends on BLACKFIN - select AC97_BUS - select SND_SOC_AC97_BUS - select SND_BF5XX_SOC_SPORT - select SND_BF5XX_SOC_AC97 - help - Say Y or M if you want to add support for codecs attached to - the Blackfin SPORT (synchronous serial ports) interface in slot 16 - mode (pseudo AC97 interface). - You will also need to select the audio interfaces to support below. - - Note: - AC97 codecs which do not implement the slot-16 mode will not function - properly with this driver. This driver is known to work with the - Analog Devices line of AC97 codecs. - -config SND_BF5XX_MMAP_SUPPORT - bool "Enable MMAP Support" - depends on SND_BF5XX_AC97 - default y - help - Say y if you want AC97 driver to support mmap mode. - We introduce an intermediate buffer to simulate mmap. - -config SND_BF5XX_MULTICHAN_SUPPORT - bool "Enable Multichannel Support" - depends on SND_BF5XX_AC97 - default n - help - Say y if you want AC97 driver to support up to 5.1 channel audio. - this mode will consume much more memory for DMA. - -config SND_BF5XX_HAVE_COLD_RESET - bool "BOARD has COLD Reset GPIO" - depends on SND_BF5XX_AC97 - default y if BFIN548_EZKIT - default n if !BFIN548_EZKIT - -config SND_BF5XX_RESET_GPIO_NUM - int "Set a GPIO for cold reset" - depends on SND_BF5XX_HAVE_COLD_RESET - range 0 159 - default 19 if BFIN548_EZKIT - default 5 if BFIN537_STAMP - default 0 - help - Set the correct GPIO for RESET the sound chip. - -config SND_BF5XX_SOC_AD1980 - tristate "SoC AD1980/1 Audio support for BF5xx (Obsolete)" - depends on SND_BF5XX_AC97 - select SND_BF5XX_SOC_AC97 - select SND_SOC_AD1980 - help - Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. - - Warning: - Because Analog Devices Inc. discontinued the ad1980 sound chip since - Sep. 2009, this ad1980 driver is not maintained, tested and supported - by ADI now. - -config SND_BF5XX_SOC_SPORT - tristate - -config SND_BF6XX_SOC_SPORT - tristate - -config SND_BF5XX_SOC_I2S - tristate - -config SND_BF6XX_SOC_I2S - tristate - -config SND_BF5XX_SOC_AC97 - tristate - -config SND_BF5XX_SPORT_NUM - int "Set a SPORT for Sound chip" - depends on (SND_BF5XX_SOC_SPORT || SND_BF6XX_SOC_SPORT) - range 0 3 if BF54x - range 0 1 if !BF54x - default 0 - help - Set the correct SPORT for sound chip. diff --git a/sound/soc/blackfin/Makefile b/sound/soc/blackfin/Makefile deleted file mode 100644 index ebeb6a9cedd2..000000000000 --- a/sound/soc/blackfin/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Blackfin Platform Support -snd-bf5xx-ac97-objs := bf5xx-ac97-pcm.o -snd-bf5xx-i2s-objs := bf5xx-i2s-pcm.o -snd-soc-bf5xx-sport-objs := bf5xx-sport.o -snd-soc-bf6xx-sport-objs := bf6xx-sport.o -snd-soc-bf5xx-ac97-objs := bf5xx-ac97.o -snd-soc-bf5xx-i2s-objs := bf5xx-i2s.o -snd-soc-bf6xx-i2s-objs := bf6xx-i2s.o - -obj-$(CONFIG_SND_BF5XX_AC97) += snd-bf5xx-ac97.o -obj-$(CONFIG_SND_BF5XX_I2S) += snd-bf5xx-i2s.o -obj-$(CONFIG_SND_BF5XX_SOC_SPORT) += snd-soc-bf5xx-sport.o -obj-$(CONFIG_SND_BF6XX_SOC_SPORT) += snd-soc-bf6xx-sport.o -obj-$(CONFIG_SND_BF5XX_SOC_AC97) += snd-soc-bf5xx-ac97.o -obj-$(CONFIG_SND_BF5XX_SOC_I2S) += snd-soc-bf5xx-i2s.o -obj-$(CONFIG_SND_BF6XX_SOC_I2S) += snd-soc-bf6xx-i2s.o - -# Blackfin Machine Support -snd-ad1836-objs := bf5xx-ad1836.o -snd-ad1980-objs := bf5xx-ad1980.o -snd-ssm2602-objs := bf5xx-ssm2602.o -snd-ad73311-objs := bf5xx-ad73311.o -snd-ad193x-objs := bf5xx-ad193x.o -snd-soc-bfin-eval-adau1373-objs := bfin-eval-adau1373.o -snd-soc-bfin-eval-adau1x61-objs := bfin-eval-adau1x61.o -snd-soc-bfin-eval-adau1x81-objs := bfin-eval-adau1x81.o -snd-soc-bfin-eval-adau1701-objs := bfin-eval-adau1701.o -snd-soc-bfin-eval-adav80x-objs := bfin-eval-adav80x.o - -obj-$(CONFIG_SND_BF5XX_SOC_AD1836) += snd-ad1836.o -obj-$(CONFIG_SND_BF5XX_SOC_AD1980) += snd-ad1980.o -obj-$(CONFIG_SND_BF5XX_SOC_SSM2602) += snd-ssm2602.o -obj-$(CONFIG_SND_BF5XX_SOC_AD73311) += snd-ad73311.o -obj-$(CONFIG_SND_BF5XX_SOC_AD193X) += snd-ad193x.o -obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1373) += snd-soc-bfin-eval-adau1373.o -obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X61) += snd-soc-bfin-eval-adau1x61.o -obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1X81) += snd-soc-bfin-eval-adau1x81.o -obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1701) += snd-soc-bfin-eval-adau1701.o -obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAV80X) += snd-soc-bfin-eval-adav80x.o diff --git a/sound/soc/blackfin/bf5xx-ac97-pcm.c b/sound/soc/blackfin/bf5xx-ac97-pcm.c deleted file mode 100644 index 8c1d1983b8f9..000000000000 --- a/sound/soc/blackfin/bf5xx-ac97-pcm.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ac97-pcm.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Tue June 06 2008 - * Description: DMA Driver for AC97 sound chip - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/dma-mapping.h> -#include <linux/gfp.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/soc.h> - -#include <asm/dma.h> - -#include "bf5xx-ac97.h" -#include "bf5xx-sport.h" - -static unsigned int ac97_chan_mask[] = { - SP_FL, /* Mono */ - SP_STEREO, /* Stereo */ - SP_2DOT1, /* 2.1*/ - SP_QUAD,/*Quadraquic*/ - SP_FL | SP_FR | SP_FC | SP_SL | SP_SR,/*5 channels */ - SP_5DOT1, /* 5.1 */ -}; - -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) -static void bf5xx_mmap_copy(struct snd_pcm_substream *substream, - snd_pcm_uframes_t count) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - unsigned int chan_mask = ac97_chan_mask[runtime->channels - 1]; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - bf5xx_pcm_to_ac97((struct ac97_frame *)sport->tx_dma_buf + - sport->tx_pos, (__u16 *)runtime->dma_area + sport->tx_pos * - runtime->channels, count, chan_mask); - sport->tx_pos += runtime->period_size; - if (sport->tx_pos >= runtime->buffer_size) - sport->tx_pos %= runtime->buffer_size; - sport->tx_delay_pos = sport->tx_pos; - } else { - bf5xx_ac97_to_pcm((struct ac97_frame *)sport->rx_dma_buf + - sport->rx_pos, (__u16 *)runtime->dma_area + sport->rx_pos * - runtime->channels, count); - sport->rx_pos += runtime->period_size; - if (sport->rx_pos >= runtime->buffer_size) - sport->rx_pos %= runtime->buffer_size; - } -} -#endif - -static void bf5xx_dma_irq(void *data) -{ - struct snd_pcm_substream *pcm = data; -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - struct snd_pcm_runtime *runtime = pcm->runtime; - struct sport_device *sport = runtime->private_data; - bf5xx_mmap_copy(pcm, runtime->period_size); - if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (sport->once == 0) { - snd_pcm_period_elapsed(pcm); - bf5xx_mmap_copy(pcm, runtime->period_size); - sport->once = 1; - } - } -#endif - snd_pcm_period_elapsed(pcm); -} - -/* The memory size for pure pcm data is 128*1024 = 0x20000 bytes. - * The total rx/tx buffer is for ac97 frame to hold all pcm data - * is 0x20000 * sizeof(struct ac97_frame) / 4. - */ -static const struct snd_pcm_hardware bf5xx_pcm_hardware = { - .info = SNDRV_PCM_INFO_INTERLEAVED | -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_MMAP_VALID | -#endif - SNDRV_PCM_INFO_BLOCK_TRANSFER, - - .period_bytes_min = 32, - .period_bytes_max = 0x10000, - .periods_min = 1, - .periods_max = PAGE_SIZE/32, - .buffer_bytes_max = 0x20000, /* 128 kbytes */ - .fifo_size = 16, -}; - -static int bf5xx_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - size_t size = bf5xx_pcm_hardware.buffer_bytes_max - * sizeof(struct ac97_frame) / 4; - - snd_pcm_lib_malloc_pages(substream, size); - - return 0; -} - -static int bf5xx_pcm_hw_free(struct snd_pcm_substream *substream) -{ -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sport->once = 0; - if (runtime->dma_area) - memset(runtime->dma_area, 0, runtime->buffer_size); - memset(sport->tx_dma_buf, 0, runtime->buffer_size * - sizeof(struct ac97_frame)); - } else - memset(sport->rx_dma_buf, 0, runtime->buffer_size * - sizeof(struct ac97_frame)); -#endif - snd_pcm_lib_free_pages(substream); - return 0; -} - -static int bf5xx_pcm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - - /* An intermediate buffer is introduced for implementing mmap for - * SPORT working in TMD mode(include AC97). - */ -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sport_set_tx_callback(sport, bf5xx_dma_irq, substream); - sport_config_tx_dma(sport, sport->tx_dma_buf, runtime->periods, - runtime->period_size * sizeof(struct ac97_frame)); - } else { - sport_set_rx_callback(sport, bf5xx_dma_irq, substream); - sport_config_rx_dma(sport, sport->rx_dma_buf, runtime->periods, - runtime->period_size * sizeof(struct ac97_frame)); - } -#else - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sport_set_tx_callback(sport, bf5xx_dma_irq, substream); - sport_config_tx_dma(sport, runtime->dma_area, runtime->periods, - runtime->period_size * sizeof(struct ac97_frame)); - } else { - sport_set_rx_callback(sport, bf5xx_dma_irq, substream); - sport_config_rx_dma(sport, runtime->dma_area, runtime->periods, - runtime->period_size * sizeof(struct ac97_frame)); - } -#endif - return 0; -} - -static int bf5xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - int ret = 0; - - pr_debug("%s enter\n", __func__); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - bf5xx_mmap_copy(substream, runtime->period_size); - sport->tx_delay_pos = 0; -#endif - sport_tx_start(sport); - } else - sport_rx_start(sport); - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - sport->tx_pos = 0; -#endif - sport_tx_stop(sport); - } else { -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - sport->rx_pos = 0; -#endif - sport_rx_stop(sport); - } - break; - default: - ret = -EINVAL; - } - return ret; -} - -static snd_pcm_uframes_t bf5xx_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - unsigned int curr; - -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - curr = sport->tx_delay_pos; - else - curr = sport->rx_pos; -#else - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - curr = sport_curr_offset_tx(sport) / sizeof(struct ac97_frame); - else - curr = sport_curr_offset_rx(sport) / sizeof(struct ac97_frame); - -#endif - return curr; -} - -static int bf5xx_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(cpu_dai); - struct snd_pcm_runtime *runtime = substream->runtime; - int ret; - - pr_debug("%s enter\n", __func__); - snd_soc_set_runtime_hwparams(substream, &bf5xx_pcm_hardware); - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - goto out; - - if (sport_handle != NULL) - runtime->private_data = sport_handle; - else { - pr_err("sport_handle is NULL\n"); - return -1; - } - return 0; - - out: - return ret; -} - -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) -static int bf5xx_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - size_t size = vma->vm_end - vma->vm_start; - vma->vm_start = (unsigned long)runtime->dma_area; - vma->vm_end = vma->vm_start + size; - vma->vm_flags |= VM_SHARED; - return 0 ; -} -#else -static int bf5xx_pcm_copy(struct snd_pcm_substream *substream, - int channel, unsigned long pos, - void *buf, unsigned long count) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - unsigned int chan_mask = ac97_chan_mask[runtime->channels - 1]; - struct ac97_frame *dst; - - pr_debug("%s copy pos:0x%lx count:0x%lx\n", - substream->stream ? "Capture" : "Playback", pos, count); - dst = (struct ac97_frame *)runtime->dma_area + - bytes_to_frames(runtime, pos); - count = bytes_to_frames(runtime, count); - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - bf5xx_pcm_to_ac97(dst, buf, count, chan_mask); - else - bf5xx_ac97_to_pcm(dst, buf, count); - return 0; -} - -static int bf5xx_pcm_copy_user(struct snd_pcm_substream *substream, - int channel, unsigned long pos, - void __user *buf, unsigned long count) -{ - return bf5xx_pcm_copy(substream, channel, pos, (void *)buf, count); -} -#endif - -static const struct snd_pcm_ops bf5xx_pcm_ac97_ops = { - .open = bf5xx_pcm_open, - .ioctl = snd_pcm_lib_ioctl, - .hw_params = bf5xx_pcm_hw_params, - .hw_free = bf5xx_pcm_hw_free, - .prepare = bf5xx_pcm_prepare, - .trigger = bf5xx_pcm_trigger, - .pointer = bf5xx_pcm_pointer, -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - .mmap = bf5xx_pcm_mmap, -#else - .copy_user = bf5xx_pcm_copy_user, - .copy_kernel = bf5xx_pcm_copy, -#endif -}; - -static int bf5xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) -{ - struct snd_soc_pcm_runtime *rtd = pcm->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(cpu_dai); - struct snd_pcm_substream *substream = pcm->streams[stream].substream; - struct snd_dma_buffer *buf = &substream->dma_buffer; - size_t size = bf5xx_pcm_hardware.buffer_bytes_max - * sizeof(struct ac97_frame) / 4; - - buf->dev.type = SNDRV_DMA_TYPE_DEV; - buf->dev.dev = pcm->card->dev; - buf->private_data = NULL; - buf->area = dma_alloc_coherent(pcm->card->dev, size, - &buf->addr, GFP_KERNEL); - if (!buf->area) { - pr_err("Failed to allocate dma memory\n"); - pr_err("Please increase uncached DMA memory region\n"); - return -ENOMEM; - } - buf->bytes = size; - - pr_debug("%s, area:%p, size:0x%08lx\n", __func__, - buf->area, buf->bytes); - - if (stream == SNDRV_PCM_STREAM_PLAYBACK) - sport_handle->tx_buf = buf->area; - else - sport_handle->rx_buf = buf->area; - -/* - * Need to allocate local buffer when enable - * MMAP for SPORT working in TMD mode (include AC97). - */ -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (!sport_handle->tx_dma_buf) { - sport_handle->tx_dma_buf = dma_alloc_coherent(NULL, \ - size, &sport_handle->tx_dma_phy, GFP_KERNEL); - if (!sport_handle->tx_dma_buf) { - pr_err("Failed to allocate memory for tx dma buf - Please increase uncached DMA memory region\n"); - return -ENOMEM; - } else - memset(sport_handle->tx_dma_buf, 0, size); - } else - memset(sport_handle->tx_dma_buf, 0, size); - } else { - if (!sport_handle->rx_dma_buf) { - sport_handle->rx_dma_buf = dma_alloc_coherent(NULL, \ - size, &sport_handle->rx_dma_phy, GFP_KERNEL); - if (!sport_handle->rx_dma_buf) { - pr_err("Failed to allocate memory for rx dma buf - Please increase uncached DMA memory region\n"); - return -ENOMEM; - } else - memset(sport_handle->rx_dma_buf, 0, size); - } else - memset(sport_handle->rx_dma_buf, 0, size); - } -#endif - return 0; -} - -static void bf5xx_pcm_free_dma_buffers(struct snd_pcm *pcm) -{ - struct snd_pcm_substream *substream; - struct snd_dma_buffer *buf; - int stream; -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - struct snd_soc_pcm_runtime *rtd = pcm->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(cpu_dai); - size_t size = bf5xx_pcm_hardware.buffer_bytes_max * - sizeof(struct ac97_frame) / 4; -#endif - for (stream = 0; stream < 2; stream++) { - substream = pcm->streams[stream].substream; - if (!substream) - continue; - - buf = &substream->dma_buffer; - if (!buf->area) - continue; - dma_free_coherent(NULL, buf->bytes, buf->area, 0); - buf->area = NULL; -#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT) - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - if (sport_handle->tx_dma_buf) - dma_free_coherent(NULL, size, \ - sport_handle->tx_dma_buf, 0); - sport_handle->tx_dma_buf = NULL; - } else { - - if (sport_handle->rx_dma_buf) - dma_free_coherent(NULL, size, \ - sport_handle->rx_dma_buf, 0); - sport_handle->rx_dma_buf = NULL; - } -#endif - } -} - -static int bf5xx_pcm_ac97_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - struct snd_pcm *pcm = rtd->pcm; - int ret; - - pr_debug("%s enter\n", __func__); - ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; - - if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { - ret = bf5xx_pcm_preallocate_dma_buffer(pcm, - SNDRV_PCM_STREAM_PLAYBACK); - if (ret) - goto out; - } - - if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { - ret = bf5xx_pcm_preallocate_dma_buffer(pcm, - SNDRV_PCM_STREAM_CAPTURE); - if (ret) - goto out; - } - out: - return ret; -} - -static struct snd_soc_platform_driver bf5xx_ac97_soc_platform = { - .ops = &bf5xx_pcm_ac97_ops, - .pcm_new = bf5xx_pcm_ac97_new, - .pcm_free = bf5xx_pcm_free_dma_buffers, -}; - -static int bf5xx_soc_platform_probe(struct platform_device *pdev) -{ - return devm_snd_soc_register_platform(&pdev->dev, - &bf5xx_ac97_soc_platform); -} - -static struct platform_driver bf5xx_pcm_driver = { - .driver = { - .name = "bfin-ac97-pcm-audio", - }, - - .probe = bf5xx_soc_platform_probe, -}; - -module_platform_driver(bf5xx_pcm_driver); - -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ADI Blackfin AC97 PCM DMA module"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-ac97.c b/sound/soc/blackfin/bf5xx-ac97.c deleted file mode 100644 index a040cfe29fc0..000000000000 --- a/sound/soc/blackfin/bf5xx-ac97.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * bf5xx-ac97.c -- AC97 support for the ADI blackfin chip. - * - * Author: Roy Huang - * Created: 11th. June 2007 - * Copyright: Analog Device Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <linux/init.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/interrupt.h> -#include <linux/wait.h> -#include <linux/delay.h> -#include <linux/slab.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/ac97_codec.h> -#include <sound/initval.h> -#include <sound/soc.h> - -#include <asm/irq.h> -#include <asm/portmux.h> -#include <linux/mutex.h> -#include <linux/gpio.h> - -#include "bf5xx-sport.h" -#include "bf5xx-ac97.h" - -/* Anomaly notes: - * 05000250 - AD1980 is running in TDM mode and RFS/TFS are generated by SPORT - * contrtoller. But, RFSDIV and TFSDIV are always set to 16*16-1, - * while the max AC97 data size is 13*16. The DIV is always larger - * than data size. AD73311 and ad2602 are not running in TDM mode. - * AD1836 and AD73322 depend on external RFS/TFS only. So, this - * anomaly does not affect blackfin sound drivers. -*/ - -static struct sport_device *ac97_sport_handle; - -void bf5xx_pcm_to_ac97(struct ac97_frame *dst, const __u16 *src, - size_t count, unsigned int chan_mask) -{ - while (count--) { - dst->ac97_tag = TAG_VALID; - if (chan_mask & SP_FL) { - dst->ac97_pcm_r = *src++; - dst->ac97_tag |= TAG_PCM_RIGHT; - } - if (chan_mask & SP_FR) { - dst->ac97_pcm_l = *src++; - dst->ac97_tag |= TAG_PCM_LEFT; - - } -#if defined(CONFIG_SND_BF5XX_MULTICHAN_SUPPORT) - if (chan_mask & SP_SR) { - dst->ac97_sl = *src++; - dst->ac97_tag |= TAG_PCM_SL; - } - if (chan_mask & SP_SL) { - dst->ac97_sr = *src++; - dst->ac97_tag |= TAG_PCM_SR; - } - if (chan_mask & SP_LFE) { - dst->ac97_lfe = *src++; - dst->ac97_tag |= TAG_PCM_LFE; - } - if (chan_mask & SP_FC) { - dst->ac97_center = *src++; - dst->ac97_tag |= TAG_PCM_CENTER; - } -#endif - dst++; - } -} -EXPORT_SYMBOL(bf5xx_pcm_to_ac97); - -void bf5xx_ac97_to_pcm(const struct ac97_frame *src, __u16 *dst, - size_t count) -{ - while (count--) { - *(dst++) = src->ac97_pcm_l; - *(dst++) = src->ac97_pcm_r; - src++; - } -} -EXPORT_SYMBOL(bf5xx_ac97_to_pcm); - -static unsigned int sport_tx_curr_frag(struct sport_device *sport) -{ - return sport->tx_curr_frag = sport_curr_offset_tx(sport) / - sport->tx_fragsize; -} - -static void enqueue_cmd(struct snd_ac97 *ac97, __u16 addr, __u16 data) -{ - struct sport_device *sport = ac97_sport_handle; - int *cmd_count = sport->private_data; - int nextfrag = sport_tx_curr_frag(sport); - struct ac97_frame *nextwrite; - - sport_incfrag(sport, &nextfrag, 1); - - nextwrite = (struct ac97_frame *)(sport->tx_buf + - nextfrag * sport->tx_fragsize); - pr_debug("sport->tx_buf:%p, nextfrag:0x%x nextwrite:%p, cmd_count:%d\n", - sport->tx_buf, nextfrag, nextwrite, cmd_count[nextfrag]); - nextwrite[cmd_count[nextfrag]].ac97_tag |= TAG_CMD; - nextwrite[cmd_count[nextfrag]].ac97_addr = addr; - nextwrite[cmd_count[nextfrag]].ac97_data = data; - ++cmd_count[nextfrag]; - pr_debug("ac97_sport: Inserting %02x/%04x into fragment %d\n", - addr >> 8, data, nextfrag); -} - -static unsigned short bf5xx_ac97_read(struct snd_ac97 *ac97, - unsigned short reg) -{ - struct sport_device *sport_handle = ac97_sport_handle; - struct ac97_frame out_frame[2], in_frame[2]; - - pr_debug("%s enter 0x%x\n", __func__, reg); - - /* When dma descriptor is enabled, the register should not be read */ - if (sport_handle->tx_run || sport_handle->rx_run) { - pr_err("Could you send a mail to cliff.cai@analog.com " - "to report this?\n"); - return -EFAULT; - } - - memset(&out_frame, 0, 2 * sizeof(struct ac97_frame)); - memset(&in_frame, 0, 2 * sizeof(struct ac97_frame)); - out_frame[0].ac97_tag = TAG_VALID | TAG_CMD; - out_frame[0].ac97_addr = ((reg << 8) | 0x8000); - sport_send_and_recv(sport_handle, (unsigned char *)&out_frame, - (unsigned char *)&in_frame, - 2 * sizeof(struct ac97_frame)); - return in_frame[1].ac97_data; -} - -void bf5xx_ac97_write(struct snd_ac97 *ac97, unsigned short reg, - unsigned short val) -{ - struct sport_device *sport_handle = ac97_sport_handle; - - pr_debug("%s enter 0x%x:0x%04x\n", __func__, reg, val); - - if (sport_handle->tx_run) { - enqueue_cmd(ac97, (reg << 8), val); /* write */ - enqueue_cmd(ac97, (reg << 8) | 0x8000, 0); /* read back */ - } else { - struct ac97_frame frame; - memset(&frame, 0, sizeof(struct ac97_frame)); - frame.ac97_tag = TAG_VALID | TAG_CMD; - frame.ac97_addr = (reg << 8); - frame.ac97_data = val; - sport_send_and_recv(sport_handle, (unsigned char *)&frame, \ - NULL, sizeof(struct ac97_frame)); - } -} - -static void bf5xx_ac97_warm_reset(struct snd_ac97 *ac97) -{ - struct sport_device *sport_handle = ac97_sport_handle; - u16 gpio = P_IDENT(sport_handle->pin_req[3]); - - pr_debug("%s enter\n", __func__); - - peripheral_free_list(sport_handle->pin_req); - gpio_request(gpio, "bf5xx-ac97"); - gpio_direction_output(gpio, 1); - udelay(2); - gpio_set_value(gpio, 0); - udelay(1); - gpio_free(gpio); - peripheral_request_list(sport_handle->pin_req, "soc-audio"); -} - -static void bf5xx_ac97_cold_reset(struct snd_ac97 *ac97) -{ -#ifdef CONFIG_SND_BF5XX_HAVE_COLD_RESET - pr_debug("%s enter\n", __func__); - - /* It is specified for bf548-ezkit */ - gpio_set_value(CONFIG_SND_BF5XX_RESET_GPIO_NUM, 0); - /* Keep reset pin low for 1 ms */ - mdelay(1); - gpio_set_value(CONFIG_SND_BF5XX_RESET_GPIO_NUM, 1); - /* Wait for bit clock recover */ - mdelay(1); -#else - pr_info("%s: Not implemented\n", __func__); -#endif -} - -static struct snd_ac97_bus_ops bf5xx_ac97_ops = { - .read = bf5xx_ac97_read, - .write = bf5xx_ac97_write, - .warm_reset = bf5xx_ac97_warm_reset, - .reset = bf5xx_ac97_cold_reset, -}; - -#ifdef CONFIG_PM -static int bf5xx_ac97_suspend(struct snd_soc_dai *dai) -{ - struct sport_device *sport = snd_soc_dai_get_drvdata(dai); - - pr_debug("%s : sport %d\n", __func__, dai->id); - if (!dai->active) - return 0; - if (dai->capture_active) - sport_rx_stop(sport); - if (dai->playback_active) - sport_tx_stop(sport); - return 0; -} - -static int bf5xx_ac97_resume(struct snd_soc_dai *dai) -{ - int ret; - struct sport_device *sport = snd_soc_dai_get_drvdata(dai); - - pr_debug("%s : sport %d\n", __func__, dai->id); - if (!dai->active) - return 0; - -#if defined(CONFIG_SND_BF5XX_MULTICHAN_SUPPORT) - ret = sport_set_multichannel(sport, 16, 0x3FF, 0x3FF, 1); -#else - ret = sport_set_multichannel(sport, 16, 0x1F, 0x1F, 1); -#endif - if (ret) { - pr_err("SPORT is busy!\n"); - return -EBUSY; - } - - ret = sport_config_rx(sport, IRFS, 0xF, 0, (16*16-1)); - if (ret) { - pr_err("SPORT is busy!\n"); - return -EBUSY; - } - - ret = sport_config_tx(sport, ITFS, 0xF, 0, (16*16-1)); - if (ret) { - pr_err("SPORT is busy!\n"); - return -EBUSY; - } - - return 0; -} - -#else -#define bf5xx_ac97_suspend NULL -#define bf5xx_ac97_resume NULL -#endif - -static struct snd_soc_dai_driver bfin_ac97_dai = { - .bus_control = true, - .suspend = bf5xx_ac97_suspend, - .resume = bf5xx_ac97_resume, - .playback = { - .stream_name = "AC97 Playback", - .channels_min = 2, -#if defined(CONFIG_SND_BF5XX_MULTICHAN_SUPPORT) - .channels_max = 6, -#else - .channels_max = 2, -#endif - .rates = SNDRV_PCM_RATE_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, }, - .capture = { - .stream_name = "AC97 Capture", - .channels_min = 2, - .channels_max = 2, - .rates = SNDRV_PCM_RATE_48000, - .formats = SNDRV_PCM_FMTBIT_S16_LE, }, -}; - -static const struct snd_soc_component_driver bfin_ac97_component = { - .name = "bfin-ac97", -}; - -static int asoc_bfin_ac97_probe(struct platform_device *pdev) -{ - struct sport_device *sport_handle; - int ret; - -#ifdef CONFIG_SND_BF5XX_HAVE_COLD_RESET - /* Request PB3 as reset pin */ - ret = devm_gpio_request_one(&pdev->dev, - CONFIG_SND_BF5XX_RESET_GPIO_NUM, - GPIOF_OUT_INIT_HIGH, "SND_AD198x RESET"); - if (ret) { - dev_err(&pdev->dev, - "Failed to request GPIO_%d for reset: %d\n", - CONFIG_SND_BF5XX_RESET_GPIO_NUM, ret); - return ret; - } -#endif - - sport_handle = sport_init(pdev, 2, sizeof(struct ac97_frame), - PAGE_SIZE); - if (!sport_handle) { - ret = -ENODEV; - goto sport_err; - } - - /*SPORT works in TDM mode to simulate AC97 transfers*/ -#if defined(CONFIG_SND_BF5XX_MULTICHAN_SUPPORT) - ret = sport_set_multichannel(sport_handle, 16, 0x3FF, 0x3FF, 1); -#else - ret = sport_set_multichannel(sport_handle, 16, 0x1F, 0x1F, 1); -#endif - if (ret) { - pr_err("SPORT is busy!\n"); - ret = -EBUSY; - goto sport_config_err; - } - - ret = sport_config_rx(sport_handle, IRFS, 0xF, 0, (16*16-1)); - if (ret) { - pr_err("SPORT is busy!\n"); - ret = -EBUSY; - goto sport_config_err; - } - - ret = sport_config_tx(sport_handle, ITFS, 0xF, 0, (16*16-1)); - if (ret) { - pr_err("SPORT is busy!\n"); - ret = -EBUSY; - goto sport_config_err; - } - - ret = snd_soc_set_ac97_ops(&bf5xx_ac97_ops); - if (ret != 0) { - dev_err(&pdev->dev, "Failed to set AC'97 ops: %d\n", ret); - goto sport_config_err; - } - - ret = snd_soc_register_component(&pdev->dev, &bfin_ac97_component, - &bfin_ac97_dai, 1); - if (ret) { - pr_err("Failed to register DAI: %d\n", ret); - goto sport_config_err; - } - - ac97_sport_handle = sport_handle; - - return 0; - -sport_config_err: - sport_done(sport_handle); -sport_err: - snd_soc_set_ac97_ops(NULL); - - return ret; -} - -static int asoc_bfin_ac97_remove(struct platform_device *pdev) -{ - struct sport_device *sport_handle = platform_get_drvdata(pdev); - - snd_soc_unregister_component(&pdev->dev); - sport_done(sport_handle); - snd_soc_set_ac97_ops(NULL); - - return 0; -} - -static struct platform_driver asoc_bfin_ac97_driver = { - .driver = { - .name = "bfin-ac97", - }, - - .probe = asoc_bfin_ac97_probe, - .remove = asoc_bfin_ac97_remove, -}; - -module_platform_driver(asoc_bfin_ac97_driver); - -MODULE_AUTHOR("Roy Huang"); -MODULE_DESCRIPTION("AC97 driver for ADI Blackfin"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-ac97.h b/sound/soc/blackfin/bf5xx-ac97.h deleted file mode 100644 index a680fdc9bb42..000000000000 --- a/sound/soc/blackfin/bf5xx-ac97.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * sound/soc/blackfin/bf5xx-ac97.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _BF5XX_AC97_H -#define _BF5XX_AC97_H - -/* Frame format in memory, only support stereo currently */ -struct ac97_frame { - u16 ac97_tag; /* slot 0 */ - u16 ac97_addr; /* slot 1 */ - u16 ac97_data; /* slot 2 */ - u16 ac97_pcm_l; /*slot 3:front left*/ - u16 ac97_pcm_r; /*slot 4:front left*/ -#if defined(CONFIG_SND_BF5XX_MULTICHAN_SUPPORT) - u16 ac97_mdm_l1; - u16 ac97_center; /*slot 6:center*/ - u16 ac97_sl; /*slot 7:surround left*/ - u16 ac97_sr; /*slot 8:surround right*/ - u16 ac97_lfe; /*slot 9:lfe*/ -#endif -} __attribute__ ((packed)); - -/* Speaker location */ -#define SP_FL 0x0001 -#define SP_FR 0x0010 -#define SP_FC 0x0002 -#define SP_LFE 0x0020 -#define SP_SL 0x0004 -#define SP_SR 0x0040 - -#define SP_STEREO (SP_FL | SP_FR) -#define SP_2DOT1 (SP_FL | SP_FR | SP_LFE) -#define SP_QUAD (SP_FL | SP_FR | SP_SL | SP_SR) -#define SP_5DOT1 (SP_FL | SP_FR | SP_FC | SP_LFE | SP_SL | SP_SR) - -#define TAG_VALID 0x8000 -#define TAG_CMD 0x6000 -#define TAG_PCM_LEFT 0x1000 -#define TAG_PCM_RIGHT 0x0800 -#define TAG_PCM_MDM_L1 0x0400 -#define TAG_PCM_CENTER 0x0200 -#define TAG_PCM_SL 0x0100 -#define TAG_PCM_SR 0x0080 -#define TAG_PCM_LFE 0x0040 - -void bf5xx_pcm_to_ac97(struct ac97_frame *dst, const __u16 *src, \ - size_t count, unsigned int chan_mask); - -void bf5xx_ac97_to_pcm(const struct ac97_frame *src, __u16 *dst, \ - size_t count); - -#endif diff --git a/sound/soc/blackfin/bf5xx-ad1836.c b/sound/soc/blackfin/bf5xx-ad1836.c deleted file mode 100644 index 864df2616e10..000000000000 --- a/sound/soc/blackfin/bf5xx-ad1836.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ad1836.c - * Author: Barry Song <Barry.Song@analog.com> - * - * Created: Aug 4 2009 - * Description: Board driver for ad1836 sound chip - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - */ - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/device.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include <asm/blackfin.h> -#include <asm/cacheflush.h> -#include <asm/irq.h> -#include <asm/dma.h> -#include <asm/portmux.h> - -#include "../codecs/ad1836.h" - -static struct snd_soc_card bf5xx_ad1836; - -static int bf5xx_ad1836_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - unsigned int channel_map[] = {0, 4, 1, 5, 2, 6, 3, 7}; - int ret = 0; - - /* set cpu DAI channel mapping */ - ret = snd_soc_dai_set_channel_map(cpu_dai, ARRAY_SIZE(channel_map), - channel_map, ARRAY_SIZE(channel_map), channel_map); - if (ret < 0) - return ret; - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xFF, 0xFF, 8, 32); - if (ret < 0) - return ret; - - return 0; -} - -#define BF5XX_AD1836_DAIFMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_IF | \ - SND_SOC_DAIFMT_CBM_CFM) - -static struct snd_soc_dai_link bf5xx_ad1836_dai = { - .name = "ad1836", - .stream_name = "AD1836", - .codec_dai_name = "ad1836-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .dai_fmt = BF5XX_AD1836_DAIFMT, - .init = bf5xx_ad1836_init, -}; - -static struct snd_soc_card bf5xx_ad1836 = { - .name = "bfin-ad1836", - .owner = THIS_MODULE, - .dai_link = &bf5xx_ad1836_dai, - .num_links = 1, -}; - -static int bf5xx_ad1836_driver_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = &bf5xx_ad1836; - const char **link_name; - int ret; - - link_name = pdev->dev.platform_data; - if (!link_name) { - dev_err(&pdev->dev, "No platform data supplied\n"); - return -EINVAL; - } - bf5xx_ad1836_dai.cpu_dai_name = link_name[0]; - bf5xx_ad1836_dai.codec_name = link_name[1]; - - card->dev = &pdev->dev; - platform_set_drvdata(pdev, card); - - ret = devm_snd_soc_register_card(&pdev->dev, card); - if (ret) - dev_err(&pdev->dev, "Failed to register card\n"); - return ret; -} - -static struct platform_driver bf5xx_ad1836_driver = { - .driver = { - .name = "bfin-snd-ad1836", - .pm = &snd_soc_pm_ops, - }, - .probe = bf5xx_ad1836_driver_probe, -}; -module_platform_driver(bf5xx_ad1836_driver); - -/* Module information */ -MODULE_AUTHOR("Barry Song"); -MODULE_DESCRIPTION("ALSA SoC AD1836 board driver"); -MODULE_LICENSE("GPL"); - diff --git a/sound/soc/blackfin/bf5xx-ad193x.c b/sound/soc/blackfin/bf5xx-ad193x.c deleted file mode 100644 index 603ad1f2b9b9..000000000000 --- a/sound/soc/blackfin/bf5xx-ad193x.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ad193x.c - * Author: Barry Song <Barry.Song@analog.com> - * - * Created: Thur June 4 2009 - * Description: Board driver for ad193x sound chip - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/device.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include <asm/blackfin.h> -#include <asm/cacheflush.h> -#include <asm/irq.h> -#include <asm/dma.h> -#include <asm/portmux.h> - -#include "../codecs/ad193x.h" - -static struct snd_soc_card bf5xx_ad193x; - -static int bf5xx_ad193x_link_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int ret; - - /* set the codec system clock for DAC and ADC */ - ret = snd_soc_dai_set_sysclk(codec_dai, 0, 24576000, SND_SOC_CLOCK_IN); - if (ret < 0) - return ret; - - /* set codec DAI slots, 8 channels, all channels are enabled */ - ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xFF, 0xFF, 8, 32); - if (ret < 0) - return ret; - - ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0xFF, 0xFF, 8, 32); - if (ret < 0) - return ret; - - return 0; -} - -#define BF5XX_AD193X_DAIFMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_IF | \ - SND_SOC_DAIFMT_CBM_CFM) - -static struct snd_soc_dai_link bf5xx_ad193x_dai[] = { - { - .name = "ad193x", - .stream_name = "AD193X", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name ="ad193x-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "spi0.5", - .dai_fmt = BF5XX_AD193X_DAIFMT, - .init = bf5xx_ad193x_link_init, - }, - { - .name = "ad193x", - .stream_name = "AD193X", - .cpu_dai_name = "bfin-i2s.1", - .codec_dai_name ="ad193x-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "spi0.5", - .dai_fmt = BF5XX_AD193X_DAIFMT, - .init = bf5xx_ad193x_link_init, - }, -}; - -static struct snd_soc_card bf5xx_ad193x = { - .name = "bfin-ad193x", - .owner = THIS_MODULE, - .dai_link = &bf5xx_ad193x_dai[CONFIG_SND_BF5XX_SPORT_NUM], - .num_links = 1, -}; - -static struct platform_device *bfxx_ad193x_snd_device; - -static int __init bf5xx_ad193x_init(void) -{ - int ret; - - bfxx_ad193x_snd_device = platform_device_alloc("soc-audio", -1); - if (!bfxx_ad193x_snd_device) - return -ENOMEM; - - platform_set_drvdata(bfxx_ad193x_snd_device, &bf5xx_ad193x); - ret = platform_device_add(bfxx_ad193x_snd_device); - - if (ret) - platform_device_put(bfxx_ad193x_snd_device); - - return ret; -} - -static void __exit bf5xx_ad193x_exit(void) -{ - platform_device_unregister(bfxx_ad193x_snd_device); -} - -module_init(bf5xx_ad193x_init); -module_exit(bf5xx_ad193x_exit); - -/* Module information */ -MODULE_AUTHOR("Barry Song"); -MODULE_DESCRIPTION("ALSA SoC AD193X board driver"); -MODULE_LICENSE("GPL"); - diff --git a/sound/soc/blackfin/bf5xx-ad1980.c b/sound/soc/blackfin/bf5xx-ad1980.c deleted file mode 100644 index 0fa81a523b8a..000000000000 --- a/sound/soc/blackfin/bf5xx-ad1980.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ad1980.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Tue June 06 2008 - * Description: Board driver for AD1980/1 audio codec - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * WARNING: - * - * Because Analog Devices Inc. discontinued the ad1980 sound chip since - * Sep. 2009, this ad1980 driver is not maintained, tested and supported - * by ADI now. - */ - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/device.h> -#include <asm/dma.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> - -#include <linux/gpio.h> -#include <asm/portmux.h> - -#include "bf5xx-ac97.h" - -static struct snd_soc_card bf5xx_board; - -static struct snd_soc_dai_link bf5xx_board_dai[] = { - { - .name = "AC97", - .stream_name = "AC97 HiFi", - .cpu_dai_name = "bfin-ac97.0", - .codec_dai_name = "ad1980-hifi", - .platform_name = "bfin-ac97-pcm-audio", - .codec_name = "ad1980", - }, - { - .name = "AC97", - .stream_name = "AC97 HiFi", - .cpu_dai_name = "bfin-ac97.1", - .codec_dai_name = "ad1980-hifi", - .platform_name = "bfin-ac97-pcm-audio", - .codec_name = "ad1980", - }, -}; - -static struct snd_soc_card bf5xx_board = { - .name = "bfin-ad1980", - .owner = THIS_MODULE, - .dai_link = &bf5xx_board_dai[CONFIG_SND_BF5XX_SPORT_NUM], - .num_links = 1, -}; - -static struct platform_device *bf5xx_board_snd_device; - -static int __init bf5xx_board_init(void) -{ - int ret; - - bf5xx_board_snd_device = platform_device_alloc("soc-audio", -1); - if (!bf5xx_board_snd_device) - return -ENOMEM; - - platform_set_drvdata(bf5xx_board_snd_device, &bf5xx_board); - ret = platform_device_add(bf5xx_board_snd_device); - - if (ret) - platform_device_put(bf5xx_board_snd_device); - - return ret; -} - -static void __exit bf5xx_board_exit(void) -{ - platform_device_unregister(bf5xx_board_snd_device); -} - -module_init(bf5xx_board_init); -module_exit(bf5xx_board_exit); - -/* Module information */ -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ALSA SoC AD1980/1 BF5xx board (Obsolete)"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-ad73311.c b/sound/soc/blackfin/bf5xx-ad73311.c deleted file mode 100644 index 786bbdd96e7c..000000000000 --- a/sound/soc/blackfin/bf5xx-ad73311.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ad73311.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Thur Sep 25 2008 - * Description: Board driver for ad73311 sound chip - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/device.h> -#include <linux/delay.h> -#include <linux/gpio.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include <asm/blackfin.h> -#include <asm/cacheflush.h> -#include <asm/irq.h> -#include <asm/dma.h> -#include <asm/portmux.h> - -#include "../codecs/ad73311.h" -#include "bf5xx-sport.h" - -#if CONFIG_SND_BF5XX_SPORT_NUM == 0 -#define bfin_write_SPORT_TCR1 bfin_write_SPORT0_TCR1 -#define bfin_read_SPORT_TCR1 bfin_read_SPORT0_TCR1 -#define bfin_write_SPORT_TCR2 bfin_write_SPORT0_TCR2 -#define bfin_write_SPORT_TX16 bfin_write_SPORT0_TX16 -#define bfin_read_SPORT_STAT bfin_read_SPORT0_STAT -#else -#define bfin_write_SPORT_TCR1 bfin_write_SPORT1_TCR1 -#define bfin_read_SPORT_TCR1 bfin_read_SPORT1_TCR1 -#define bfin_write_SPORT_TCR2 bfin_write_SPORT1_TCR2 -#define bfin_write_SPORT_TX16 bfin_write_SPORT1_TX16 -#define bfin_read_SPORT_STAT bfin_read_SPORT1_STAT -#endif - -#define GPIO_SE CONFIG_SND_BFIN_AD73311_SE - -static struct snd_soc_card bf5xx_ad73311; - -static int snd_ad73311_startup(void) -{ - pr_debug("%s enter\n", __func__); - - /* Pull up SE pin on AD73311L */ - gpio_set_value(GPIO_SE, 1); - return 0; -} - -static int snd_ad73311_configure(void) -{ - unsigned short ctrl_regs[6]; - unsigned short status = 0; - int count = 0; - - /* DMCLK = MCLK = 16.384 MHz - * SCLK = DMCLK/8 = 2.048 MHz - * Sample Rate = DMCLK/2048 = 8 KHz - */ - ctrl_regs[0] = AD_CONTROL | AD_WRITE | CTRL_REG_B | REGB_MCDIV(0) | \ - REGB_SCDIV(0) | REGB_DIRATE(0); - ctrl_regs[1] = AD_CONTROL | AD_WRITE | CTRL_REG_C | REGC_PUDEV | \ - REGC_PUADC | REGC_PUDAC | REGC_PUREF | REGC_REFUSE ; - ctrl_regs[2] = AD_CONTROL | AD_WRITE | CTRL_REG_D | REGD_OGS(2) | \ - REGD_IGS(2); - ctrl_regs[3] = AD_CONTROL | AD_WRITE | CTRL_REG_E | REGE_DA(0x1f); - ctrl_regs[4] = AD_CONTROL | AD_WRITE | CTRL_REG_F | REGF_SEEN ; - ctrl_regs[5] = AD_CONTROL | AD_WRITE | CTRL_REG_A | REGA_MODE_DATA; - - local_irq_disable(); - snd_ad73311_startup(); - udelay(1); - - bfin_write_SPORT_TCR1(TFSR); - bfin_write_SPORT_TCR2(0xF); - SSYNC(); - - /* SPORT Tx Register is a 8 x 16 FIFO, all the data can be put to - * FIFO before enable SPORT to transfer the data - */ - for (count = 0; count < 6; count++) - bfin_write_SPORT_TX16(ctrl_regs[count]); - SSYNC(); - bfin_write_SPORT_TCR1(bfin_read_SPORT_TCR1() | TSPEN); - SSYNC(); - - /* When TUVF is set, the data is already send out */ - while (!(status & TUVF) && ++count < 10000) { - udelay(1); - status = bfin_read_SPORT_STAT(); - SSYNC(); - } - bfin_write_SPORT_TCR1(bfin_read_SPORT_TCR1() & ~TSPEN); - SSYNC(); - local_irq_enable(); - - if (count >= 10000) { - printk(KERN_ERR "ad73311: failed to configure codec\n"); - return -1; - } - return 0; -} - -static int bf5xx_probe(struct snd_soc_card *card) -{ - int err; - if (gpio_request(GPIO_SE, "AD73311_SE")) { - printk(KERN_ERR "%s: Failed ro request GPIO_%d\n", __func__, GPIO_SE); - return -EBUSY; - } - - gpio_direction_output(GPIO_SE, 0); - - err = snd_ad73311_configure(); - if (err < 0) - return -EFAULT; - - return 0; -} - -#define BF5XX_AD7311_DAI_FMT (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | \ - SND_SOC_DAIFMT_CBM_CFM) - -static struct snd_soc_dai_link bf5xx_ad73311_dai[] = { - { - .name = "ad73311", - .stream_name = "AD73311", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "ad73311-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "ad73311", - .dai_fmt = BF5XX_AD7311_DAI_FMT, - }, - { - .name = "ad73311", - .stream_name = "AD73311", - .cpu_dai_name = "bfin-i2s.1", - .codec_dai_name = "ad73311-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "ad73311", - .dai_fmt = BF5XX_AD7311_DAI_FMT, - }, -}; - -static struct snd_soc_card bf5xx_ad73311 = { - .name = "bfin-ad73311", - .owner = THIS_MODULE, - .probe = bf5xx_probe, - .dai_link = &bf5xx_ad73311_dai[CONFIG_SND_BF5XX_SPORT_NUM], - .num_links = 1, -}; - -static struct platform_device *bf5xx_ad73311_snd_device; - -static int __init bf5xx_ad73311_init(void) -{ - int ret; - - pr_debug("%s enter\n", __func__); - bf5xx_ad73311_snd_device = platform_device_alloc("soc-audio", -1); - if (!bf5xx_ad73311_snd_device) - return -ENOMEM; - - platform_set_drvdata(bf5xx_ad73311_snd_device, &bf5xx_ad73311); - ret = platform_device_add(bf5xx_ad73311_snd_device); - - if (ret) - platform_device_put(bf5xx_ad73311_snd_device); - - return ret; -} - -static void __exit bf5xx_ad73311_exit(void) -{ - pr_debug("%s enter\n", __func__); - platform_device_unregister(bf5xx_ad73311_snd_device); -} - -module_init(bf5xx_ad73311_init); -module_exit(bf5xx_ad73311_exit); - -/* Module information */ -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ALSA SoC AD73311 Blackfin"); -MODULE_LICENSE("GPL"); - diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.c b/sound/soc/blackfin/bf5xx-i2s-pcm.c deleted file mode 100644 index 51cae76f14e6..000000000000 --- a/sound/soc/blackfin/bf5xx-i2s-pcm.c +++ /dev/null @@ -1,373 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-i2s-pcm.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Tue June 06 2008 - * Description: DMA driver for i2s codec - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/dma-mapping.h> -#include <linux/gfp.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/soc.h> - -#include <asm/dma.h> - -#include "bf5xx-sport.h" -#include "bf5xx-i2s-pcm.h" - -static void bf5xx_dma_irq(void *data) -{ - struct snd_pcm_substream *pcm = data; - snd_pcm_period_elapsed(pcm); -} - -static const struct snd_pcm_hardware bf5xx_pcm_hardware = { - .info = SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_BLOCK_TRANSFER, - .period_bytes_min = 32, - .period_bytes_max = 0x10000, - .periods_min = 1, - .periods_max = PAGE_SIZE/32, - .buffer_bytes_max = 0x20000, /* 128 kbytes */ - .fifo_size = 16, -}; - -static int bf5xx_pcm_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - unsigned int buffer_size = params_buffer_bytes(params); - struct bf5xx_i2s_pcm_data *dma_data; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - if (dma_data->tdm_mode) - buffer_size = buffer_size / params_channels(params) * 8; - - return snd_pcm_lib_malloc_pages(substream, buffer_size); -} - -static int bf5xx_pcm_hw_free(struct snd_pcm_substream *substream) -{ - snd_pcm_lib_free_pages(substream); - - return 0; -} - -static int bf5xx_pcm_prepare(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - int period_bytes = frames_to_bytes(runtime, runtime->period_size); - struct bf5xx_i2s_pcm_data *dma_data; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - if (dma_data->tdm_mode) - period_bytes = period_bytes / runtime->channels * 8; - - pr_debug("%s enter\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - sport_set_tx_callback(sport, bf5xx_dma_irq, substream); - sport_config_tx_dma(sport, runtime->dma_area, - runtime->periods, period_bytes); - } else { - sport_set_rx_callback(sport, bf5xx_dma_irq, substream); - sport_config_rx_dma(sport, runtime->dma_area, - runtime->periods, period_bytes); - } - - return 0; -} - -static int bf5xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - int ret = 0; - - pr_debug("%s enter\n", __func__); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - sport_tx_start(sport); - else - sport_rx_start(sport); - break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - sport_tx_stop(sport); - else - sport_rx_stop(sport); - break; - default: - ret = -EINVAL; - } - - return ret; -} - -static snd_pcm_uframes_t bf5xx_pcm_pointer(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - struct sport_device *sport = runtime->private_data; - unsigned int diff; - snd_pcm_uframes_t frames; - struct bf5xx_i2s_pcm_data *dma_data; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - pr_debug("%s enter\n", __func__); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - diff = sport_curr_offset_tx(sport); - } else { - diff = sport_curr_offset_rx(sport); - } - - /* - * TX at least can report one frame beyond the end of the - * buffer if we hit the wraparound case - clamp to within the - * buffer as the ALSA APIs require. - */ - if (diff == snd_pcm_lib_buffer_bytes(substream)) - diff = 0; - - frames = bytes_to_frames(substream->runtime, diff); - if (dma_data->tdm_mode) - frames = frames * runtime->channels / 8; - - return frames; -} - -static int bf5xx_pcm_open(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *cpu_dai = rtd->cpu_dai; - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(cpu_dai); - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_dma_buffer *buf = &substream->dma_buffer; - struct bf5xx_i2s_pcm_data *dma_data; - int ret; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - pr_debug("%s enter\n", __func__); - - snd_soc_set_runtime_hwparams(substream, &bf5xx_pcm_hardware); - if (dma_data->tdm_mode) - runtime->hw.buffer_bytes_max /= 4; - else - runtime->hw.info |= SNDRV_PCM_INFO_MMAP; - - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - goto out; - - if (sport_handle != NULL) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - sport_handle->tx_buf = buf->area; - else - sport_handle->rx_buf = buf->area; - - runtime->private_data = sport_handle; - } else { - pr_err("sport_handle is NULL\n"); - return -1; - } - return 0; - - out: - return ret; -} - -static int bf5xx_pcm_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - size_t size = vma->vm_end - vma->vm_start; - vma->vm_start = (unsigned long)runtime->dma_area; - vma->vm_end = vma->vm_start + size; - vma->vm_flags |= VM_SHARED; - - return 0 ; -} - -static int bf5xx_pcm_copy(struct snd_pcm_substream *substream, - int channel, unsigned long pos, - void *buf, unsigned long count) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - unsigned int sample_size = runtime->sample_bits / 8; - struct bf5xx_i2s_pcm_data *dma_data; - unsigned int i; - void *src, *dst; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - if (dma_data->tdm_mode) { - pos = bytes_to_frames(runtime, pos); - count = bytes_to_frames(runtime, count); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - src = buf; - dst = runtime->dma_area; - dst += pos * sample_size * 8; - - while (count--) { - for (i = 0; i < runtime->channels; i++) { - memcpy(dst + dma_data->map[i] * - sample_size, src, sample_size); - src += sample_size; - } - dst += 8 * sample_size; - } - } else { - src = runtime->dma_area; - src += pos * sample_size * 8; - dst = buf; - - while (count--) { - for (i = 0; i < runtime->channels; i++) { - memcpy(dst, src + dma_data->map[i] * - sample_size, sample_size); - dst += sample_size; - } - src += 8 * sample_size; - } - } - } else { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - src = buf; - dst = runtime->dma_area; - dst += pos; - } else { - src = runtime->dma_area; - src += pos; - dst = buf; - } - - memcpy(dst, src, count); - } - - return 0; -} - -static int bf5xx_pcm_copy_user(struct snd_pcm_substream *substream, - int channel, unsigned long pos, - void __user *buf, unsigned long count) -{ - return bf5xx_pcm_copy(substream, channel, pos, (void *)buf, count); -} - -static int bf5xx_pcm_silence(struct snd_pcm_substream *substream, - int channel, unsigned long pos, - unsigned long count) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_pcm_runtime *runtime = substream->runtime; - unsigned int sample_size = runtime->sample_bits / 8; - void *buf = runtime->dma_area; - struct bf5xx_i2s_pcm_data *dma_data; - unsigned int offset, samples; - - dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); - - if (dma_data->tdm_mode) { - offset = bytes_to_frames(runtime, pos) * 8 * sample_size; - samples = bytes_to_frames(runtime, count) * 8; - } else { - offset = pos; - samples = bytes_to_samples(runtime, count); - } - - snd_pcm_format_set_silence(runtime->format, buf + offset, samples); - - return 0; -} - -static const struct snd_pcm_ops bf5xx_pcm_i2s_ops = { - .open = bf5xx_pcm_open, - .ioctl = snd_pcm_lib_ioctl, - .hw_params = bf5xx_pcm_hw_params, - .hw_free = bf5xx_pcm_hw_free, - .prepare = bf5xx_pcm_prepare, - .trigger = bf5xx_pcm_trigger, - .pointer = bf5xx_pcm_pointer, - .mmap = bf5xx_pcm_mmap, - .copy_user = bf5xx_pcm_copy_user, - .copy_kernel = bf5xx_pcm_copy, - .fill_silence = bf5xx_pcm_silence, -}; - -static int bf5xx_pcm_i2s_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - size_t size = bf5xx_pcm_hardware.buffer_bytes_max; - int ret; - - pr_debug("%s enter\n", __func__); - ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); - if (ret) - return ret; - - return snd_pcm_lib_preallocate_pages_for_all(rtd->pcm, - SNDRV_DMA_TYPE_DEV, card->dev, size, size); -} - -static struct snd_soc_platform_driver bf5xx_i2s_soc_platform = { - .ops = &bf5xx_pcm_i2s_ops, - .pcm_new = bf5xx_pcm_i2s_new, -}; - -static int bfin_i2s_soc_platform_probe(struct platform_device *pdev) -{ - return devm_snd_soc_register_platform(&pdev->dev, - &bf5xx_i2s_soc_platform); -} - -static struct platform_driver bfin_i2s_pcm_driver = { - .driver = { - .name = "bfin-i2s-pcm-audio", - }, - - .probe = bfin_i2s_soc_platform_probe, -}; - -module_platform_driver(bfin_i2s_pcm_driver); - -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ADI Blackfin I2S PCM DMA module"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.h b/sound/soc/blackfin/bf5xx-i2s-pcm.h deleted file mode 100644 index 1f0435249f88..000000000000 --- a/sound/soc/blackfin/bf5xx-i2s-pcm.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _BF5XX_TDM_PCM_H -#define _BF5XX_TDM_PCM_H - -#define BFIN_TDM_DAI_MAX_SLOTS 8 - -struct bf5xx_i2s_pcm_data { - unsigned int map[BFIN_TDM_DAI_MAX_SLOTS]; - bool tdm_mode; -}; - -#endif diff --git a/sound/soc/blackfin/bf5xx-i2s.c b/sound/soc/blackfin/bf5xx-i2s.c deleted file mode 100644 index b69aeef6418e..000000000000 --- a/sound/soc/blackfin/bf5xx-i2s.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-i2s.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Tue June 06 2008 - * Description: Blackfin I2S CPU DAI driver - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/init.h> -#include <linux/module.h> -#include <linux/device.h> -#include <linux/delay.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/initval.h> -#include <sound/soc.h> - -#include <asm/irq.h> -#include <asm/portmux.h> -#include <linux/mutex.h> -#include <linux/gpio.h> - -#include "bf5xx-sport.h" -#include "bf5xx-i2s-pcm.h" - -struct bf5xx_i2s_port { - u16 tcr1; - u16 rcr1; - u16 tcr2; - u16 rcr2; - int configured; - - unsigned int slots; - unsigned int tx_mask; - unsigned int rx_mask; - - struct bf5xx_i2s_pcm_data tx_dma_data; - struct bf5xx_i2s_pcm_data rx_dma_data; -}; - -static int bf5xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, - unsigned int fmt) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(cpu_dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - int ret = 0; - - /* interface format:support I2S,slave mode */ - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_I2S: - bf5xx_i2s->tcr1 |= TFSR | TCKFE; - bf5xx_i2s->rcr1 |= RFSR | RCKFE; - bf5xx_i2s->tcr2 |= TSFSE; - bf5xx_i2s->rcr2 |= RSFSE; - break; - case SND_SOC_DAIFMT_DSP_A: - bf5xx_i2s->tcr1 |= TFSR; - bf5xx_i2s->rcr1 |= RFSR; - break; - case SND_SOC_DAIFMT_LEFT_J: - ret = -EINVAL; - break; - default: - dev_err(cpu_dai->dev, "%s: Unknown DAI format type\n", - __func__); - ret = -EINVAL; - break; - } - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBM_CFM: - break; - case SND_SOC_DAIFMT_CBS_CFS: - case SND_SOC_DAIFMT_CBM_CFS: - case SND_SOC_DAIFMT_CBS_CFM: - ret = -EINVAL; - break; - default: - dev_err(cpu_dai->dev, "%s: Unknown DAI master type\n", - __func__); - ret = -EINVAL; - break; - } - - return ret; -} - -static int bf5xx_i2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - int ret = 0; - - bf5xx_i2s->tcr2 &= ~0x1f; - bf5xx_i2s->rcr2 &= ~0x1f; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S8: - bf5xx_i2s->tcr2 |= 7; - bf5xx_i2s->rcr2 |= 7; - sport_handle->wdsize = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - bf5xx_i2s->tcr2 |= 15; - bf5xx_i2s->rcr2 |= 15; - sport_handle->wdsize = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - bf5xx_i2s->tcr2 |= 23; - bf5xx_i2s->rcr2 |= 23; - sport_handle->wdsize = 3; - break; - case SNDRV_PCM_FORMAT_S32_LE: - bf5xx_i2s->tcr2 |= 31; - bf5xx_i2s->rcr2 |= 31; - sport_handle->wdsize = 4; - break; - } - - if (!bf5xx_i2s->configured) { - /* - * TX and RX are not independent,they are enabled at the - * same time, even if only one side is running. So, we - * need to configure both of them at the time when the first - * stream is opened. - * - * CPU DAI:slave mode. - */ - bf5xx_i2s->configured = 1; - ret = sport_config_rx(sport_handle, bf5xx_i2s->rcr1, - bf5xx_i2s->rcr2, 0, 0); - if (ret) { - dev_err(dai->dev, "SPORT is busy!\n"); - return -EBUSY; - } - - ret = sport_config_tx(sport_handle, bf5xx_i2s->tcr1, - bf5xx_i2s->tcr2, 0, 0); - if (ret) { - dev_err(dai->dev, "SPORT is busy!\n"); - return -EBUSY; - } - } - - return 0; -} - -static void bf5xx_i2s_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - - dev_dbg(dai->dev, "%s enter\n", __func__); - /* No active stream, SPORT is allowed to be configured again. */ - if (!dai->active) - bf5xx_i2s->configured = 0; -} - -static int bf5xx_i2s_set_channel_map(struct snd_soc_dai *dai, - unsigned int tx_num, unsigned int *tx_slot, - unsigned int rx_num, unsigned int *rx_slot) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - unsigned int tx_mapped = 0, rx_mapped = 0; - unsigned int slot; - int i; - - if ((tx_num > BFIN_TDM_DAI_MAX_SLOTS) || - (rx_num > BFIN_TDM_DAI_MAX_SLOTS)) - return -EINVAL; - - for (i = 0; i < tx_num; i++) { - slot = tx_slot[i]; - if ((slot < BFIN_TDM_DAI_MAX_SLOTS) && - (!(tx_mapped & (1 << slot)))) { - bf5xx_i2s->tx_dma_data.map[i] = slot; - tx_mapped |= 1 << slot; - } else - return -EINVAL; - } - for (i = 0; i < rx_num; i++) { - slot = rx_slot[i]; - if ((slot < BFIN_TDM_DAI_MAX_SLOTS) && - (!(rx_mapped & (1 << slot)))) { - bf5xx_i2s->rx_dma_data.map[i] = slot; - rx_mapped |= 1 << slot; - } else - return -EINVAL; - } - - return 0; -} - -static int bf5xx_i2s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, - unsigned int rx_mask, int slots, int width) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - - if (slots % 8 != 0 || slots > 8) - return -EINVAL; - - if (width != 32) - return -EINVAL; - - bf5xx_i2s->slots = slots; - bf5xx_i2s->tx_mask = tx_mask; - bf5xx_i2s->rx_mask = rx_mask; - - bf5xx_i2s->tx_dma_data.tdm_mode = slots != 0; - bf5xx_i2s->rx_dma_data.tdm_mode = slots != 0; - - return sport_set_multichannel(sport_handle, slots, tx_mask, rx_mask, 0); -} - -#ifdef CONFIG_PM -static int bf5xx_i2s_suspend(struct snd_soc_dai *dai) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - - dev_dbg(dai->dev, "%s : sport %d\n", __func__, dai->id); - - if (dai->capture_active) - sport_rx_stop(sport_handle); - if (dai->playback_active) - sport_tx_stop(sport_handle); - return 0; -} - -static int bf5xx_i2s_resume(struct snd_soc_dai *dai) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - int ret; - - dev_dbg(dai->dev, "%s : sport %d\n", __func__, dai->id); - - ret = sport_config_rx(sport_handle, bf5xx_i2s->rcr1, - bf5xx_i2s->rcr2, 0, 0); - if (ret) { - dev_err(dai->dev, "SPORT is busy!\n"); - return -EBUSY; - } - - ret = sport_config_tx(sport_handle, bf5xx_i2s->tcr1, - bf5xx_i2s->tcr2, 0, 0); - if (ret) { - dev_err(dai->dev, "SPORT is busy!\n"); - return -EBUSY; - } - - return sport_set_multichannel(sport_handle, bf5xx_i2s->slots, - bf5xx_i2s->tx_mask, bf5xx_i2s->rx_mask, 0); -} - -#else -#define bf5xx_i2s_suspend NULL -#define bf5xx_i2s_resume NULL -#endif - -static int bf5xx_i2s_dai_probe(struct snd_soc_dai *dai) -{ - struct sport_device *sport_handle = snd_soc_dai_get_drvdata(dai); - struct bf5xx_i2s_port *bf5xx_i2s = sport_handle->private_data; - unsigned int i; - - for (i = 0; i < BFIN_TDM_DAI_MAX_SLOTS; i++) { - bf5xx_i2s->tx_dma_data.map[i] = i; - bf5xx_i2s->rx_dma_data.map[i] = i; - } - - dai->playback_dma_data = &bf5xx_i2s->tx_dma_data; - dai->capture_dma_data = &bf5xx_i2s->rx_dma_data; - - return 0; -} - -#define BF5XX_I2S_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \ - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_96000) - -#define BF5XX_I2S_FORMATS \ - (SNDRV_PCM_FMTBIT_S8 | \ - SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S32_LE) - -static const struct snd_soc_dai_ops bf5xx_i2s_dai_ops = { - .shutdown = bf5xx_i2s_shutdown, - .hw_params = bf5xx_i2s_hw_params, - .set_fmt = bf5xx_i2s_set_dai_fmt, - .set_tdm_slot = bf5xx_i2s_set_tdm_slot, - .set_channel_map = bf5xx_i2s_set_channel_map, -}; - -static struct snd_soc_dai_driver bf5xx_i2s_dai = { - .probe = bf5xx_i2s_dai_probe, - .suspend = bf5xx_i2s_suspend, - .resume = bf5xx_i2s_resume, - .playback = { - .channels_min = 2, - .channels_max = 8, - .rates = BF5XX_I2S_RATES, - .formats = BF5XX_I2S_FORMATS,}, - .capture = { - .channels_min = 2, - .channels_max = 8, - .rates = BF5XX_I2S_RATES, - .formats = BF5XX_I2S_FORMATS,}, - .ops = &bf5xx_i2s_dai_ops, -}; - -static const struct snd_soc_component_driver bf5xx_i2s_component = { - .name = "bf5xx-i2s", -}; - -static int bf5xx_i2s_probe(struct platform_device *pdev) -{ - struct sport_device *sport_handle; - int ret; - - /* configure SPORT for I2S */ - sport_handle = sport_init(pdev, 4, 8 * sizeof(u32), - sizeof(struct bf5xx_i2s_port)); - if (!sport_handle) - return -ENODEV; - - /* register with the ASoC layers */ - ret = snd_soc_register_component(&pdev->dev, &bf5xx_i2s_component, - &bf5xx_i2s_dai, 1); - if (ret) { - dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret); - sport_done(sport_handle); - return ret; - } - - return 0; -} - -static int bf5xx_i2s_remove(struct platform_device *pdev) -{ - struct sport_device *sport_handle = platform_get_drvdata(pdev); - - dev_dbg(&pdev->dev, "%s enter\n", __func__); - - snd_soc_unregister_component(&pdev->dev); - sport_done(sport_handle); - - return 0; -} - -static struct platform_driver bfin_i2s_driver = { - .probe = bf5xx_i2s_probe, - .remove = bf5xx_i2s_remove, - .driver = { - .name = "bfin-i2s", - }, -}; - -module_platform_driver(bfin_i2s_driver); - -/* Module information */ -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("I2S driver for ADI Blackfin"); -MODULE_LICENSE("GPL"); - diff --git a/sound/soc/blackfin/bf5xx-sport.c b/sound/soc/blackfin/bf5xx-sport.c deleted file mode 100644 index 9dfa1241ea66..000000000000 --- a/sound/soc/blackfin/bf5xx-sport.c +++ /dev/null @@ -1,1102 +0,0 @@ -/* - * File: bf5xx_sport.c - * Based on: - * Author: Roy Huang <roy.huang@analog.com> - * - * Created: Tue Sep 21 10:52:42 CEST 2004 - * Description: - * Blackfin SPORT Driver - * - * Copyright 2004-2007 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/kernel.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include <linux/dma-mapping.h> -#include <linux/gpio.h> -#include <linux/bug.h> -#include <linux/module.h> -#include <asm/portmux.h> -#include <asm/dma.h> -#include <asm/blackfin.h> -#include <asm/cacheflush.h> - -#include "bf5xx-sport.h" -/* delay between frame sync pulse and first data bit in multichannel mode */ -#define FRAME_DELAY (1<<12) - -/* note: multichannel is in units of 8 channels, - * tdm_count is # channels NOT / 8 ! */ -int sport_set_multichannel(struct sport_device *sport, - int tdm_count, u32 tx_mask, u32 rx_mask, int packed) -{ - pr_debug("%s tdm_count=%d tx_mask:0x%08x rx_mask:0x%08x packed=%d\n", - __func__, tdm_count, tx_mask, rx_mask, packed); - - if ((sport->regs->tcr1 & TSPEN) || (sport->regs->rcr1 & RSPEN)) - return -EBUSY; - - if (tdm_count & 0x7) - return -EINVAL; - - if (tdm_count > 32) - return -EINVAL; /* Only support less than 32 channels now */ - - if (tdm_count) { - sport->regs->mcmc1 = ((tdm_count>>3)-1) << 12; - sport->regs->mcmc2 = FRAME_DELAY | MCMEN | \ - (packed ? (MCDTXPE|MCDRXPE) : 0); - - sport->regs->mtcs0 = tx_mask; - sport->regs->mrcs0 = rx_mask; - sport->regs->mtcs1 = 0; - sport->regs->mrcs1 = 0; - sport->regs->mtcs2 = 0; - sport->regs->mrcs2 = 0; - sport->regs->mtcs3 = 0; - sport->regs->mrcs3 = 0; - } else { - sport->regs->mcmc1 = 0; - sport->regs->mcmc2 = 0; - - sport->regs->mtcs0 = 0; - sport->regs->mrcs0 = 0; - } - - sport->regs->mtcs1 = 0; sport->regs->mtcs2 = 0; sport->regs->mtcs3 = 0; - sport->regs->mrcs1 = 0; sport->regs->mrcs2 = 0; sport->regs->mrcs3 = 0; - - SSYNC(); - - return 0; -} -EXPORT_SYMBOL(sport_set_multichannel); - -int sport_config_rx(struct sport_device *sport, unsigned int rcr1, - unsigned int rcr2, unsigned int clkdiv, unsigned int fsdiv) -{ - if ((sport->regs->tcr1 & TSPEN) || (sport->regs->rcr1 & RSPEN)) - return -EBUSY; - - sport->regs->rcr1 = rcr1; - sport->regs->rcr2 = rcr2; - sport->regs->rclkdiv = clkdiv; - sport->regs->rfsdiv = fsdiv; - - SSYNC(); - - return 0; -} -EXPORT_SYMBOL(sport_config_rx); - -int sport_config_tx(struct sport_device *sport, unsigned int tcr1, - unsigned int tcr2, unsigned int clkdiv, unsigned int fsdiv) -{ - if ((sport->regs->tcr1 & TSPEN) || (sport->regs->rcr1 & RSPEN)) - return -EBUSY; - - sport->regs->tcr1 = tcr1; - sport->regs->tcr2 = tcr2; - sport->regs->tclkdiv = clkdiv; - sport->regs->tfsdiv = fsdiv; - - SSYNC(); - - return 0; -} -EXPORT_SYMBOL(sport_config_tx); - -static void setup_desc(struct dmasg *desc, void *buf, int fragcount, - size_t fragsize, unsigned int cfg, - unsigned int x_count, unsigned int ycount, size_t wdsize) -{ - - int i; - - for (i = 0; i < fragcount; ++i) { - desc[i].next_desc_addr = &(desc[i + 1]); - desc[i].start_addr = (unsigned long)buf + i*fragsize; - desc[i].cfg = cfg; - desc[i].x_count = x_count; - desc[i].x_modify = wdsize; - desc[i].y_count = ycount; - desc[i].y_modify = wdsize; - } - - /* make circular */ - desc[fragcount-1].next_desc_addr = desc; - - pr_debug("setup desc: desc0=%p, next0=%p, desc1=%p," - "next1=%p\nx_count=%x,y_count=%x,addr=0x%lx,cfs=0x%x\n", - desc, desc[0].next_desc_addr, - desc+1, desc[1].next_desc_addr, - desc[0].x_count, desc[0].y_count, - desc[0].start_addr, desc[0].cfg); -} - -static int sport_start(struct sport_device *sport) -{ - enable_dma(sport->dma_rx_chan); - enable_dma(sport->dma_tx_chan); - sport->regs->rcr1 |= RSPEN; - sport->regs->tcr1 |= TSPEN; - SSYNC(); - - return 0; -} - -static int sport_stop(struct sport_device *sport) -{ - sport->regs->tcr1 &= ~TSPEN; - sport->regs->rcr1 &= ~RSPEN; - SSYNC(); - - disable_dma(sport->dma_rx_chan); - disable_dma(sport->dma_tx_chan); - return 0; -} - -static inline int sport_hook_rx_dummy(struct sport_device *sport) -{ - struct dmasg *desc, temp_desc; - unsigned long flags; - - if (WARN_ON(!sport->dummy_rx_desc) || - WARN_ON(sport->curr_rx_desc == sport->dummy_rx_desc)) - return -EINVAL; - - /* Maybe the dummy buffer descriptor ring is damaged */ - sport->dummy_rx_desc->next_desc_addr = sport->dummy_rx_desc + 1; - - local_irq_save(flags); - desc = get_dma_next_desc_ptr(sport->dma_rx_chan); - /* Copy the descriptor which will be damaged to backup */ - temp_desc = *desc; - desc->x_count = sport->dummy_count / 2; - desc->y_count = 0; - desc->next_desc_addr = sport->dummy_rx_desc; - local_irq_restore(flags); - /* Waiting for dummy buffer descriptor is already hooked*/ - while ((get_dma_curr_desc_ptr(sport->dma_rx_chan) - - sizeof(struct dmasg)) != sport->dummy_rx_desc) - continue; - sport->curr_rx_desc = sport->dummy_rx_desc; - /* Restore the damaged descriptor */ - *desc = temp_desc; - - return 0; -} - -static inline int sport_rx_dma_start(struct sport_device *sport, int dummy) -{ - if (dummy) { - sport->dummy_rx_desc->next_desc_addr = sport->dummy_rx_desc; - sport->curr_rx_desc = sport->dummy_rx_desc; - } else - sport->curr_rx_desc = sport->dma_rx_desc; - - set_dma_next_desc_addr(sport->dma_rx_chan, sport->curr_rx_desc); - set_dma_x_count(sport->dma_rx_chan, 0); - set_dma_x_modify(sport->dma_rx_chan, 0); - set_dma_config(sport->dma_rx_chan, (DMAFLOW_LARGE | NDSIZE_9 | \ - WDSIZE_32 | WNR)); - set_dma_curr_addr(sport->dma_rx_chan, sport->curr_rx_desc->start_addr); - SSYNC(); - - return 0; -} - -static inline int sport_tx_dma_start(struct sport_device *sport, int dummy) -{ - if (dummy) { - sport->dummy_tx_desc->next_desc_addr = sport->dummy_tx_desc; - sport->curr_tx_desc = sport->dummy_tx_desc; - } else - sport->curr_tx_desc = sport->dma_tx_desc; - - set_dma_next_desc_addr(sport->dma_tx_chan, sport->curr_tx_desc); - set_dma_x_count(sport->dma_tx_chan, 0); - set_dma_x_modify(sport->dma_tx_chan, 0); - set_dma_config(sport->dma_tx_chan, - (DMAFLOW_LARGE | NDSIZE_9 | WDSIZE_32)); - set_dma_curr_addr(sport->dma_tx_chan, sport->curr_tx_desc->start_addr); - SSYNC(); - - return 0; -} - -int sport_rx_start(struct sport_device *sport) -{ - unsigned long flags; - pr_debug("%s enter\n", __func__); - if (sport->rx_run) - return -EBUSY; - if (sport->tx_run) { - /* tx is running, rx is not running */ - if (WARN_ON(!sport->dma_rx_desc) || - WARN_ON(sport->curr_rx_desc != sport->dummy_rx_desc)) - return -EINVAL; - local_irq_save(flags); - while ((get_dma_curr_desc_ptr(sport->dma_rx_chan) - - sizeof(struct dmasg)) != sport->dummy_rx_desc) - continue; - sport->dummy_rx_desc->next_desc_addr = sport->dma_rx_desc; - local_irq_restore(flags); - sport->curr_rx_desc = sport->dma_rx_desc; - } else { - sport_tx_dma_start(sport, 1); - sport_rx_dma_start(sport, 0); - sport_start(sport); - } - - sport->rx_run = 1; - - return 0; -} -EXPORT_SYMBOL(sport_rx_start); - -int sport_rx_stop(struct sport_device *sport) -{ - pr_debug("%s enter\n", __func__); - - if (!sport->rx_run) - return 0; - if (sport->tx_run) { - /* TX dma is still running, hook the dummy buffer */ - sport_hook_rx_dummy(sport); - } else { - /* Both rx and tx dma will be stopped */ - sport_stop(sport); - sport->curr_rx_desc = NULL; - sport->curr_tx_desc = NULL; - } - - sport->rx_run = 0; - - return 0; -} -EXPORT_SYMBOL(sport_rx_stop); - -static inline int sport_hook_tx_dummy(struct sport_device *sport) -{ - struct dmasg *desc, temp_desc; - unsigned long flags; - - if (WARN_ON(!sport->dummy_tx_desc) || - WARN_ON(sport->curr_tx_desc == sport->dummy_tx_desc)) - return -EINVAL; - - sport->dummy_tx_desc->next_desc_addr = sport->dummy_tx_desc + 1; - - /* Shorten the time on last normal descriptor */ - local_irq_save(flags); - desc = get_dma_next_desc_ptr(sport->dma_tx_chan); - /* Store the descriptor which will be damaged */ - temp_desc = *desc; - desc->x_count = sport->dummy_count / 2; - desc->y_count = 0; - desc->next_desc_addr = sport->dummy_tx_desc; - local_irq_restore(flags); - /* Waiting for dummy buffer descriptor is already hooked*/ - while ((get_dma_curr_desc_ptr(sport->dma_tx_chan) - \ - sizeof(struct dmasg)) != sport->dummy_tx_desc) - continue; - sport->curr_tx_desc = sport->dummy_tx_desc; - /* Restore the damaged descriptor */ - *desc = temp_desc; - - return 0; -} - -int sport_tx_start(struct sport_device *sport) -{ - unsigned long flags; - pr_debug("%s: tx_run:%d, rx_run:%d\n", __func__, - sport->tx_run, sport->rx_run); - if (sport->tx_run) - return -EBUSY; - if (sport->rx_run) { - if (WARN_ON(!sport->dma_tx_desc) || - WARN_ON(sport->curr_tx_desc != sport->dummy_tx_desc)) - return -EINVAL; - /* Hook the normal buffer descriptor */ - local_irq_save(flags); - while ((get_dma_curr_desc_ptr(sport->dma_tx_chan) - - sizeof(struct dmasg)) != sport->dummy_tx_desc) - continue; - sport->dummy_tx_desc->next_desc_addr = sport->dma_tx_desc; - local_irq_restore(flags); - sport->curr_tx_desc = sport->dma_tx_desc; - } else { - - sport_tx_dma_start(sport, 0); - /* Let rx dma run the dummy buffer */ - sport_rx_dma_start(sport, 1); - sport_start(sport); - } - sport->tx_run = 1; - return 0; -} -EXPORT_SYMBOL(sport_tx_start); - -int sport_tx_stop(struct sport_device *sport) -{ - if (!sport->tx_run) - return 0; - if (sport->rx_run) { - /* RX is still running, hook the dummy buffer */ - sport_hook_tx_dummy(sport); - } else { - /* Both rx and tx dma stopped */ - sport_stop(sport); - sport->curr_rx_desc = NULL; - sport->curr_tx_desc = NULL; - } - - sport->tx_run = 0; - - return 0; -} -EXPORT_SYMBOL(sport_tx_stop); - -static inline int compute_wdsize(size_t wdsize) -{ - switch (wdsize) { - case 1: - return WDSIZE_8; - case 2: - return WDSIZE_16; - case 4: - default: - return WDSIZE_32; - } -} - -int sport_config_rx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize) -{ - unsigned int x_count; - unsigned int y_count; - unsigned int cfg; - dma_addr_t addr; - - pr_debug("%s buf:%p, frag:%d, fragsize:0x%lx\n", __func__, \ - buf, fragcount, fragsize); - - x_count = fragsize / sport->wdsize; - y_count = 0; - - /* for fragments larger than 64k words we use 2d dma, - * denote fragecount as two numbers' mutliply and both of them - * are less than 64k.*/ - if (x_count >= 0x10000) { - int i, count = x_count; - - for (i = 16; i > 0; i--) { - x_count = 1 << i; - if ((count & (x_count - 1)) == 0) { - y_count = count >> i; - if (y_count < 0x10000) - break; - } - } - if (i == 0) - return -EINVAL; - } - pr_debug("%s(x_count:0x%x, y_count:0x%x)\n", __func__, - x_count, y_count); - - if (sport->dma_rx_desc) - dma_free_coherent(NULL, sport->rx_desc_bytes, - sport->dma_rx_desc, 0); - - /* Allocate a new descritor ring as current one. */ - sport->dma_rx_desc = dma_alloc_coherent(NULL, \ - fragcount * sizeof(struct dmasg), &addr, 0); - sport->rx_desc_bytes = fragcount * sizeof(struct dmasg); - - if (!sport->dma_rx_desc) { - pr_err("Failed to allocate memory for rx desc\n"); - return -ENOMEM; - } - - sport->rx_buf = buf; - sport->rx_fragsize = fragsize; - sport->rx_frags = fragcount; - - cfg = 0x7000 | DI_EN | compute_wdsize(sport->wdsize) | WNR | \ - (DESC_ELEMENT_COUNT << 8); /* large descriptor mode */ - - if (y_count != 0) - cfg |= DMA2D; - - setup_desc(sport->dma_rx_desc, buf, fragcount, fragsize, - cfg|DMAEN, x_count, y_count, sport->wdsize); - - return 0; -} -EXPORT_SYMBOL(sport_config_rx_dma); - -int sport_config_tx_dma(struct sport_device *sport, void *buf, \ - int fragcount, size_t fragsize) -{ - unsigned int x_count; - unsigned int y_count; - unsigned int cfg; - dma_addr_t addr; - - pr_debug("%s buf:%p, fragcount:%d, fragsize:0x%lx\n", - __func__, buf, fragcount, fragsize); - - x_count = fragsize/sport->wdsize; - y_count = 0; - - /* for fragments larger than 64k words we use 2d dma, - * denote fragecount as two numbers' mutliply and both of them - * are less than 64k.*/ - if (x_count >= 0x10000) { - int i, count = x_count; - - for (i = 16; i > 0; i--) { - x_count = 1 << i; - if ((count & (x_count - 1)) == 0) { - y_count = count >> i; - if (y_count < 0x10000) - break; - } - } - if (i == 0) - return -EINVAL; - } - pr_debug("%s x_count:0x%x, y_count:0x%x\n", __func__, - x_count, y_count); - - - if (sport->dma_tx_desc) { - dma_free_coherent(NULL, sport->tx_desc_bytes, \ - sport->dma_tx_desc, 0); - } - - sport->dma_tx_desc = dma_alloc_coherent(NULL, \ - fragcount * sizeof(struct dmasg), &addr, 0); - sport->tx_desc_bytes = fragcount * sizeof(struct dmasg); - if (!sport->dma_tx_desc) { - pr_err("Failed to allocate memory for tx desc\n"); - return -ENOMEM; - } - - sport->tx_buf = buf; - sport->tx_fragsize = fragsize; - sport->tx_frags = fragcount; - cfg = 0x7000 | DI_EN | compute_wdsize(sport->wdsize) | \ - (DESC_ELEMENT_COUNT << 8); /* large descriptor mode */ - - if (y_count != 0) - cfg |= DMA2D; - - setup_desc(sport->dma_tx_desc, buf, fragcount, fragsize, - cfg|DMAEN, x_count, y_count, sport->wdsize); - - return 0; -} -EXPORT_SYMBOL(sport_config_tx_dma); - -/* setup dummy dma descriptor ring, which don't generate interrupts, - * the x_modify is set to 0 */ -static int sport_config_rx_dummy(struct sport_device *sport) -{ - struct dmasg *desc; - unsigned config; - - pr_debug("%s entered\n", __func__); - if (L1_DATA_A_LENGTH) - desc = l1_data_sram_zalloc(2 * sizeof(*desc)); - else { - dma_addr_t addr; - desc = dma_alloc_coherent(NULL, 2 * sizeof(*desc), &addr, 0); - memset(desc, 0, 2 * sizeof(*desc)); - } - if (desc == NULL) { - pr_err("Failed to allocate memory for dummy rx desc\n"); - return -ENOMEM; - } - sport->dummy_rx_desc = desc; - desc->start_addr = (unsigned long)sport->dummy_buf; - config = DMAFLOW_LARGE | NDSIZE_9 | compute_wdsize(sport->wdsize) - | WNR | DMAEN; - desc->cfg = config; - desc->x_count = sport->dummy_count/sport->wdsize; - desc->x_modify = sport->wdsize; - desc->y_count = 0; - desc->y_modify = 0; - memcpy(desc+1, desc, sizeof(*desc)); - desc->next_desc_addr = desc + 1; - desc[1].next_desc_addr = desc; - return 0; -} - -static int sport_config_tx_dummy(struct sport_device *sport) -{ - struct dmasg *desc; - unsigned int config; - - pr_debug("%s entered\n", __func__); - - if (L1_DATA_A_LENGTH) - desc = l1_data_sram_zalloc(2 * sizeof(*desc)); - else { - dma_addr_t addr; - desc = dma_alloc_coherent(NULL, 2 * sizeof(*desc), &addr, 0); - memset(desc, 0, 2 * sizeof(*desc)); - } - if (!desc) { - pr_err("Failed to allocate memory for dummy tx desc\n"); - return -ENOMEM; - } - sport->dummy_tx_desc = desc; - desc->start_addr = (unsigned long)sport->dummy_buf + \ - sport->dummy_count; - config = DMAFLOW_LARGE | NDSIZE_9 | - compute_wdsize(sport->wdsize) | DMAEN; - desc->cfg = config; - desc->x_count = sport->dummy_count/sport->wdsize; - desc->x_modify = sport->wdsize; - desc->y_count = 0; - desc->y_modify = 0; - memcpy(desc+1, desc, sizeof(*desc)); - desc->next_desc_addr = desc + 1; - desc[1].next_desc_addr = desc; - return 0; -} - -unsigned long sport_curr_offset_rx(struct sport_device *sport) -{ - unsigned long curr = get_dma_curr_addr(sport->dma_rx_chan); - - return (unsigned char *)curr - sport->rx_buf; -} -EXPORT_SYMBOL(sport_curr_offset_rx); - -unsigned long sport_curr_offset_tx(struct sport_device *sport) -{ - unsigned long curr = get_dma_curr_addr(sport->dma_tx_chan); - - return (unsigned char *)curr - sport->tx_buf; -} -EXPORT_SYMBOL(sport_curr_offset_tx); - -void sport_incfrag(struct sport_device *sport, int *frag, int tx) -{ - ++(*frag); - if (tx == 1 && *frag == sport->tx_frags) - *frag = 0; - - if (tx == 0 && *frag == sport->rx_frags) - *frag = 0; -} -EXPORT_SYMBOL(sport_incfrag); - -void sport_decfrag(struct sport_device *sport, int *frag, int tx) -{ - --(*frag); - if (tx == 1 && *frag == 0) - *frag = sport->tx_frags; - - if (tx == 0 && *frag == 0) - *frag = sport->rx_frags; -} -EXPORT_SYMBOL(sport_decfrag); - -static int sport_check_status(struct sport_device *sport, - unsigned int *sport_stat, - unsigned int *rx_stat, - unsigned int *tx_stat) -{ - int status = 0; - - if (sport_stat) { - SSYNC(); - status = sport->regs->stat; - if (status & (TOVF|TUVF|ROVF|RUVF)) - sport->regs->stat = (status & (TOVF|TUVF|ROVF|RUVF)); - SSYNC(); - *sport_stat = status; - } - - if (rx_stat) { - SSYNC(); - status = get_dma_curr_irqstat(sport->dma_rx_chan); - if (status & (DMA_DONE|DMA_ERR)) - clear_dma_irqstat(sport->dma_rx_chan); - SSYNC(); - *rx_stat = status; - } - - if (tx_stat) { - SSYNC(); - status = get_dma_curr_irqstat(sport->dma_tx_chan); - if (status & (DMA_DONE|DMA_ERR)) - clear_dma_irqstat(sport->dma_tx_chan); - SSYNC(); - *tx_stat = status; - } - - return 0; -} - -int sport_dump_stat(struct sport_device *sport, char *buf, size_t len) -{ - int ret; - - ret = snprintf(buf, len, - "sts: 0x%04x\n" - "rx dma %d sts: 0x%04x tx dma %d sts: 0x%04x\n", - sport->regs->stat, - sport->dma_rx_chan, - get_dma_curr_irqstat(sport->dma_rx_chan), - sport->dma_tx_chan, - get_dma_curr_irqstat(sport->dma_tx_chan)); - buf += ret; - len -= ret; - - ret += snprintf(buf, len, - "curr_rx_desc:0x%p, curr_tx_desc:0x%p\n" - "dma_rx_desc:0x%p, dma_tx_desc:0x%p\n" - "dummy_rx_desc:0x%p, dummy_tx_desc:0x%p\n", - sport->curr_rx_desc, sport->curr_tx_desc, - sport->dma_rx_desc, sport->dma_tx_desc, - sport->dummy_rx_desc, sport->dummy_tx_desc); - - return ret; -} - -static irqreturn_t rx_handler(int irq, void *dev_id) -{ - unsigned int rx_stat; - struct sport_device *sport = dev_id; - - pr_debug("%s enter\n", __func__); - sport_check_status(sport, NULL, &rx_stat, NULL); - if (!(rx_stat & DMA_DONE)) - pr_err("rx dma is already stopped\n"); - - if (sport->rx_callback) { - sport->rx_callback(sport->rx_data); - return IRQ_HANDLED; - } - - return IRQ_NONE; -} - -static irqreturn_t tx_handler(int irq, void *dev_id) -{ - unsigned int tx_stat; - struct sport_device *sport = dev_id; - pr_debug("%s enter\n", __func__); - sport_check_status(sport, NULL, NULL, &tx_stat); - if (!(tx_stat & DMA_DONE)) { - pr_err("tx dma is already stopped\n"); - return IRQ_HANDLED; - } - if (sport->tx_callback) { - sport->tx_callback(sport->tx_data); - return IRQ_HANDLED; - } - - return IRQ_NONE; -} - -static irqreturn_t err_handler(int irq, void *dev_id) -{ - unsigned int status = 0; - struct sport_device *sport = dev_id; - - pr_debug("%s\n", __func__); - if (sport_check_status(sport, &status, NULL, NULL)) { - pr_err("error checking status ??"); - return IRQ_NONE; - } - - if (status & (TOVF|TUVF|ROVF|RUVF)) { - pr_info("sport status error:%s%s%s%s\n", - status & TOVF ? " TOVF" : "", - status & TUVF ? " TUVF" : "", - status & ROVF ? " ROVF" : "", - status & RUVF ? " RUVF" : ""); - if (status & TOVF || status & TUVF) { - disable_dma(sport->dma_tx_chan); - if (sport->tx_run) - sport_tx_dma_start(sport, 0); - else - sport_tx_dma_start(sport, 1); - enable_dma(sport->dma_tx_chan); - } else { - disable_dma(sport->dma_rx_chan); - if (sport->rx_run) - sport_rx_dma_start(sport, 0); - else - sport_rx_dma_start(sport, 1); - enable_dma(sport->dma_rx_chan); - } - } - status = sport->regs->stat; - if (status & (TOVF|TUVF|ROVF|RUVF)) - sport->regs->stat = (status & (TOVF|TUVF|ROVF|RUVF)); - SSYNC(); - - if (sport->err_callback) - sport->err_callback(sport->err_data); - - return IRQ_HANDLED; -} - -int sport_set_rx_callback(struct sport_device *sport, - void (*rx_callback)(void *), void *rx_data) -{ - if (WARN_ON(!rx_callback)) - return -EINVAL; - sport->rx_callback = rx_callback; - sport->rx_data = rx_data; - - return 0; -} -EXPORT_SYMBOL(sport_set_rx_callback); - -int sport_set_tx_callback(struct sport_device *sport, - void (*tx_callback)(void *), void *tx_data) -{ - if (WARN_ON(!tx_callback)) - return -EINVAL; - sport->tx_callback = tx_callback; - sport->tx_data = tx_data; - - return 0; -} -EXPORT_SYMBOL(sport_set_tx_callback); - -int sport_set_err_callback(struct sport_device *sport, - void (*err_callback)(void *), void *err_data) -{ - if (WARN_ON(!err_callback)) - return -EINVAL; - sport->err_callback = err_callback; - sport->err_data = err_data; - - return 0; -} -EXPORT_SYMBOL(sport_set_err_callback); - -static int sport_config_pdev(struct platform_device *pdev, struct sport_param *param) -{ - /* Extract settings from platform data */ - struct device *dev = &pdev->dev; - struct bfin_snd_platform_data *pdata = dev->platform_data; - struct resource *res; - - param->num = pdev->id; - - if (!pdata) { - dev_err(dev, "no platform_data\n"); - return -ENODEV; - } - param->pin_req = pdata->pin_req; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(dev, "no MEM resource\n"); - return -ENODEV; - } - param->regs = (struct sport_register *)res->start; - - /* first RX, then TX */ - res = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!res) { - dev_err(dev, "no rx DMA resource\n"); - return -ENODEV; - } - param->dma_rx_chan = res->start; - - res = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!res) { - dev_err(dev, "no tx DMA resource\n"); - return -ENODEV; - } - param->dma_tx_chan = res->start; - - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (!res) { - dev_err(dev, "no irq resource\n"); - return -ENODEV; - } - param->err_irq = res->start; - - return 0; -} - -struct sport_device *sport_init(struct platform_device *pdev, - unsigned int wdsize, unsigned int dummy_count, size_t priv_size) -{ - struct device *dev = &pdev->dev; - struct sport_param param; - struct sport_device *sport; - int ret; - - dev_dbg(dev, "%s enter\n", __func__); - - param.wdsize = wdsize; - param.dummy_count = dummy_count; - if (WARN_ON(param.wdsize == 0 || param.dummy_count == 0)) - return NULL; - - ret = sport_config_pdev(pdev, ¶m); - if (ret) - return NULL; - - if (peripheral_request_list(param.pin_req, "soc-audio")) { - dev_err(dev, "requesting Peripherals failed\n"); - return NULL; - } - - sport = kzalloc(sizeof(*sport), GFP_KERNEL); - if (!sport) { - dev_err(dev, "failed to allocate for sport device\n"); - goto __init_err0; - } - - sport->num = param.num; - sport->dma_rx_chan = param.dma_rx_chan; - sport->dma_tx_chan = param.dma_tx_chan; - sport->err_irq = param.err_irq; - sport->regs = param.regs; - sport->pin_req = param.pin_req; - - if (request_dma(sport->dma_rx_chan, "SPORT RX Data") == -EBUSY) { - dev_err(dev, "failed to request RX dma %d\n", sport->dma_rx_chan); - goto __init_err1; - } - if (set_dma_callback(sport->dma_rx_chan, rx_handler, sport) != 0) { - dev_err(dev, "failed to request RX irq %d\n", sport->dma_rx_chan); - goto __init_err2; - } - - if (request_dma(sport->dma_tx_chan, "SPORT TX Data") == -EBUSY) { - dev_err(dev, "failed to request TX dma %d\n", sport->dma_tx_chan); - goto __init_err2; - } - - if (set_dma_callback(sport->dma_tx_chan, tx_handler, sport) != 0) { - dev_err(dev, "failed to request TX irq %d\n", sport->dma_tx_chan); - goto __init_err3; - } - - if (request_irq(sport->err_irq, err_handler, IRQF_SHARED, "SPORT err", - sport) < 0) { - dev_err(dev, "failed to request err irq %d\n", sport->err_irq); - goto __init_err3; - } - - dev_info(dev, "dma rx:%d tx:%d, err irq:%d, regs:%p\n", - sport->dma_rx_chan, sport->dma_tx_chan, - sport->err_irq, sport->regs); - - sport->wdsize = param.wdsize; - sport->dummy_count = param.dummy_count; - - sport->private_data = kzalloc(priv_size, GFP_KERNEL); - if (!sport->private_data) { - dev_err(dev, "could not alloc priv data %zu bytes\n", priv_size); - goto __init_err4; - } - - if (L1_DATA_A_LENGTH) - sport->dummy_buf = l1_data_sram_zalloc(param.dummy_count * 2); - else - sport->dummy_buf = kzalloc(param.dummy_count * 2, GFP_KERNEL); - if (sport->dummy_buf == NULL) { - dev_err(dev, "failed to allocate dummy buffer\n"); - goto __error1; - } - - ret = sport_config_rx_dummy(sport); - if (ret) { - dev_err(dev, "failed to config rx dummy ring\n"); - goto __error2; - } - ret = sport_config_tx_dummy(sport); - if (ret) { - dev_err(dev, "failed to config tx dummy ring\n"); - goto __error3; - } - - platform_set_drvdata(pdev, sport); - - return sport; -__error3: - if (L1_DATA_A_LENGTH) - l1_data_sram_free(sport->dummy_rx_desc); - else - dma_free_coherent(NULL, 2*sizeof(struct dmasg), - sport->dummy_rx_desc, 0); -__error2: - if (L1_DATA_A_LENGTH) - l1_data_sram_free(sport->dummy_buf); - else - kfree(sport->dummy_buf); -__error1: - kfree(sport->private_data); -__init_err4: - free_irq(sport->err_irq, sport); -__init_err3: - free_dma(sport->dma_tx_chan); -__init_err2: - free_dma(sport->dma_rx_chan); -__init_err1: - kfree(sport); -__init_err0: - peripheral_free_list(param.pin_req); - return NULL; -} -EXPORT_SYMBOL(sport_init); - -void sport_done(struct sport_device *sport) -{ - if (sport == NULL) - return; - - sport_stop(sport); - if (sport->dma_rx_desc) - dma_free_coherent(NULL, sport->rx_desc_bytes, - sport->dma_rx_desc, 0); - if (sport->dma_tx_desc) - dma_free_coherent(NULL, sport->tx_desc_bytes, - sport->dma_tx_desc, 0); - -#if L1_DATA_A_LENGTH != 0 - l1_data_sram_free(sport->dummy_rx_desc); - l1_data_sram_free(sport->dummy_tx_desc); - l1_data_sram_free(sport->dummy_buf); -#else - dma_free_coherent(NULL, 2*sizeof(struct dmasg), - sport->dummy_rx_desc, 0); - dma_free_coherent(NULL, 2*sizeof(struct dmasg), - sport->dummy_tx_desc, 0); - kfree(sport->dummy_buf); -#endif - free_dma(sport->dma_rx_chan); - free_dma(sport->dma_tx_chan); - free_irq(sport->err_irq, sport); - - kfree(sport->private_data); - peripheral_free_list(sport->pin_req); - kfree(sport); -} -EXPORT_SYMBOL(sport_done); - -/* -* It is only used to send several bytes when dma is not enabled - * sport controller is configured but not enabled. - * Multichannel cannot works with pio mode */ -/* Used by ac97 to write and read codec register */ -int sport_send_and_recv(struct sport_device *sport, u8 *out_data, \ - u8 *in_data, int len) -{ - unsigned short dma_config; - unsigned short status; - unsigned long flags; - unsigned long wait = 0; - - pr_debug("%s enter, out_data:%p, in_data:%p len:%d\n", \ - __func__, out_data, in_data, len); - pr_debug("tcr1:0x%04x, tcr2:0x%04x, tclkdiv:0x%04x, tfsdiv:0x%04x\n" - "mcmc1:0x%04x, mcmc2:0x%04x\n", - sport->regs->tcr1, sport->regs->tcr2, - sport->regs->tclkdiv, sport->regs->tfsdiv, - sport->regs->mcmc1, sport->regs->mcmc2); - flush_dcache_range((unsigned)out_data, (unsigned)(out_data + len)); - - /* Enable tx dma */ - dma_config = (RESTART | WDSIZE_16 | DI_EN); - set_dma_start_addr(sport->dma_tx_chan, (unsigned long)out_data); - set_dma_x_count(sport->dma_tx_chan, len/2); - set_dma_x_modify(sport->dma_tx_chan, 2); - set_dma_config(sport->dma_tx_chan, dma_config); - enable_dma(sport->dma_tx_chan); - - if (in_data != NULL) { - invalidate_dcache_range((unsigned)in_data, \ - (unsigned)(in_data + len)); - /* Enable rx dma */ - dma_config = (RESTART | WDSIZE_16 | WNR | DI_EN); - set_dma_start_addr(sport->dma_rx_chan, (unsigned long)in_data); - set_dma_x_count(sport->dma_rx_chan, len/2); - set_dma_x_modify(sport->dma_rx_chan, 2); - set_dma_config(sport->dma_rx_chan, dma_config); - enable_dma(sport->dma_rx_chan); - } - - local_irq_save(flags); - sport->regs->tcr1 |= TSPEN; - sport->regs->rcr1 |= RSPEN; - SSYNC(); - - status = get_dma_curr_irqstat(sport->dma_tx_chan); - while (status & DMA_RUN) { - udelay(1); - status = get_dma_curr_irqstat(sport->dma_tx_chan); - pr_debug("DMA status:0x%04x\n", status); - if (wait++ > 100) - goto __over; - } - status = sport->regs->stat; - wait = 0; - - while (!(status & TXHRE)) { - pr_debug("sport status:0x%04x\n", status); - udelay(1); - status = *(unsigned short *)&sport->regs->stat; - if (wait++ > 1000) - goto __over; - } - /* Wait for the last byte sent out */ - udelay(20); - pr_debug("sport status:0x%04x\n", status); - -__over: - sport->regs->tcr1 &= ~TSPEN; - sport->regs->rcr1 &= ~RSPEN; - SSYNC(); - disable_dma(sport->dma_tx_chan); - /* Clear the status */ - clear_dma_irqstat(sport->dma_tx_chan); - if (in_data != NULL) { - disable_dma(sport->dma_rx_chan); - clear_dma_irqstat(sport->dma_rx_chan); - } - SSYNC(); - local_irq_restore(flags); - - return 0; -} -EXPORT_SYMBOL(sport_send_and_recv); - -MODULE_AUTHOR("Roy Huang"); -MODULE_DESCRIPTION("SPORT driver for ADI Blackfin"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/blackfin/bf5xx-sport.h b/sound/soc/blackfin/bf5xx-sport.h deleted file mode 100644 index 9fc2192feb3b..000000000000 --- a/sound/soc/blackfin/bf5xx-sport.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * File: bf5xx_sport.h - * Based on: - * Author: Roy Huang <roy.huang@analog.com> - * - * Created: - * Description: - * - * Copyright 2004-2007 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef __BF5XX_SPORT_H__ -#define __BF5XX_SPORT_H__ - -#include <linux/types.h> -#include <linux/wait.h> -#include <linux/workqueue.h> -#include <linux/platform_device.h> -#include <asm/dma.h> -#include <asm/bfin_sport.h> - -#define DESC_ELEMENT_COUNT 9 - -struct sport_device { - int num; - int dma_rx_chan; - int dma_tx_chan; - int err_irq; - const unsigned short *pin_req; - struct sport_register *regs; - - unsigned char *rx_buf; - unsigned char *tx_buf; - unsigned int rx_fragsize; - unsigned int tx_fragsize; - unsigned int rx_frags; - unsigned int tx_frags; - unsigned int wdsize; - - /* for dummy dma transfer */ - void *dummy_buf; - unsigned int dummy_count; - - /* DMA descriptor ring head of current audio stream*/ - struct dmasg *dma_rx_desc; - struct dmasg *dma_tx_desc; - unsigned int rx_desc_bytes; - unsigned int tx_desc_bytes; - - unsigned int rx_run:1; /* rx is running */ - unsigned int tx_run:1; /* tx is running */ - - struct dmasg *dummy_rx_desc; - struct dmasg *dummy_tx_desc; - - struct dmasg *curr_rx_desc; - struct dmasg *curr_tx_desc; - - int rx_curr_frag; - int tx_curr_frag; - - unsigned int rcr1; - unsigned int rcr2; - int rx_tdm_count; - - unsigned int tcr1; - unsigned int tcr2; - int tx_tdm_count; - - void (*rx_callback)(void *data); - void *rx_data; - void (*tx_callback)(void *data); - void *tx_data; - void (*err_callback)(void *data); - void *err_data; - unsigned char *tx_dma_buf; - unsigned char *rx_dma_buf; -#ifdef CONFIG_SND_BF5XX_MMAP_SUPPORT - dma_addr_t tx_dma_phy; - dma_addr_t rx_dma_phy; - int tx_pos;/*pcm sample count*/ - int rx_pos; - unsigned int tx_buffer_size; - unsigned int rx_buffer_size; - int tx_delay_pos; - int once; -#endif - void *private_data; -}; - -struct sport_param { - int num; - int dma_rx_chan; - int dma_tx_chan; - int err_irq; - const unsigned short *pin_req; - struct sport_register *regs; - unsigned int wdsize; - unsigned int dummy_count; - void *private_data; -}; - -struct sport_device *sport_init(struct platform_device *pdev, - unsigned int wdsize, unsigned int dummy_count, size_t priv_size); - -void sport_done(struct sport_device *sport); - -/* first use these ...*/ - -/* note: multichannel is in units of 8 channels, tdm_count is number of channels - * NOT / 8 ! all channels are enabled by default */ -int sport_set_multichannel(struct sport_device *sport, int tdm_count, - u32 tx_mask, u32 rx_mask, int packed); - -int sport_config_rx(struct sport_device *sport, - unsigned int rcr1, unsigned int rcr2, - unsigned int clkdiv, unsigned int fsdiv); - -int sport_config_tx(struct sport_device *sport, - unsigned int tcr1, unsigned int tcr2, - unsigned int clkdiv, unsigned int fsdiv); - -/* ... then these: */ - -/* buffer size (in bytes) == fragcount * fragsize_bytes */ - -/* this is not a very general api, it sets the dma to 2d autobuffer mode */ - -int sport_config_rx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize_bytes); - -int sport_config_tx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize_bytes); - -int sport_tx_start(struct sport_device *sport); -int sport_tx_stop(struct sport_device *sport); -int sport_rx_start(struct sport_device *sport); -int sport_rx_stop(struct sport_device *sport); - -/* for use in interrupt handler */ -unsigned long sport_curr_offset_rx(struct sport_device *sport); -unsigned long sport_curr_offset_tx(struct sport_device *sport); - -void sport_incfrag(struct sport_device *sport, int *frag, int tx); -void sport_decfrag(struct sport_device *sport, int *frag, int tx); - -int sport_set_rx_callback(struct sport_device *sport, - void (*rx_callback)(void *), void *rx_data); -int sport_set_tx_callback(struct sport_device *sport, - void (*tx_callback)(void *), void *tx_data); -int sport_set_err_callback(struct sport_device *sport, - void (*err_callback)(void *), void *err_data); - -int sport_send_and_recv(struct sport_device *sport, u8 *out_data, \ - u8 *in_data, int len); -#endif /* BF53X_SPORT_H */ diff --git a/sound/soc/blackfin/bf5xx-ssm2602.c b/sound/soc/blackfin/bf5xx-ssm2602.c deleted file mode 100644 index 9c19ccc936e2..000000000000 --- a/sound/soc/blackfin/bf5xx-ssm2602.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * File: sound/soc/blackfin/bf5xx-ssm2602.c - * Author: Cliff Cai <Cliff.Cai@analog.com> - * - * Created: Tue June 06 2008 - * Description: board driver for SSM2602 sound chip - * - * Modified: - * Copyright 2008 Analog Devices Inc. - * - * Bugs: Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/device.h> - -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include <asm/dma.h> -#include <asm/portmux.h> -#include <linux/gpio.h> -#include "../codecs/ssm2602.h" -#include "bf5xx-sport.h" - -static struct snd_soc_card bf5xx_ssm2602; - -static int bf5xx_ssm2602_dai_init(struct snd_soc_pcm_runtime *rtd) -{ - /* - * If you are using a crystal source which frequency is not 12MHz - * then modify the below case statement with frequency of the crystal. - * - * If you are using the SPORT to generate clocking then this is - * where to do it. - */ - return snd_soc_dai_set_sysclk(rtd->codec_dai, SSM2602_SYSCLK, 12000000, - SND_SOC_CLOCK_IN); -} - -/* CODEC is master for BCLK and LRC in this configuration. */ -#define BF5XX_SSM2602_DAIFMT (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | \ - SND_SOC_DAIFMT_CBM_CFM) - -static struct snd_soc_dai_link bf5xx_ssm2602_dai[] = { - { - .name = "ssm2602", - .stream_name = "SSM2602", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "ssm2602-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "ssm2602.0-001b", - .init = bf5xx_ssm2602_dai_init, - .dai_fmt = BF5XX_SSM2602_DAIFMT, - }, - { - .name = "ssm2602", - .stream_name = "SSM2602", - .cpu_dai_name = "bfin-i2s.1", - .codec_dai_name = "ssm2602-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "ssm2602.0-001b", - .init = bf5xx_ssm2602_dai_init, - .dai_fmt = BF5XX_SSM2602_DAIFMT, - }, -}; - -static struct snd_soc_card bf5xx_ssm2602 = { - .name = "bfin-ssm2602", - .owner = THIS_MODULE, - .dai_link = &bf5xx_ssm2602_dai[CONFIG_SND_BF5XX_SPORT_NUM], - .num_links = 1, -}; - -static struct platform_device *bf5xx_ssm2602_snd_device; - -static int __init bf5xx_ssm2602_init(void) -{ - int ret; - - pr_debug("%s enter\n", __func__); - bf5xx_ssm2602_snd_device = platform_device_alloc("soc-audio", -1); - if (!bf5xx_ssm2602_snd_device) - return -ENOMEM; - - platform_set_drvdata(bf5xx_ssm2602_snd_device, &bf5xx_ssm2602); - ret = platform_device_add(bf5xx_ssm2602_snd_device); - - if (ret) - platform_device_put(bf5xx_ssm2602_snd_device); - - return ret; -} - -static void __exit bf5xx_ssm2602_exit(void) -{ - pr_debug("%s enter\n", __func__); - platform_device_unregister(bf5xx_ssm2602_snd_device); -} - -module_init(bf5xx_ssm2602_init); -module_exit(bf5xx_ssm2602_exit); - -/* Module information */ -MODULE_AUTHOR("Cliff Cai"); -MODULE_DESCRIPTION("ALSA SoC SSM2602 BF527-EZKIT"); -MODULE_LICENSE("GPL"); - diff --git a/sound/soc/blackfin/bf6xx-i2s.c b/sound/soc/blackfin/bf6xx-i2s.c deleted file mode 100644 index 819cff149a25..000000000000 --- a/sound/soc/blackfin/bf6xx-i2s.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * bf6xx-i2s.c - Analog Devices BF6XX i2s interface driver - * - * Copyright (c) 2012 Analog Devices Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/device.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <sound/pcm.h> -#include <sound/pcm_params.h> -#include <sound/soc.h> -#include <sound/soc-dai.h> - -#include "bf6xx-sport.h" - -struct sport_params param; - -static int bfin_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, - unsigned int fmt) -{ - struct sport_device *sport = snd_soc_dai_get_drvdata(cpu_dai); - struct device *dev = &sport->pdev->dev; - int ret = 0; - - param.spctl &= ~(SPORT_CTL_OPMODE | SPORT_CTL_CKRE | SPORT_CTL_FSR - | SPORT_CTL_LFS | SPORT_CTL_LAFS); - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_I2S: - param.spctl |= SPORT_CTL_OPMODE | SPORT_CTL_CKRE - | SPORT_CTL_LFS; - break; - case SND_SOC_DAIFMT_DSP_A: - param.spctl |= SPORT_CTL_FSR; - break; - case SND_SOC_DAIFMT_LEFT_J: - param.spctl |= SPORT_CTL_OPMODE | SPORT_CTL_LFS - | SPORT_CTL_LAFS; - break; - default: - dev_err(dev, "%s: Unknown DAI format type\n", __func__); - ret = -EINVAL; - break; - } - - param.spctl &= ~(SPORT_CTL_ICLK | SPORT_CTL_IFS); - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBM_CFM: - break; - case SND_SOC_DAIFMT_CBS_CFS: - case SND_SOC_DAIFMT_CBM_CFS: - case SND_SOC_DAIFMT_CBS_CFM: - ret = -EINVAL; - break; - default: - dev_err(dev, "%s: Unknown DAI master type\n", __func__); - ret = -EINVAL; - break; - } - - return ret; -} - -static int bfin_i2s_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params, - struct snd_soc_dai *dai) -{ - struct sport_device *sport = snd_soc_dai_get_drvdata(dai); - struct device *dev = &sport->pdev->dev; - int ret = 0; - - param.spctl &= ~SPORT_CTL_SLEN; - switch (params_format(params)) { - case SNDRV_PCM_FORMAT_S8: - param.spctl |= 0x70; - sport->wdsize = 1; - break; - case SNDRV_PCM_FORMAT_S16_LE: - param.spctl |= 0xf0; - sport->wdsize = 2; - break; - case SNDRV_PCM_FORMAT_S24_LE: - param.spctl |= 0x170; - sport->wdsize = 3; - break; - case SNDRV_PCM_FORMAT_S32_LE: - param.spctl |= 0x1f0; - sport->wdsize = 4; - break; - } - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - ret = sport_set_tx_params(sport, ¶m); - if (ret) { - dev_err(dev, "SPORT tx is busy!\n"); - return ret; - } - } else { - ret = sport_set_rx_params(sport, ¶m); - if (ret) { - dev_err(dev, "SPORT rx is busy!\n"); - return ret; - } - } - return 0; -} - -#ifdef CONFIG_PM -static int bfin_i2s_suspend(struct snd_soc_dai *dai) -{ - struct sport_device *sport = snd_soc_dai_get_drvdata(dai); - - if (dai->capture_active) - sport_rx_stop(sport); - if (dai->playback_active) - sport_tx_stop(sport); - return 0; -} - -static int bfin_i2s_resume(struct snd_soc_dai *dai) -{ - struct sport_device *sport = snd_soc_dai_get_drvdata(dai); - struct device *dev = &sport->pdev->dev; - int ret; - - ret = sport_set_tx_params(sport, ¶m); - if (ret) { - dev_err(dev, "SPORT tx is busy!\n"); - return ret; - } - ret = sport_set_rx_params(sport, ¶m); - if (ret) { - dev_err(dev, "SPORT rx is busy!\n"); - return ret; - } - - return 0; -} - -#else -#define bfin_i2s_suspend NULL -#define bfin_i2s_resume NULL -#endif - -#define BFIN_I2S_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ - SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \ - SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \ - SNDRV_PCM_RATE_96000) - -#define BFIN_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) - -static const struct snd_soc_dai_ops bfin_i2s_dai_ops = { - .hw_params = bfin_i2s_hw_params, - .set_fmt = bfin_i2s_set_dai_fmt, -}; - -static struct snd_soc_dai_driver bfin_i2s_dai = { - .suspend = bfin_i2s_suspend, - .resume = bfin_i2s_resume, - .playback = { - .channels_min = 1, - .channels_max = 2, - .rates = BFIN_I2S_RATES, - .formats = BFIN_I2S_FORMATS, - }, - .capture = { - .channels_min = 1, - .channels_max = 2, - .rates = BFIN_I2S_RATES, - .formats = BFIN_I2S_FORMATS, - }, - .ops = &bfin_i2s_dai_ops, -}; - -static const struct snd_soc_component_driver bfin_i2s_component = { - .name = "bfin-i2s", -}; - -static int bfin_i2s_probe(struct platform_device *pdev) -{ - struct sport_device *sport; - struct device *dev = &pdev->dev; - int ret; - - sport = sport_create(pdev); - if (!sport) - return -ENODEV; - - /* register with the ASoC layers */ - ret = snd_soc_register_component(dev, &bfin_i2s_component, - &bfin_i2s_dai, 1); - if (ret) { - dev_err(dev, "Failed to register DAI: %d\n", ret); - sport_delete(sport); - return ret; - } - platform_set_drvdata(pdev, sport); - - return 0; -} - -static int bfin_i2s_remove(struct platform_device *pdev) -{ - struct sport_device *sport = platform_get_drvdata(pdev); - - snd_soc_unregister_component(&pdev->dev); - sport_delete(sport); - - return 0; -} - -static struct platform_driver bfin_i2s_driver = { - .probe = bfin_i2s_probe, - .remove = bfin_i2s_remove, - .driver = { - .name = "bfin-i2s", - }, -}; - -module_platform_driver(bfin_i2s_driver); - -MODULE_DESCRIPTION("Analog Devices BF6XX i2s interface driver"); -MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/blackfin/bf6xx-sport.c b/sound/soc/blackfin/bf6xx-sport.c deleted file mode 100644 index d2caadfe7b6d..000000000000 --- a/sound/soc/blackfin/bf6xx-sport.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * bf6xx_sport.c Analog Devices BF6XX SPORT driver - * - * Copyright (c) 2012 Analog Devices Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <linux/device.h> -#include <linux/dma-mapping.h> -#include <linux/interrupt.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/slab.h> - -#include <asm/blackfin.h> -#include <asm/dma.h> -#include <asm/portmux.h> - -#include "bf6xx-sport.h" - -int sport_set_tx_params(struct sport_device *sport, - struct sport_params *params) -{ - if (sport->tx_regs->spctl & SPORT_CTL_SPENPRI) - return -EBUSY; - sport->tx_regs->spctl = params->spctl | SPORT_CTL_SPTRAN; - sport->tx_regs->div = params->div; - SSYNC(); - return 0; -} -EXPORT_SYMBOL(sport_set_tx_params); - -int sport_set_rx_params(struct sport_device *sport, - struct sport_params *params) -{ - if (sport->rx_regs->spctl & SPORT_CTL_SPENPRI) - return -EBUSY; - sport->rx_regs->spctl = params->spctl & ~SPORT_CTL_SPTRAN; - sport->rx_regs->div = params->div; - SSYNC(); - return 0; -} -EXPORT_SYMBOL(sport_set_rx_params); - -static int compute_wdsize(size_t wdsize) -{ - switch (wdsize) { - case 1: - return WDSIZE_8 | PSIZE_8; - case 2: - return WDSIZE_16 | PSIZE_16; - default: - return WDSIZE_32 | PSIZE_32; - } -} - -void sport_tx_start(struct sport_device *sport) -{ - set_dma_next_desc_addr(sport->tx_dma_chan, sport->tx_desc); - set_dma_config(sport->tx_dma_chan, DMAFLOW_LIST | DI_EN - | compute_wdsize(sport->wdsize) | NDSIZE_6); - enable_dma(sport->tx_dma_chan); - sport->tx_regs->spctl |= SPORT_CTL_SPENPRI; - SSYNC(); -} -EXPORT_SYMBOL(sport_tx_start); - -void sport_rx_start(struct sport_device *sport) -{ - set_dma_next_desc_addr(sport->rx_dma_chan, sport->rx_desc); - set_dma_config(sport->rx_dma_chan, DMAFLOW_LIST | DI_EN | WNR - | compute_wdsize(sport->wdsize) | NDSIZE_6); - enable_dma(sport->rx_dma_chan); - sport->rx_regs->spctl |= SPORT_CTL_SPENPRI; - SSYNC(); -} -EXPORT_SYMBOL(sport_rx_start); - -void sport_tx_stop(struct sport_device *sport) -{ - sport->tx_regs->spctl &= ~SPORT_CTL_SPENPRI; - SSYNC(); - disable_dma(sport->tx_dma_chan); -} -EXPORT_SYMBOL(sport_tx_stop); - -void sport_rx_stop(struct sport_device *sport) -{ - sport->rx_regs->spctl &= ~SPORT_CTL_SPENPRI; - SSYNC(); - disable_dma(sport->rx_dma_chan); -} -EXPORT_SYMBOL(sport_rx_stop); - -void sport_set_tx_callback(struct sport_device *sport, - void (*tx_callback)(void *), void *tx_data) -{ - sport->tx_callback = tx_callback; - sport->tx_data = tx_data; -} -EXPORT_SYMBOL(sport_set_tx_callback); - -void sport_set_rx_callback(struct sport_device *sport, - void (*rx_callback)(void *), void *rx_data) -{ - sport->rx_callback = rx_callback; - sport->rx_data = rx_data; -} -EXPORT_SYMBOL(sport_set_rx_callback); - -static void setup_desc(struct dmasg *desc, void *buf, int fragcount, - size_t fragsize, unsigned int cfg, - unsigned int count, size_t wdsize) -{ - - int i; - - for (i = 0; i < fragcount; ++i) { - desc[i].next_desc_addr = &(desc[i + 1]); - desc[i].start_addr = (unsigned long)buf + i * fragsize; - desc[i].cfg = cfg; - desc[i].x_count = count; - desc[i].x_modify = wdsize; - desc[i].y_count = 0; - desc[i].y_modify = 0; - } - - /* make circular */ - desc[fragcount - 1].next_desc_addr = desc; -} - -int sport_config_tx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize) -{ - unsigned int count; - unsigned int cfg; - dma_addr_t addr; - - count = fragsize / sport->wdsize; - - if (sport->tx_desc) - dma_free_coherent(NULL, sport->tx_desc_size, - sport->tx_desc, 0); - - sport->tx_desc = dma_alloc_coherent(NULL, - fragcount * sizeof(struct dmasg), &addr, 0); - sport->tx_desc_size = fragcount * sizeof(struct dmasg); - if (!sport->tx_desc) - return -ENOMEM; - - sport->tx_buf = buf; - sport->tx_fragsize = fragsize; - sport->tx_frags = fragcount; - cfg = DMAFLOW_LIST | DI_EN | compute_wdsize(sport->wdsize) | NDSIZE_6; - - setup_desc(sport->tx_desc, buf, fragcount, fragsize, - cfg | DMAEN, count, sport->wdsize); - return 0; -} -EXPORT_SYMBOL(sport_config_tx_dma); - -int sport_config_rx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize) -{ - unsigned int count; - unsigned int cfg; - dma_addr_t addr; - - count = fragsize / sport->wdsize; - - if (sport->rx_desc) - dma_free_coherent(NULL, sport->rx_desc_size, - sport->rx_desc, 0); - - sport->rx_desc = dma_alloc_coherent(NULL, - fragcount * sizeof(struct dmasg), &addr, 0); - sport->rx_desc_size = fragcount * sizeof(struct dmasg); - if (!sport->rx_desc) - return -ENOMEM; - - sport->rx_buf = buf; - sport->rx_fragsize = fragsize; - sport->rx_frags = fragcount; - cfg = DMAFLOW_LIST | DI_EN | compute_wdsize(sport->wdsize) - | WNR | NDSIZE_6; - - setup_desc(sport->rx_desc, buf, fragcount, fragsize, - cfg | DMAEN, count, sport->wdsize); - return 0; -} -EXPORT_SYMBOL(sport_config_rx_dma); - -unsigned long sport_curr_offset_tx(struct sport_device *sport) -{ - unsigned long curr = get_dma_curr_addr(sport->tx_dma_chan); - - return (unsigned char *)curr - sport->tx_buf; -} -EXPORT_SYMBOL(sport_curr_offset_tx); - -unsigned long sport_curr_offset_rx(struct sport_device *sport) -{ - unsigned long curr = get_dma_curr_addr(sport->rx_dma_chan); - - return (unsigned char *)curr - sport->rx_buf; -} -EXPORT_SYMBOL(sport_curr_offset_rx); - -static irqreturn_t sport_tx_irq(int irq, void *dev_id) -{ - struct sport_device *sport = dev_id; - static unsigned long status; - - status = get_dma_curr_irqstat(sport->tx_dma_chan); - if (status & (DMA_DONE | DMA_ERR)) { - clear_dma_irqstat(sport->tx_dma_chan); - SSYNC(); - } - if (sport->tx_callback) - sport->tx_callback(sport->tx_data); - return IRQ_HANDLED; -} - -static irqreturn_t sport_rx_irq(int irq, void *dev_id) -{ - struct sport_device *sport = dev_id; - unsigned long status; - - status = get_dma_curr_irqstat(sport->rx_dma_chan); - if (status & (DMA_DONE | DMA_ERR)) { - clear_dma_irqstat(sport->rx_dma_chan); - SSYNC(); - } - if (sport->rx_callback) - sport->rx_callback(sport->rx_data); - return IRQ_HANDLED; -} - -static irqreturn_t sport_err_irq(int irq, void *dev_id) -{ - struct sport_device *sport = dev_id; - struct device *dev = &sport->pdev->dev; - - if (sport->tx_regs->spctl & SPORT_CTL_DERRPRI) - dev_err(dev, "sport error: TUVF\n"); - if (sport->rx_regs->spctl & SPORT_CTL_DERRPRI) - dev_err(dev, "sport error: ROVF\n"); - - return IRQ_HANDLED; -} - -static int sport_get_resource(struct sport_device *sport) -{ - struct platform_device *pdev = sport->pdev; - struct device *dev = &pdev->dev; - struct bfin_snd_platform_data *pdata = dev->platform_data; - struct resource *res; - - if (!pdata) { - dev_err(dev, "No platform data\n"); - return -ENODEV; - } - sport->pin_req = pdata->pin_req; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(dev, "No tx MEM resource\n"); - return -ENODEV; - } - sport->tx_regs = (struct sport_register *)res->start; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (!res) { - dev_err(dev, "No rx MEM resource\n"); - return -ENODEV; - } - sport->rx_regs = (struct sport_register *)res->start; - - res = platform_get_resource(pdev, IORESOURCE_DMA, 0); - if (!res) { - dev_err(dev, "No tx DMA resource\n"); - return -ENODEV; - } - sport->tx_dma_chan = res->start; - - res = platform_get_resource(pdev, IORESOURCE_DMA, 1); - if (!res) { - dev_err(dev, "No rx DMA resource\n"); - return -ENODEV; - } - sport->rx_dma_chan = res->start; - - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (!res) { - dev_err(dev, "No tx error irq resource\n"); - return -ENODEV; - } - sport->tx_err_irq = res->start; - - res = platform_get_resource(pdev, IORESOURCE_IRQ, 1); - if (!res) { - dev_err(dev, "No rx error irq resource\n"); - return -ENODEV; - } - sport->rx_err_irq = res->start; - - return 0; -} - -static int sport_request_resource(struct sport_device *sport) -{ - struct device *dev = &sport->pdev->dev; - int ret; - - ret = peripheral_request_list(sport->pin_req, "soc-audio"); - if (ret) { - dev_err(dev, "Unable to request sport pin\n"); - return ret; - } - - ret = request_dma(sport->tx_dma_chan, "SPORT TX Data"); - if (ret) { - dev_err(dev, "Unable to allocate DMA channel for sport tx\n"); - goto err_tx_dma; - } - set_dma_callback(sport->tx_dma_chan, sport_tx_irq, sport); - - ret = request_dma(sport->rx_dma_chan, "SPORT RX Data"); - if (ret) { - dev_err(dev, "Unable to allocate DMA channel for sport rx\n"); - goto err_rx_dma; - } - set_dma_callback(sport->rx_dma_chan, sport_rx_irq, sport); - - ret = request_irq(sport->tx_err_irq, sport_err_irq, - 0, "SPORT TX ERROR", sport); - if (ret) { - dev_err(dev, "Unable to allocate tx error IRQ for sport\n"); - goto err_tx_irq; - } - - ret = request_irq(sport->rx_err_irq, sport_err_irq, - 0, "SPORT RX ERROR", sport); - if (ret) { - dev_err(dev, "Unable to allocate rx error IRQ for sport\n"); - goto err_rx_irq; - } - - return 0; -err_rx_irq: - free_irq(sport->tx_err_irq, sport); -err_tx_irq: - free_dma(sport->rx_dma_chan); -err_rx_dma: - free_dma(sport->tx_dma_chan); -err_tx_dma: - peripheral_free_list(sport->pin_req); - return ret; -} - -static void sport_free_resource(struct sport_device *sport) -{ - free_irq(sport->rx_err_irq, sport); - free_irq(sport->tx_err_irq, sport); - free_dma(sport->rx_dma_chan); - free_dma(sport->tx_dma_chan); - peripheral_free_list(sport->pin_req); -} - -struct sport_device *sport_create(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct sport_device *sport; - int ret; - - sport = kzalloc(sizeof(*sport), GFP_KERNEL); - if (!sport) - return NULL; - - sport->pdev = pdev; - - ret = sport_get_resource(sport); - if (ret) - goto free_data; - - ret = sport_request_resource(sport); - if (ret) - goto free_data; - - dev_dbg(dev, "SPORT create success\n"); - return sport; -free_data: - kfree(sport); - return NULL; -} -EXPORT_SYMBOL(sport_create); - -void sport_delete(struct sport_device *sport) -{ - if (sport->tx_desc) - dma_free_coherent(NULL, sport->tx_desc_size, - sport->tx_desc, 0); - if (sport->rx_desc) - dma_free_coherent(NULL, sport->rx_desc_size, - sport->rx_desc, 0); - sport_free_resource(sport); - kfree(sport); -} -EXPORT_SYMBOL(sport_delete); - -MODULE_DESCRIPTION("Analog Devices BF6XX SPORT driver"); -MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/blackfin/bf6xx-sport.h b/sound/soc/blackfin/bf6xx-sport.h deleted file mode 100644 index 307d193cfcef..000000000000 --- a/sound/soc/blackfin/bf6xx-sport.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * bf6xx_sport - Analog Devices BF6XX SPORT driver - * - * Copyright (c) 2012 Analog Devices Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _BF6XX_SPORT_H_ -#define _BF6XX_SPORT_H_ - -#include <linux/platform_device.h> -#include <asm/bfin_sport3.h> - -struct sport_device { - struct platform_device *pdev; - const unsigned short *pin_req; - struct sport_register *tx_regs; - struct sport_register *rx_regs; - int tx_dma_chan; - int rx_dma_chan; - int tx_err_irq; - int rx_err_irq; - - void (*tx_callback)(void *data); - void *tx_data; - void (*rx_callback)(void *data); - void *rx_data; - - struct dmasg *tx_desc; - struct dmasg *rx_desc; - unsigned int tx_desc_size; - unsigned int rx_desc_size; - unsigned char *tx_buf; - unsigned char *rx_buf; - unsigned int tx_fragsize; - unsigned int rx_fragsize; - unsigned int tx_frags; - unsigned int rx_frags; - unsigned int wdsize; -}; - -struct sport_params { - u32 spctl; - u32 div; -}; - -struct sport_device *sport_create(struct platform_device *pdev); -void sport_delete(struct sport_device *sport); -int sport_set_tx_params(struct sport_device *sport, - struct sport_params *params); -int sport_set_rx_params(struct sport_device *sport, - struct sport_params *params); -void sport_tx_start(struct sport_device *sport); -void sport_rx_start(struct sport_device *sport); -void sport_tx_stop(struct sport_device *sport); -void sport_rx_stop(struct sport_device *sport); -void sport_set_tx_callback(struct sport_device *sport, - void (*tx_callback)(void *), void *tx_data); -void sport_set_rx_callback(struct sport_device *sport, - void (*rx_callback)(void *), void *rx_data); -int sport_config_tx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize); -int sport_config_rx_dma(struct sport_device *sport, void *buf, - int fragcount, size_t fragsize); -unsigned long sport_curr_offset_tx(struct sport_device *sport); -unsigned long sport_curr_offset_rx(struct sport_device *sport); - - - -#endif diff --git a/sound/soc/blackfin/bfin-eval-adau1373.c b/sound/soc/blackfin/bfin-eval-adau1373.c deleted file mode 100644 index 64b88fdc1f6c..000000000000 --- a/sound/soc/blackfin/bfin-eval-adau1373.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Machine driver for EVAL-ADAU1373 on Analog Devices bfin - * evaluation boards. - * - * Copyright 2011 Analog Devices Inc. - * Author: Lars-Peter Clausen <lars@metafoo.de> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/device.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include "../codecs/adau1373.h" - -static const struct snd_soc_dapm_widget bfin_eval_adau1373_dapm_widgets[] = { - SND_SOC_DAPM_LINE("Line In1", NULL), - SND_SOC_DAPM_LINE("Line In2", NULL), - SND_SOC_DAPM_LINE("Line In3", NULL), - SND_SOC_DAPM_LINE("Line In4", NULL), - - SND_SOC_DAPM_LINE("Line Out1", NULL), - SND_SOC_DAPM_LINE("Line Out2", NULL), - SND_SOC_DAPM_LINE("Stereo Out", NULL), - SND_SOC_DAPM_HP("Headphone", NULL), - SND_SOC_DAPM_HP("Earpiece", NULL), - SND_SOC_DAPM_SPK("Speaker", NULL), -}; - -static const struct snd_soc_dapm_route bfin_eval_adau1373_dapm_routes[] = { - { "AIN1L", NULL, "Line In1" }, - { "AIN1R", NULL, "Line In1" }, - { "AIN2L", NULL, "Line In2" }, - { "AIN2R", NULL, "Line In2" }, - { "AIN3L", NULL, "Line In3" }, - { "AIN3R", NULL, "Line In3" }, - { "AIN4L", NULL, "Line In4" }, - { "AIN4R", NULL, "Line In4" }, - - /* MICBIAS can be connected via a jumper to the line-in jack, since w - don't know which one is going to be used, just power both. */ - { "Line In1", NULL, "MICBIAS1" }, - { "Line In2", NULL, "MICBIAS1" }, - { "Line In3", NULL, "MICBIAS1" }, - { "Line In4", NULL, "MICBIAS1" }, - { "Line In1", NULL, "MICBIAS2" }, - { "Line In2", NULL, "MICBIAS2" }, - { "Line In3", NULL, "MICBIAS2" }, - { "Line In4", NULL, "MICBIAS2" }, - - { "Line Out1", NULL, "LOUT1L" }, - { "Line Out1", NULL, "LOUT1R" }, - { "Line Out2", NULL, "LOUT2L" }, - { "Line Out2", NULL, "LOUT2R" }, - { "Headphone", NULL, "HPL" }, - { "Headphone", NULL, "HPR" }, - { "Earpiece", NULL, "EP" }, - { "Speaker", NULL, "SPKL" }, - { "Stereo Out", NULL, "SPKR" }, -}; - -static int bfin_eval_adau1373_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int ret; - int pll_rate; - - switch (params_rate(params)) { - case 48000: - case 8000: - case 12000: - case 16000: - case 24000: - case 32000: - pll_rate = 48000 * 1024; - break; - case 44100: - case 7350: - case 11025: - case 14700: - case 22050: - case 29400: - pll_rate = 44100 * 1024; - break; - default: - return -EINVAL; - } - - ret = snd_soc_dai_set_pll(codec_dai, ADAU1373_PLL1, - ADAU1373_PLL_SRC_MCLK1, 12288000, pll_rate); - if (ret) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAU1373_CLK_SRC_PLL1, pll_rate, - SND_SOC_CLOCK_IN); - - return ret; -} - -static int bfin_eval_adau1373_codec_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_dai *codec_dai = rtd->codec_dai; - unsigned int pll_rate = 48000 * 1024; - int ret; - - ret = snd_soc_dai_set_pll(codec_dai, ADAU1373_PLL1, - ADAU1373_PLL_SRC_MCLK1, 12288000, pll_rate); - if (ret) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAU1373_CLK_SRC_PLL1, pll_rate, - SND_SOC_CLOCK_IN); - - return ret; -} -static const struct snd_soc_ops bfin_eval_adau1373_ops = { - .hw_params = bfin_eval_adau1373_hw_params, -}; - -static struct snd_soc_dai_link bfin_eval_adau1373_dai = { - .name = "adau1373", - .stream_name = "adau1373", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "adau1373-aif1", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "adau1373.0-001a", - .ops = &bfin_eval_adau1373_ops, - .init = bfin_eval_adau1373_codec_init, - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM, -}; - -static struct snd_soc_card bfin_eval_adau1373 = { - .name = "bfin-eval-adau1373", - .owner = THIS_MODULE, - .dai_link = &bfin_eval_adau1373_dai, - .num_links = 1, - - .dapm_widgets = bfin_eval_adau1373_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adau1373_dapm_widgets), - .dapm_routes = bfin_eval_adau1373_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(bfin_eval_adau1373_dapm_routes), -}; - -static int bfin_eval_adau1373_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = &bfin_eval_adau1373; - - card->dev = &pdev->dev; - - return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adau1373); -} - -static struct platform_driver bfin_eval_adau1373_driver = { - .driver = { - .name = "bfin-eval-adau1373", - .pm = &snd_soc_pm_ops, - }, - .probe = bfin_eval_adau1373_probe, -}; - -module_platform_driver(bfin_eval_adau1373_driver); - -MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); -MODULE_DESCRIPTION("ALSA SoC bfin adau1373 driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:bfin-eval-adau1373"); diff --git a/sound/soc/blackfin/bfin-eval-adau1701.c b/sound/soc/blackfin/bfin-eval-adau1701.c deleted file mode 100644 index 5c67f72cf9a9..000000000000 --- a/sound/soc/blackfin/bfin-eval-adau1701.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Machine driver for EVAL-ADAU1701MINIZ on Analog Devices bfin - * evaluation boards. - * - * Copyright 2011 Analog Devices Inc. - * Author: Lars-Peter Clausen <lars@metafoo.de> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/device.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include "../codecs/adau1701.h" - -static const struct snd_soc_dapm_widget bfin_eval_adau1701_dapm_widgets[] = { - SND_SOC_DAPM_SPK("Speaker", NULL), - SND_SOC_DAPM_LINE("Line Out", NULL), - SND_SOC_DAPM_LINE("Line In", NULL), -}; - -static const struct snd_soc_dapm_route bfin_eval_adau1701_dapm_routes[] = { - { "Speaker", NULL, "OUT0" }, - { "Speaker", NULL, "OUT1" }, - { "Line Out", NULL, "OUT2" }, - { "Line Out", NULL, "OUT3" }, - - { "IN0", NULL, "Line In" }, - { "IN1", NULL, "Line In" }, -}; - -static int bfin_eval_adau1701_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAU1701_CLK_SRC_OSC, 12288000, - SND_SOC_CLOCK_IN); - - return ret; -} - -static struct snd_soc_ops bfin_eval_adau1701_ops = { - .hw_params = bfin_eval_adau1701_hw_params, -}; - -#define BFIN_EVAL_ADAU1701_DAI_FMT (SND_SOC_DAIFMT_I2S | \ - SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM) - -static struct snd_soc_dai_link bfin_eval_adau1701_dai[] = { - { - .name = "adau1701", - .stream_name = "adau1701", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "adau1701", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "adau1701.0-0034", - .ops = &bfin_eval_adau1701_ops, - .dai_fmt = BFIN_EVAL_ADAU1701_DAI_FMT, - }, - { - .name = "adau1701", - .stream_name = "adau1701", - .cpu_dai_name = "bfin-i2s.1", - .codec_dai_name = "adau1701", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "adau1701.0-0034", - .ops = &bfin_eval_adau1701_ops, - .dai_fmt = BFIN_EVAL_ADAU1701_DAI_FMT, - }, -}; - -static struct snd_soc_card bfin_eval_adau1701 = { - .name = "bfin-eval-adau1701", - .owner = THIS_MODULE, - .dai_link = &bfin_eval_adau1701_dai[CONFIG_SND_BF5XX_SPORT_NUM], - .num_links = 1, - - .dapm_widgets = bfin_eval_adau1701_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adau1701_dapm_widgets), - .dapm_routes = bfin_eval_adau1701_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(bfin_eval_adau1701_dapm_routes), -}; - -static int bfin_eval_adau1701_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = &bfin_eval_adau1701; - - card->dev = &pdev->dev; - - return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adau1701); -} - -static struct platform_driver bfin_eval_adau1701_driver = { - .driver = { - .name = "bfin-eval-adau1701", - .pm = &snd_soc_pm_ops, - }, - .probe = bfin_eval_adau1701_probe, -}; - -module_platform_driver(bfin_eval_adau1701_driver); - -MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); -MODULE_DESCRIPTION("ALSA SoC bfin ADAU1701 driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:bfin-eval-adau1701"); diff --git a/sound/soc/blackfin/bfin-eval-adau1x61.c b/sound/soc/blackfin/bfin-eval-adau1x61.c deleted file mode 100644 index fddfe00c9d69..000000000000 --- a/sound/soc/blackfin/bfin-eval-adau1x61.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Machine driver for EVAL-ADAU1x61MINIZ on Analog Devices bfin - * evaluation boards. - * - * Copyright 2011-2014 Analog Devices Inc. - * Author: Lars-Peter Clausen <lars@metafoo.de> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/device.h> -#include <linux/slab.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include "../codecs/adau17x1.h" - -static const struct snd_soc_dapm_widget bfin_eval_adau1x61_dapm_widgets[] = { - SND_SOC_DAPM_LINE("In 1", NULL), - SND_SOC_DAPM_LINE("In 2", NULL), - SND_SOC_DAPM_LINE("In 3-4", NULL), - - SND_SOC_DAPM_LINE("Diff Out L", NULL), - SND_SOC_DAPM_LINE("Diff Out R", NULL), - SND_SOC_DAPM_LINE("Stereo Out", NULL), - SND_SOC_DAPM_HP("Capless HP Out", NULL), -}; - -static const struct snd_soc_dapm_route bfin_eval_adau1x61_dapm_routes[] = { - { "LAUX", NULL, "In 3-4" }, - { "RAUX", NULL, "In 3-4" }, - { "LINP", NULL, "In 1" }, - { "LINN", NULL, "In 1"}, - { "RINP", NULL, "In 2" }, - { "RINN", NULL, "In 2" }, - - { "In 1", NULL, "MICBIAS" }, - { "In 2", NULL, "MICBIAS" }, - - { "Capless HP Out", NULL, "LHP" }, - { "Capless HP Out", NULL, "RHP" }, - { "Diff Out L", NULL, "LOUT" }, - { "Diff Out R", NULL, "ROUT" }, - { "Stereo Out", NULL, "LOUT" }, - { "Stereo Out", NULL, "ROUT" }, -}; - -static int bfin_eval_adau1x61_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int pll_rate; - int ret; - - switch (params_rate(params)) { - case 48000: - case 8000: - case 12000: - case 16000: - case 24000: - case 32000: - case 96000: - pll_rate = 48000 * 1024; - break; - case 44100: - case 7350: - case 11025: - case 14700: - case 22050: - case 29400: - case 88200: - pll_rate = 44100 * 1024; - break; - default: - return -EINVAL; - } - - ret = snd_soc_dai_set_pll(codec_dai, ADAU17X1_PLL, - ADAU17X1_PLL_SRC_MCLK, 12288000, pll_rate); - if (ret) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAU17X1_CLK_SRC_PLL, pll_rate, - SND_SOC_CLOCK_IN); - - return ret; -} - -static const struct snd_soc_ops bfin_eval_adau1x61_ops = { - .hw_params = bfin_eval_adau1x61_hw_params, -}; - -static struct snd_soc_dai_link bfin_eval_adau1x61_dai = { - .name = "adau1x61", - .stream_name = "adau1x61", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "adau-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "adau1761.0-0038", - .ops = &bfin_eval_adau1x61_ops, - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM, -}; - -static struct snd_soc_card bfin_eval_adau1x61 = { - .name = "bfin-eval-adau1x61", - .owner = THIS_MODULE, - .driver_name = "eval-adau1x61", - .dai_link = &bfin_eval_adau1x61_dai, - .num_links = 1, - - .dapm_widgets = bfin_eval_adau1x61_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adau1x61_dapm_widgets), - .dapm_routes = bfin_eval_adau1x61_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(bfin_eval_adau1x61_dapm_routes), - .fully_routed = true, -}; - -static int bfin_eval_adau1x61_probe(struct platform_device *pdev) -{ - bfin_eval_adau1x61.dev = &pdev->dev; - - return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adau1x61); -} - -static struct platform_driver bfin_eval_adau1x61_driver = { - .driver = { - .name = "bfin-eval-adau1x61", - .pm = &snd_soc_pm_ops, - }, - .probe = bfin_eval_adau1x61_probe, -}; -module_platform_driver(bfin_eval_adau1x61_driver); - -MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); -MODULE_DESCRIPTION("ALSA SoC bfin adau1x61 driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:bfin-eval-adau1x61"); diff --git a/sound/soc/blackfin/bfin-eval-adau1x81.c b/sound/soc/blackfin/bfin-eval-adau1x81.c deleted file mode 100644 index 3e01cbe53fc7..000000000000 --- a/sound/soc/blackfin/bfin-eval-adau1x81.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Machine driver for EVAL-ADAU1x81 on Analog Devices bfin - * evaluation boards. - * - * Copyright 2011-2014 Analog Devices Inc. - * Author: Lars-Peter Clausen <lars@metafoo.de> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/module.h> -#include <linux/device.h> -#include <linux/slab.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> - -#include "../codecs/adau17x1.h" - -static const struct snd_soc_dapm_widget bfin_eval_adau1x81_dapm_widgets[] = { - SND_SOC_DAPM_LINE("Stereo In", NULL), - SND_SOC_DAPM_LINE("Beep", NULL), - - SND_SOC_DAPM_SPK("Speaker", NULL), - SND_SOC_DAPM_HP("Headphone", NULL), -}; - -static const struct snd_soc_dapm_route bfin_eval_adau1x81_dapm_routes[] = { - { "BEEP", NULL, "Beep" }, - { "LMIC", NULL, "Stereo In" }, - { "LMIC", NULL, "Stereo In" }, - - { "Headphone", NULL, "AOUTL" }, - { "Headphone", NULL, "AOUTR" }, - { "Speaker", NULL, "SP" }, -}; - -static int bfin_eval_adau1x81_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int pll_rate; - int ret; - - switch (params_rate(params)) { - case 48000: - case 8000: - case 12000: - case 16000: - case 24000: - case 32000: - case 96000: - pll_rate = 48000 * 1024; - break; - case 44100: - case 7350: - case 11025: - case 14700: - case 22050: - case 29400: - case 88200: - pll_rate = 44100 * 1024; - break; - default: - return -EINVAL; - } - - ret = snd_soc_dai_set_pll(codec_dai, ADAU17X1_PLL, - ADAU17X1_PLL_SRC_MCLK, 12288000, pll_rate); - if (ret) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAU17X1_CLK_SRC_PLL, pll_rate, - SND_SOC_CLOCK_IN); - - return ret; -} - -static const struct snd_soc_ops bfin_eval_adau1x81_ops = { - .hw_params = bfin_eval_adau1x81_hw_params, -}; - -static struct snd_soc_dai_link bfin_eval_adau1x81_dai = { - .name = "adau1x81", - .stream_name = "adau1x81", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "adau-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .codec_name = "adau1781.0-0038", - .ops = &bfin_eval_adau1x81_ops, - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM, -}; - -static struct snd_soc_card bfin_eval_adau1x81 = { - .name = "bfin-eval-adau1x81", - .driver_name = "eval-adau1x81", - .dai_link = &bfin_eval_adau1x81_dai, - .num_links = 1, - - .dapm_widgets = bfin_eval_adau1x81_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adau1x81_dapm_widgets), - .dapm_routes = bfin_eval_adau1x81_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(bfin_eval_adau1x81_dapm_routes), - .fully_routed = true, -}; - -static int bfin_eval_adau1x81_probe(struct platform_device *pdev) -{ - bfin_eval_adau1x81.dev = &pdev->dev; - - return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adau1x81); -} - -static struct platform_driver bfin_eval_adau1x81_driver = { - .driver = { - .name = "bfin-eval-adau1x81", - .pm = &snd_soc_pm_ops, - }, - .probe = bfin_eval_adau1x81_probe, -}; -module_platform_driver(bfin_eval_adau1x81_driver); - -MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); -MODULE_DESCRIPTION("ALSA SoC bfin adau1x81 driver"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:bfin-eval-adau1x81"); diff --git a/sound/soc/blackfin/bfin-eval-adav80x.c b/sound/soc/blackfin/bfin-eval-adav80x.c deleted file mode 100644 index 99e5ecabdcda..000000000000 --- a/sound/soc/blackfin/bfin-eval-adav80x.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Machine driver for EVAL-ADAV801 and EVAL-ADAV803 on Analog Devices bfin - * evaluation boards. - * - * Copyright 2011 Analog Devices Inc. - * Author: Lars-Peter Clausen <lars@metafoo.de> - * - * Licensed under the GPL-2 or later. - */ - -#include <linux/init.h> -#include <linux/platform_device.h> -#include <linux/module.h> -#include <sound/core.h> -#include <sound/pcm.h> -#include <sound/soc.h> - -#include "../codecs/adav80x.h" - -static const struct snd_soc_dapm_widget bfin_eval_adav80x_dapm_widgets[] = { - SND_SOC_DAPM_LINE("Line Out", NULL), - SND_SOC_DAPM_LINE("Line In", NULL), -}; - -static const struct snd_soc_dapm_route bfin_eval_adav80x_dapm_routes[] = { - { "Line Out", NULL, "VOUTL" }, - { "Line Out", NULL, "VOUTR" }, - - { "VINL", NULL, "Line In" }, - { "VINR", NULL, "Line In" }, -}; - -static int bfin_eval_adav80x_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_dai *codec_dai = rtd->codec_dai; - int ret; - - ret = snd_soc_dai_set_pll(codec_dai, ADAV80X_PLL1, ADAV80X_PLL_SRC_XTAL, - 27000000, params_rate(params) * 256); - if (ret) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_PLL1, - params_rate(params) * 256, SND_SOC_CLOCK_IN); - - return ret; -} - -static int bfin_eval_adav80x_codec_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_dai *codec_dai = rtd->codec_dai; - - snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK1, 0, - SND_SOC_CLOCK_OUT); - snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK2, 0, - SND_SOC_CLOCK_OUT); - snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK3, 0, - SND_SOC_CLOCK_OUT); - - snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_XTAL, 2700000, 0); - - return 0; -} - -static const struct snd_soc_ops bfin_eval_adav80x_ops = { - .hw_params = bfin_eval_adav80x_hw_params, -}; - -static struct snd_soc_dai_link bfin_eval_adav80x_dais[] = { - { - .name = "adav80x", - .stream_name = "ADAV80x HiFi", - .cpu_dai_name = "bfin-i2s.0", - .codec_dai_name = "adav80x-hifi", - .platform_name = "bfin-i2s-pcm-audio", - .init = bfin_eval_adav80x_codec_init, - .ops = &bfin_eval_adav80x_ops, - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM, - }, -}; - -static struct snd_soc_card bfin_eval_adav80x = { - .name = "bfin-eval-adav80x", - .owner = THIS_MODULE, - .dai_link = bfin_eval_adav80x_dais, - .num_links = ARRAY_SIZE(bfin_eval_adav80x_dais), - - .dapm_widgets = bfin_eval_adav80x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adav80x_dapm_widgets), - .dapm_routes = bfin_eval_adav80x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(bfin_eval_adav80x_dapm_routes), -}; - -enum bfin_eval_adav80x_type { - BFIN_EVAL_ADAV801, - BFIN_EVAL_ADAV803, -}; - -static int bfin_eval_adav80x_probe(struct platform_device *pdev) -{ - struct snd_soc_card *card = &bfin_eval_adav80x; - const char *codec_name; - - switch (platform_get_device_id(pdev)->driver_data) { - case BFIN_EVAL_ADAV801: - codec_name = "spi0.1"; - break; - case BFIN_EVAL_ADAV803: - codec_name = "adav803.0-0034"; - break; - default: - return -EINVAL; - } - - bfin_eval_adav80x_dais[0].codec_name = codec_name; - - card->dev = &pdev->dev; - - return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adav80x); -} - -static const struct platform_device_id bfin_eval_adav80x_ids[] = { - { "bfin-eval-adav801", BFIN_EVAL_ADAV801 }, - { "bfin-eval-adav803", BFIN_EVAL_ADAV803 }, - { }, -}; -MODULE_DEVICE_TABLE(platform, bfin_eval_adav80x_ids); - -static struct platform_driver bfin_eval_adav80x_driver = { - .driver = { - .name = "bfin-eval-adav80x", - .pm = &snd_soc_pm_ops, - }, - .probe = bfin_eval_adav80x_probe, - .id_table = bfin_eval_adav80x_ids, -}; - -module_platform_driver(bfin_eval_adav80x_driver); - -MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); -MODULE_DESCRIPTION("ALSA SoC bfin adav80x driver"); -MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/88pm860x-codec.c b/sound/soc/codecs/88pm860x-codec.c index be8ea723dff9..3c3ef422853d 100644 --- a/sound/soc/codecs/88pm860x-codec.c +++ b/sound/soc/codecs/88pm860x-codec.c @@ -139,7 +139,7 @@ struct pm860x_priv { unsigned int pcmclk; unsigned int dir; unsigned int filter; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct i2c_client *i2c; struct regmap *regmap; struct pm860x_chip *chip; @@ -272,15 +272,15 @@ static int snd_soc_get_volsw_2r_st(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; int val[2], val2[2], i; - val[0] = snd_soc_read(codec, reg) & 0x3f; - val[1] = (snd_soc_read(codec, PM860X_SIDETONE_SHIFT) >> 4) & 0xf; - val2[0] = snd_soc_read(codec, reg2) & 0x3f; - val2[1] = (snd_soc_read(codec, PM860X_SIDETONE_SHIFT)) & 0xf; + val[0] = snd_soc_component_read32(component, reg) & 0x3f; + val[1] = (snd_soc_component_read32(component, PM860X_SIDETONE_SHIFT) >> 4) & 0xf; + val2[0] = snd_soc_component_read32(component, reg2) & 0x3f; + val2[1] = (snd_soc_component_read32(component, PM860X_SIDETONE_SHIFT)) & 0xf; for (i = 0; i < ARRAY_SIZE(st_table); i++) { if ((st_table[i].m == val[0]) && (st_table[i].n == val[1])) @@ -296,7 +296,7 @@ static int snd_soc_put_volsw_2r_st(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; int err; @@ -308,18 +308,18 @@ static int snd_soc_put_volsw_2r_st(struct snd_kcontrol *kcontrol, if (val >= ARRAY_SIZE(st_table) || val2 >= ARRAY_SIZE(st_table)) return -EINVAL; - err = snd_soc_update_bits(codec, reg, 0x3f, st_table[val].m); + err = snd_soc_component_update_bits(component, reg, 0x3f, st_table[val].m); if (err < 0) return err; - err = snd_soc_update_bits(codec, PM860X_SIDETONE_SHIFT, 0xf0, + err = snd_soc_component_update_bits(component, PM860X_SIDETONE_SHIFT, 0xf0, st_table[val].n << 4); if (err < 0) return err; - err = snd_soc_update_bits(codec, reg2, 0x3f, st_table[val2].m); + err = snd_soc_component_update_bits(component, reg2, 0x3f, st_table[val2].m); if (err < 0) return err; - err = snd_soc_update_bits(codec, PM860X_SIDETONE_SHIFT, 0x0f, + err = snd_soc_component_update_bits(component, PM860X_SIDETONE_SHIFT, 0x0f, st_table[val2].n); return err; } @@ -329,15 +329,15 @@ static int snd_soc_get_volsw_2r_out(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; unsigned int shift = mc->shift; int max = mc->max, val, val2; unsigned int mask = (1 << fls(max)) - 1; - val = snd_soc_read(codec, reg) >> shift; - val2 = snd_soc_read(codec, reg2) >> shift; + val = snd_soc_component_read32(component, reg) >> shift; + val2 = snd_soc_component_read32(component, reg2) >> shift; ucontrol->value.integer.value[0] = (max - val) & mask; ucontrol->value.integer.value[1] = (max - val2) & mask; @@ -349,7 +349,7 @@ static int snd_soc_put_volsw_2r_out(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; unsigned int shift = mc->shift; @@ -365,11 +365,11 @@ static int snd_soc_put_volsw_2r_out(struct snd_kcontrol *kcontrol, val = val << shift; val2 = val2 << shift; - err = snd_soc_update_bits(codec, reg, val_mask, val); + err = snd_soc_component_update_bits(component, reg, val_mask, val); if (err < 0) return err; - err = snd_soc_update_bits(codec, reg2, val_mask, val2); + err = snd_soc_component_update_bits(component, reg2, val_mask, val2); return err; } @@ -382,7 +382,7 @@ static int snd_soc_put_volsw_2r_out(struct snd_kcontrol *kcontrol, static int pm860x_rsync_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); /* * In order to avoid current on the load, mute power-on and power-off @@ -390,8 +390,8 @@ static int pm860x_rsync_event(struct snd_soc_dapm_widget *w, * Unmute by DAC_MUTE. It should be unmuted when DAPM sequence is * finished. */ - snd_soc_update_bits(codec, PM860X_DAC_OFFSET, DAC_MUTE, 0); - snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + snd_soc_component_update_bits(component, PM860X_DAC_OFFSET, DAC_MUTE, 0); + snd_soc_component_update_bits(component, PM860X_EAR_CTRL_2, RSYNC_CHANGE, RSYNC_CHANGE); return 0; } @@ -399,7 +399,7 @@ static int pm860x_rsync_event(struct snd_soc_dapm_widget *w, static int pm860x_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int dac = 0; int data; @@ -412,28 +412,28 @@ static int pm860x_dac_event(struct snd_soc_dapm_widget *w, if (dac) { /* Auto mute in power-on sequence. */ dac |= MODULATOR; - snd_soc_update_bits(codec, PM860X_DAC_OFFSET, + snd_soc_component_update_bits(component, PM860X_DAC_OFFSET, DAC_MUTE, DAC_MUTE); - snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + snd_soc_component_update_bits(component, PM860X_EAR_CTRL_2, RSYNC_CHANGE, RSYNC_CHANGE); /* update dac */ - snd_soc_update_bits(codec, PM860X_DAC_EN_2, + snd_soc_component_update_bits(component, PM860X_DAC_EN_2, dac, dac); } break; case SND_SOC_DAPM_PRE_PMD: if (dac) { /* Auto mute in power-off sequence. */ - snd_soc_update_bits(codec, PM860X_DAC_OFFSET, + snd_soc_component_update_bits(component, PM860X_DAC_OFFSET, DAC_MUTE, DAC_MUTE); - snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + snd_soc_component_update_bits(component, PM860X_EAR_CTRL_2, RSYNC_CHANGE, RSYNC_CHANGE); /* update dac */ - data = snd_soc_read(codec, PM860X_DAC_EN_2); + data = snd_soc_component_read32(component, PM860X_DAC_EN_2); data &= ~dac; if (!(data & (DAC_LEFT | DAC_RIGHT))) data &= ~MODULATOR; - snd_soc_write(codec, PM860X_DAC_EN_2, data); + snd_soc_component_write(component, PM860X_DAC_EN_2, data); } break; } @@ -922,13 +922,13 @@ static const struct snd_soc_dapm_route pm860x_dapm_routes[] = { */ static int pm860x_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int data = 0, mask = MUTE_LEFT | MUTE_RIGHT; if (mute) data = mask; - snd_soc_update_bits(codec, PM860X_DAC_OFFSET, mask, data); - snd_soc_update_bits(codec, PM860X_EAR_CTRL_2, + snd_soc_component_update_bits(component, PM860X_DAC_OFFSET, mask, data); + snd_soc_component_update_bits(component, PM860X_EAR_CTRL_2, RSYNC_CHANGE, RSYNC_CHANGE); return 0; } @@ -937,7 +937,7 @@ static int pm860x_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned char inf = 0, mask = 0; /* bit size */ @@ -952,7 +952,7 @@ static int pm860x_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } mask |= PCM_INF2_18WL; - snd_soc_update_bits(codec, PM860X_PCM_IFACE_2, mask, inf); + snd_soc_component_update_bits(component, PM860X_PCM_IFACE_2, mask, inf); /* sample rate */ switch (params_rate(params)) { @@ -971,7 +971,7 @@ static int pm860x_pcm_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } - snd_soc_update_bits(codec, PM860X_PCM_RATE, 0x0f, inf); + snd_soc_component_update_bits(component, PM860X_PCM_RATE, 0x0f, inf); return 0; } @@ -979,8 +979,8 @@ static int pm860x_pcm_hw_params(struct snd_pcm_substream *substream, static int pm860x_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); unsigned char inf = 0, mask = 0; int ret = -EINVAL; @@ -1012,15 +1012,15 @@ static int pm860x_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, mask |= PCM_MODE_MASK; if (ret) return ret; - snd_soc_update_bits(codec, PM860X_PCM_IFACE_2, mask, inf); + snd_soc_component_update_bits(component, PM860X_PCM_IFACE_2, mask, inf); return 0; } static int pm860x_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); if (dir == PM860X_CLK_DIR_OUT) pm860x->dir = PM860X_CLK_DIR_OUT; @@ -1034,7 +1034,7 @@ static int pm860x_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned char inf; /* bit size */ @@ -1048,7 +1048,7 @@ static int pm860x_i2s_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } - snd_soc_update_bits(codec, PM860X_I2S_IFACE_2, PCM_INF2_18WL, inf); + snd_soc_component_update_bits(component, PM860X_I2S_IFACE_2, PCM_INF2_18WL, inf); /* sample rate */ switch (params_rate(params)) { @@ -1076,7 +1076,7 @@ static int pm860x_i2s_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } - snd_soc_update_bits(codec, PM860X_I2S_IFACE_4, 0xf, inf); + snd_soc_component_update_bits(component, PM860X_I2S_IFACE_4, 0xf, inf); return 0; } @@ -1084,8 +1084,8 @@ static int pm860x_i2s_hw_params(struct snd_pcm_substream *substream, static int pm860x_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); unsigned char inf = 0, mask = 0; mask |= PCM_INF2_BCLK | PCM_INF2_FS | PCM_INF2_MASTER; @@ -1116,14 +1116,14 @@ static int pm860x_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } mask |= PCM_MODE_MASK; - snd_soc_update_bits(codec, PM860X_I2S_IFACE_2, mask, inf); + snd_soc_component_update_bits(component, PM860X_I2S_IFACE_2, mask, inf); return 0; } -static int pm860x_set_bias_level(struct snd_soc_codec *codec, +static int pm860x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); int data; switch (level) { @@ -1134,7 +1134,7 @@ static int pm860x_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Enable Audio PLL & Audio section */ data = AUDIO_PLL | AUDIO_SECTION_ON; pm860x_reg_write(pm860x->i2c, REG_MISC2, data); @@ -1216,7 +1216,7 @@ static struct snd_soc_dai_driver pm860x_dai[] = { }, }; -static irqreturn_t pm860x_codec_handler(int irq, void *data) +static irqreturn_t pm860x_component_handler(int irq, void *data) { struct pm860x_priv *pm860x = data; int status, shrt, report = 0, mic_report = 0; @@ -1230,7 +1230,7 @@ static irqreturn_t pm860x_codec_handler(int irq, void *data) #ifndef CONFIG_SND_SOC_88PM860X_MODULE if (status & (HEADSET_STATUS | MIC_STATUS | SHORT_HS1 | SHORT_HS2 | SHORT_LO1 | SHORT_LO2)) - trace_snd_soc_jack_irq(dev_name(pm860x->codec->dev)); + trace_snd_soc_jack_irq(dev_name(pm860x->component->dev)); #endif if ((pm860x->det.hp_det & SND_JACK_HEADPHONE) @@ -1256,17 +1256,17 @@ static irqreturn_t pm860x_codec_handler(int irq, void *data) snd_soc_jack_report(pm860x->det.mic_jack, SND_JACK_MICROPHONE, SND_JACK_MICROPHONE); - dev_dbg(pm860x->codec->dev, "headphone report:0x%x, mask:%x\n", + dev_dbg(pm860x->component->dev, "headphone report:0x%x, mask:%x\n", report, mask); - dev_dbg(pm860x->codec->dev, "microphone report:0x%x\n", mic_report); + dev_dbg(pm860x->component->dev, "microphone report:0x%x\n", mic_report); return IRQ_HANDLED; } -int pm860x_hs_jack_detect(struct snd_soc_codec *codec, +int pm860x_hs_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, int det, int hook, int hs_shrt, int lo_shrt) { - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); int data; pm860x->det.hp_jack = jack; @@ -1290,15 +1290,15 @@ int pm860x_hs_jack_detect(struct snd_soc_codec *codec, } /* sync status */ - pm860x_codec_handler(0, pm860x); + pm860x_component_handler(0, pm860x); return 0; } EXPORT_SYMBOL_GPL(pm860x_hs_jack_detect); -int pm860x_mic_jack_detect(struct snd_soc_codec *codec, +int pm860x_mic_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, int det) { - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); pm860x->det.mic_jack = jack; pm860x->det.mic_det = det; @@ -1308,25 +1308,25 @@ int pm860x_mic_jack_detect(struct snd_soc_codec *codec, MICDET_MASK, MICDET_MASK); /* sync status */ - pm860x_codec_handler(0, pm860x); + pm860x_component_handler(0, pm860x); return 0; } EXPORT_SYMBOL_GPL(pm860x_mic_jack_detect); -static int pm860x_probe(struct snd_soc_codec *codec) +static int pm860x_probe(struct snd_soc_component *component) { - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); int i, ret; - pm860x->codec = codec; - snd_soc_codec_init_regmap(codec, pm860x->regmap); + pm860x->component = component; + snd_soc_component_init_regmap(component, pm860x->regmap); for (i = 0; i < 4; i++) { ret = request_threaded_irq(pm860x->irq[i], NULL, - pm860x_codec_handler, IRQF_ONESHOT, + pm860x_component_handler, IRQF_ONESHOT, pm860x->name[i], pm860x); if (ret < 0) { - dev_err(codec->dev, "Failed to request IRQ!\n"); + dev_err(component->dev, "Failed to request IRQ!\n"); goto out; } } @@ -1339,29 +1339,29 @@ out: return ret; } -static int pm860x_remove(struct snd_soc_codec *codec) +static void pm860x_remove(struct snd_soc_component *component) { - struct pm860x_priv *pm860x = snd_soc_codec_get_drvdata(codec); + struct pm860x_priv *pm860x = snd_soc_component_get_drvdata(component); int i; for (i = 3; i >= 0; i--) free_irq(pm860x->irq[i], pm860x); - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_pm860x = { - .probe = pm860x_probe, - .remove = pm860x_remove, - .set_bias_level = pm860x_set_bias_level, - - .component_driver = { - .controls = pm860x_snd_controls, - .num_controls = ARRAY_SIZE(pm860x_snd_controls), - .dapm_widgets = pm860x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pm860x_dapm_widgets), - .dapm_routes = pm860x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pm860x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_pm860x = { + .probe = pm860x_probe, + .remove = pm860x_remove, + .set_bias_level = pm860x_set_bias_level, + .controls = pm860x_snd_controls, + .num_controls = ARRAY_SIZE(pm860x_snd_controls), + .dapm_widgets = pm860x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pm860x_dapm_widgets), + .dapm_routes = pm860x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pm860x_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int pm860x_codec_probe(struct platform_device *pdev) @@ -1393,10 +1393,11 @@ static int pm860x_codec_probe(struct platform_device *pdev) strncpy(pm860x->name[i], res->name, MAX_NAME_LEN); } - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pm860x, + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_pm860x, pm860x_dai, ARRAY_SIZE(pm860x_dai)); if (ret) { - dev_err(&pdev->dev, "Failed to register codec\n"); + dev_err(&pdev->dev, "Failed to register component\n"); return -EINVAL; } return ret; @@ -1404,7 +1405,6 @@ static int pm860x_codec_probe(struct platform_device *pdev) static int pm860x_codec_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/codecs/88pm860x-codec.h b/sound/soc/codecs/88pm860x-codec.h index f7282f4f4a79..33aa9ff3463f 100644 --- a/sound/soc/codecs/88pm860x-codec.h +++ b/sound/soc/codecs/88pm860x-codec.h @@ -88,9 +88,9 @@ #define PM860X_SHORT_LINEOUT (1 << 4) #define PM860X_DET_MASK 0x1F -extern int pm860x_hs_jack_detect(struct snd_soc_codec *, struct snd_soc_jack *, +extern int pm860x_hs_jack_detect(struct snd_soc_component *, struct snd_soc_jack *, int, int, int, int); -extern int pm860x_mic_jack_detect(struct snd_soc_codec *, struct snd_soc_jack *, +extern int pm860x_mic_jack_detect(struct snd_soc_component *, struct snd_soc_jack *, int); #endif /* __88PM860X_H */ diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 2b331f7266ab..9548f63ca531 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -35,6 +35,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_ADAU7002 select SND_SOC_ADS117X select SND_SOC_AK4104 if SPI_MASTER + select SND_SOC_AK4458 if I2C select SND_SOC_AK4535 if I2C select SND_SOC_AK4554 select SND_SOC_AK4613 if I2C @@ -42,9 +43,11 @@ config SND_SOC_ALL_CODECS select SND_SOC_AK4642 if I2C select SND_SOC_AK4671 if I2C select SND_SOC_AK5386 + select SND_SOC_AK5558 if I2C select SND_SOC_ALC5623 if I2C select SND_SOC_ALC5632 if I2C select SND_SOC_BT_SCO + select SND_SOC_BD28623 select SND_SOC_CQ0093VC select SND_SOC_CS35L32 if I2C select SND_SOC_CS35L33 if I2C @@ -98,6 +101,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_MAX98373 if I2C select SND_SOC_MAX9850 if I2C select SND_SOC_MAX9860 if I2C + select SND_SOC_MAX9759 select SND_SOC_MAX9768 if I2C select SND_SOC_MAX9877 if I2C select SND_SOC_MC13783 if MFD_MC13XXX @@ -108,6 +112,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_NAU8825 if I2C select SND_SOC_HDMI_CODEC select SND_SOC_PCM1681 if I2C + select SND_SOC_PCM1789_I2C if I2C select SND_SOC_PCM179X_I2C if I2C select SND_SOC_PCM179X_SPI if SPI_MASTER select SND_SOC_PCM186X_I2C if I2C @@ -151,6 +156,7 @@ config SND_SOC_ALL_CODECS select SND_SOC_TAS571X if I2C select SND_SOC_TAS5720 if I2C select SND_SOC_TAS6424 if I2C + select SND_SOC_TDA7419 if I2C select SND_SOC_TFA9879 if I2C select SND_SOC_TLV320AIC23_I2C if I2C select SND_SOC_TLV320AIC23_SPI if SPI_MASTER @@ -375,6 +381,11 @@ config SND_SOC_AK4104 tristate "AKM AK4104 CODEC" depends on SPI_MASTER +config SND_SOC_AK4458 + tristate "AKM AK4458 CODEC" + depends on I2C + select REGMAP_I2C + config SND_SOC_AK4535 tristate @@ -398,6 +409,11 @@ config SND_SOC_AK4671 config SND_SOC_AK5386 tristate "AKM AK5638 CODEC" +config SND_SOC_AK5558 + tristate "AKM AK5558 CODEC" + depends on I2C + select REGMAP_I2C + config SND_SOC_ALC5623 tristate "Realtek ALC5623 CODEC" depends on I2C @@ -405,9 +421,20 @@ config SND_SOC_ALC5623 config SND_SOC_ALC5632 tristate +config SND_SOC_BD28623 + tristate "ROHM BD28623 CODEC" + help + Enable support for ROHM BD28623MUV Class D speaker amplifier. + This codec does not have any control buses such as I2C, it + detect format of I2S automatically. + config SND_SOC_BT_SCO tristate "Dummy BT SCO codec driver" +config SND_SOC_CPCAP + tristate "Motorola CPCAP codec" + depends on MFD_CPCAP + config SND_SOC_CQ0093VC tristate @@ -615,7 +642,8 @@ config SND_SOC_MAX98504 depends on I2C config SND_SOC_MAX9867 - tristate + tristate "Maxim MAX9867 CODEC" + depends on I2C config SND_SOC_MAX98925 tristate @@ -650,6 +678,17 @@ config SND_SOC_PCM1681 tristate "Texas Instruments PCM1681 CODEC" depends on I2C +config SND_SOC_PCM1789 + tristate + +config SND_SOC_PCM1789_I2C + tristate "Texas Instruments PCM1789 CODEC (I2C)" + depends on I2C + select SND_SOC_PCM1789 + help + Enable support for Texas Instruments PCM1789 CODEC. + Select this if your PCM1789 is connected via an I2C bus. + config SND_SOC_PCM179X tristate @@ -910,6 +949,11 @@ config SND_SOC_TAS6424 Enable support for Texas Instruments TAS6424 high-efficiency digital input quad-channel Class-D audio power amplifiers. +config SND_SOC_TDA7419 + tristate "ST TDA7419 audio processor" + depends on I2C + select REGMAP_I2C + config SND_SOC_TFA9879 tristate "NXP Semiconductors TFA9879 amplifier" depends on I2C @@ -1187,6 +1231,10 @@ config SND_SOC_ZX_AUD96P22 config SND_SOC_LM4857 tristate +config SND_SOC_MAX9759 + tristate "Maxim MAX9759 speaker Amplifier" + select GPIOLIB + config SND_SOC_MAX9768 tristate diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index da1571336f1e..e849d1495308 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -27,6 +27,7 @@ snd-soc-adav801-objs := adav801.o snd-soc-adav803-objs := adav803.o snd-soc-ads117x-objs := ads117x.o snd-soc-ak4104-objs := ak4104.o +snd-soc-ak4458-objs := ak4458.o snd-soc-ak4535-objs := ak4535.o snd-soc-ak4554-objs := ak4554.o snd-soc-ak4613-objs := ak4613.o @@ -34,8 +35,11 @@ snd-soc-ak4641-objs := ak4641.o snd-soc-ak4642-objs := ak4642.o snd-soc-ak4671-objs := ak4671.o snd-soc-ak5386-objs := ak5386.o +snd-soc-ak5558-objs := ak5558.o snd-soc-arizona-objs := arizona.o +snd-soc-bd28623-objs := bd28623.o snd-soc-bt-sco-objs := bt-sco.o +snd-soc-cpcap-objs := cpcap.o snd-soc-cq93vc-objs := cq93vc.o snd-soc-cs35l32-objs := cs35l32.o snd-soc-cs35l33-objs := cs35l33.o @@ -80,6 +84,7 @@ snd-soc-jz4740-codec-objs := jz4740.o snd-soc-l3-objs := l3.o snd-soc-lm4857-objs := lm4857.o snd-soc-lm49453-objs := lm49453.o +snd-soc-max9759-objs := max9759.o snd-soc-max9768-objs := max9768.o snd-soc-max98088-objs := max98088.o snd-soc-max98090-objs := max98090.o @@ -103,6 +108,8 @@ snd-soc-nau8824-objs := nau8824.o snd-soc-nau8825-objs := nau8825.o snd-soc-hdmi-codec-objs := hdmi-codec.o snd-soc-pcm1681-objs := pcm1681.o +snd-soc-pcm1789-codec-objs := pcm1789.o +snd-soc-pcm1789-i2c-objs := pcm1789-i2c.o snd-soc-pcm179x-codec-objs := pcm179x.o snd-soc-pcm179x-i2c-objs := pcm179x-i2c.o snd-soc-pcm179x-spi-objs := pcm179x-spi.o @@ -160,6 +167,7 @@ snd-soc-tas5086-objs := tas5086.o snd-soc-tas571x-objs := tas571x.o snd-soc-tas5720-objs := tas5720.o snd-soc-tas6424-objs := tas6424.o +snd-soc-tda7419-objs := tda7419.o snd-soc-tfa9879-objs := tfa9879.o snd-soc-tlv320aic23-objs := tlv320aic23.o snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o @@ -270,6 +278,7 @@ obj-$(CONFIG_SND_SOC_ADAV801) += snd-soc-adav801.o obj-$(CONFIG_SND_SOC_ADAV803) += snd-soc-adav803.o obj-$(CONFIG_SND_SOC_ADS117X) += snd-soc-ads117x.o obj-$(CONFIG_SND_SOC_AK4104) += snd-soc-ak4104.o +obj-$(CONFIG_SND_SOC_AK4458) += snd-soc-ak4458.o obj-$(CONFIG_SND_SOC_AK4535) += snd-soc-ak4535.o obj-$(CONFIG_SND_SOC_AK4554) += snd-soc-ak4554.o obj-$(CONFIG_SND_SOC_AK4613) += snd-soc-ak4613.o @@ -277,11 +286,14 @@ obj-$(CONFIG_SND_SOC_AK4641) += snd-soc-ak4641.o obj-$(CONFIG_SND_SOC_AK4642) += snd-soc-ak4642.o obj-$(CONFIG_SND_SOC_AK4671) += snd-soc-ak4671.o obj-$(CONFIG_SND_SOC_AK5386) += snd-soc-ak5386.o +obj-$(CONFIG_SND_SOC_AK5558) += snd-soc-ak5558.o obj-$(CONFIG_SND_SOC_ALC5623) += snd-soc-alc5623.o obj-$(CONFIG_SND_SOC_ALC5632) += snd-soc-alc5632.o obj-$(CONFIG_SND_SOC_ARIZONA) += snd-soc-arizona.o +obj-$(CONFIG_SND_SOC_BD28623) += snd-soc-bd28623.o obj-$(CONFIG_SND_SOC_BT_SCO) += snd-soc-bt-sco.o obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o +obj-$(CONFIG_SND_SOC_CPCAP) += snd-soc-cpcap.o obj-$(CONFIG_SND_SOC_CS35L32) += snd-soc-cs35l32.o obj-$(CONFIG_SND_SOC_CS35L33) += snd-soc-cs35l33.o obj-$(CONFIG_SND_SOC_CS35L34) += snd-soc-cs35l34.o @@ -325,6 +337,7 @@ obj-$(CONFIG_SND_SOC_JZ4740_CODEC) += snd-soc-jz4740-codec.o obj-$(CONFIG_SND_SOC_L3) += snd-soc-l3.o obj-$(CONFIG_SND_SOC_LM4857) += snd-soc-lm4857.o obj-$(CONFIG_SND_SOC_LM49453) += snd-soc-lm49453.o +obj-$(CONFIG_SND_SOC_MAX9759) += snd-soc-max9759.o obj-$(CONFIG_SND_SOC_MAX9768) += snd-soc-max9768.o obj-$(CONFIG_SND_SOC_MAX98088) += snd-soc-max98088.o obj-$(CONFIG_SND_SOC_MAX98090) += snd-soc-max98090.o @@ -349,6 +362,8 @@ obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o obj-$(CONFIG_SND_SOC_HDMI_CODEC) += snd-soc-hdmi-codec.o obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o obj-$(CONFIG_SND_SOC_PCM179X) += snd-soc-pcm179x-codec.o +obj-$(CONFIG_SND_SOC_PCM1789_I2C) += snd-soc-pcm1789-i2c.o +obj-$(CONFIG_SND_SOC_PCM1789) += snd-soc-pcm1789-codec.o obj-$(CONFIG_SND_SOC_PCM179X_I2C) += snd-soc-pcm179x-i2c.o obj-$(CONFIG_SND_SOC_PCM179X_SPI) += snd-soc-pcm179x-spi.o obj-$(CONFIG_SND_SOC_PCM186X) += snd-soc-pcm186x.o @@ -387,7 +402,6 @@ obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o obj-$(CONFIG_SND_SOC_SIGMADSP_I2C) += snd-soc-sigmadsp-i2c.o obj-$(CONFIG_SND_SOC_SIGMADSP_REGMAP) += snd-soc-sigmadsp-regmap.o obj-$(CONFIG_SND_SOC_SI476X) += snd-soc-si476x.o -obj-$(CONFIG_SND_SOC_SN95031) +=snd-soc-sn95031.o obj-$(CONFIG_SND_SOC_SPDIF) += snd-soc-spdif-rx.o snd-soc-spdif-tx.o obj-$(CONFIG_SND_SOC_SIRF_AUDIO_CODEC) += sirf-audio-codec.o obj-$(CONFIG_SND_SOC_SSM2518) += snd-soc-ssm2518.o @@ -405,6 +419,7 @@ obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o obj-$(CONFIG_SND_SOC_TAS571X) += snd-soc-tas571x.o obj-$(CONFIG_SND_SOC_TAS5720) += snd-soc-tas5720.o obj-$(CONFIG_SND_SOC_TAS6424) += snd-soc-tas6424.o +obj-$(CONFIG_SND_SOC_TDA7419) += snd-soc-tda7419.o obj-$(CONFIG_SND_SOC_TFA9879) += snd-soc-tfa9879.o obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o diff --git a/sound/soc/codecs/ab8500-codec.c b/sound/soc/codecs/ab8500-codec.c index 006627b8c3a8..03bbbcd3b6c1 100644 --- a/sound/soc/codecs/ab8500-codec.c +++ b/sound/soc/codecs/ab8500-codec.c @@ -1037,86 +1037,86 @@ static const struct snd_soc_dapm_route ab8500_dapm_routes_mic2_vamicx[] = { }; /* ANC FIR-coefficients configuration sequence */ -static void anc_fir(struct snd_soc_codec *codec, +static void anc_fir(struct snd_soc_component *component, unsigned int bnk, unsigned int par, unsigned int val) { if (par == 0 && bnk == 0) - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCFIRUPDATE), BIT(AB8500_ANCCONF1_ANCFIRUPDATE)); - snd_soc_write(codec, AB8500_ANCCONF5, val >> 8 & 0xff); - snd_soc_write(codec, AB8500_ANCCONF6, val & 0xff); + snd_soc_component_write(component, AB8500_ANCCONF5, val >> 8 & 0xff); + snd_soc_component_write(component, AB8500_ANCCONF6, val & 0xff); if (par == AB8500_ANC_FIR_COEFFS - 1 && bnk == 1) - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCFIRUPDATE), 0); } /* ANC IIR-coefficients configuration sequence */ -static void anc_iir(struct snd_soc_codec *codec, unsigned int bnk, +static void anc_iir(struct snd_soc_component *component, unsigned int bnk, unsigned int par, unsigned int val) { if (par == 0) { if (bnk == 0) { - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCIIRINIT), BIT(AB8500_ANCCONF1_ANCIIRINIT)); usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY); - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCIIRINIT), 0); usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY); } else { - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCIIRUPDATE), BIT(AB8500_ANCCONF1_ANCIIRUPDATE)); } } else if (par > 3) { - snd_soc_write(codec, AB8500_ANCCONF7, 0); - snd_soc_write(codec, AB8500_ANCCONF8, val >> 16 & 0xff); + snd_soc_component_write(component, AB8500_ANCCONF7, 0); + snd_soc_component_write(component, AB8500_ANCCONF8, val >> 16 & 0xff); } - snd_soc_write(codec, AB8500_ANCCONF7, val >> 8 & 0xff); - snd_soc_write(codec, AB8500_ANCCONF8, val & 0xff); + snd_soc_component_write(component, AB8500_ANCCONF7, val >> 8 & 0xff); + snd_soc_component_write(component, AB8500_ANCCONF8, val & 0xff); if (par == AB8500_ANC_IIR_COEFFS - 1 && bnk == 1) - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ANCIIRUPDATE), 0); } /* ANC IIR-/FIR-coefficients configuration sequence */ -static void anc_configure(struct snd_soc_codec *codec, +static void anc_configure(struct snd_soc_component *component, bool apply_fir, bool apply_iir) { - struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev); + struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); unsigned int bnk, par, val; - dev_dbg(codec->dev, "%s: Enter.\n", __func__); + dev_dbg(component->dev, "%s: Enter.\n", __func__); if (apply_fir) - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ENANC), 0); - snd_soc_update_bits(codec, AB8500_ANCCONF1, + snd_soc_component_update_bits(component, AB8500_ANCCONF1, BIT(AB8500_ANCCONF1_ENANC), BIT(AB8500_ANCCONF1_ENANC)); if (apply_fir) for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++) for (par = 0; par < AB8500_ANC_FIR_COEFFS; par++) { - val = snd_soc_read(codec, + val = snd_soc_component_read32(component, drvdata->anc_fir_values[par]); - anc_fir(codec, bnk, par, val); + anc_fir(component, bnk, par, val); } if (apply_iir) for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++) for (par = 0; par < AB8500_ANC_IIR_COEFFS; par++) { - val = snd_soc_read(codec, + val = snd_soc_component_read32(component, drvdata->anc_iir_values[par]); - anc_iir(codec, bnk, par, val); + anc_iir(component, bnk, par, val); } - dev_dbg(codec->dev, "%s: Exit.\n", __func__); + dev_dbg(component->dev, "%s: Exit.\n", __func__); } /* @@ -1126,8 +1126,8 @@ static void anc_configure(struct snd_soc_codec *codec, static int sid_status_control_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); mutex_lock(&drvdata->ctrl_lock); ucontrol->value.enumerated.item[0] = drvdata->sid_status; @@ -1140,15 +1140,15 @@ static int sid_status_control_get(struct snd_kcontrol *kcontrol, static int sid_status_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); unsigned int param, sidconf, val; int status = 1; - dev_dbg(codec->dev, "%s: Enter\n", __func__); + dev_dbg(component->dev, "%s: Enter\n", __func__); if (ucontrol->value.enumerated.item[0] != SID_APPLY_FIR) { - dev_err(codec->dev, + dev_err(component->dev, "%s: ERROR: This control supports '%s' only!\n", __func__, enum_sid_state[SID_APPLY_FIR]); return -EIO; @@ -1156,10 +1156,10 @@ static int sid_status_control_put(struct snd_kcontrol *kcontrol, mutex_lock(&drvdata->ctrl_lock); - sidconf = snd_soc_read(codec, AB8500_SIDFIRCONF); + sidconf = snd_soc_component_read32(component, AB8500_SIDFIRCONF); if (((sidconf & BIT(AB8500_SIDFIRCONF_FIRSIDBUSY)) != 0)) { if ((sidconf & BIT(AB8500_SIDFIRCONF_ENFIRSIDS)) == 0) { - dev_err(codec->dev, "%s: Sidetone busy while off!\n", + dev_err(component->dev, "%s: Sidetone busy while off!\n", __func__); status = -EPERM; } else { @@ -1168,18 +1168,18 @@ static int sid_status_control_put(struct snd_kcontrol *kcontrol, goto out; } - snd_soc_write(codec, AB8500_SIDFIRADR, 0); + snd_soc_component_write(component, AB8500_SIDFIRADR, 0); for (param = 0; param < AB8500_SID_FIR_COEFFS; param++) { - val = snd_soc_read(codec, drvdata->sid_fir_values[param]); - snd_soc_write(codec, AB8500_SIDFIRCOEF1, val >> 8 & 0xff); - snd_soc_write(codec, AB8500_SIDFIRCOEF2, val & 0xff); + val = snd_soc_component_read32(component, drvdata->sid_fir_values[param]); + snd_soc_component_write(component, AB8500_SIDFIRCOEF1, val >> 8 & 0xff); + snd_soc_component_write(component, AB8500_SIDFIRCOEF2, val & 0xff); } - snd_soc_update_bits(codec, AB8500_SIDFIRADR, + snd_soc_component_update_bits(component, AB8500_SIDFIRADR, BIT(AB8500_SIDFIRADR_FIRSIDSET), BIT(AB8500_SIDFIRADR_FIRSIDSET)); - snd_soc_update_bits(codec, AB8500_SIDFIRADR, + snd_soc_component_update_bits(component, AB8500_SIDFIRADR, BIT(AB8500_SIDFIRADR_FIRSIDSET), 0); drvdata->sid_status = SID_FIR_CONFIGURED; @@ -1187,7 +1187,7 @@ static int sid_status_control_put(struct snd_kcontrol *kcontrol, out: mutex_unlock(&drvdata->ctrl_lock); - dev_dbg(codec->dev, "%s: Exit\n", __func__); + dev_dbg(component->dev, "%s: Exit\n", __func__); return status; } @@ -1195,8 +1195,8 @@ out: static int anc_status_control_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); mutex_lock(&drvdata->ctrl_lock); ucontrol->value.enumerated.item[0] = drvdata->anc_status; @@ -1208,10 +1208,10 @@ static int anc_status_control_get(struct snd_kcontrol *kcontrol, static int anc_status_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(codec->dev); - struct device *dev = codec->dev; + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev); + struct device *dev = component->dev; bool apply_fir, apply_iir; unsigned int req; int status; @@ -1244,7 +1244,7 @@ static int anc_status_control_put(struct snd_kcontrol *kcontrol, } snd_soc_dapm_sync(dapm); - anc_configure(codec, apply_fir, apply_iir); + anc_configure(component, apply_fir, apply_iir); if (apply_fir) { if (drvdata->anc_status == ANC_IIR_CONFIGURED) @@ -1291,8 +1291,8 @@ static int filter_control_info(struct snd_kcontrol *kcontrol, static int filter_control_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ab8500_codec_drvdata *drvdata = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component); struct filter_control *fc = (struct filter_control *)kcontrol->private_value; unsigned int i; @@ -1308,8 +1308,8 @@ static int filter_control_get(struct snd_kcontrol *kcontrol, static int filter_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ab8500_codec_drvdata *drvdata = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component); struct filter_control *fc = (struct filter_control *)kcontrol->private_value; unsigned int i; @@ -1926,11 +1926,11 @@ enum ab8500_filter { * Extended interface for codec-driver */ -static int ab8500_audio_init_audioblock(struct snd_soc_codec *codec) +static int ab8500_audio_init_audioblock(struct snd_soc_component *component) { int status; - dev_dbg(codec->dev, "%s: Enter.\n", __func__); + dev_dbg(component->dev, "%s: Enter.\n", __func__); /* Reset audio-registers and disable 32kHz-clock output 2 */ status = ab8500_sysctrl_write(AB8500_STW4500CTRL3, @@ -1943,26 +1943,26 @@ static int ab8500_audio_init_audioblock(struct snd_soc_codec *codec) return 0; } -static int ab8500_audio_setup_mics(struct snd_soc_codec *codec, +static int ab8500_audio_setup_mics(struct snd_soc_component *component, struct amic_settings *amics) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); u8 value8; unsigned int value; int status; const struct snd_soc_dapm_route *route; - dev_dbg(codec->dev, "%s: Enter.\n", __func__); + dev_dbg(component->dev, "%s: Enter.\n", __func__); /* Set DMic-clocks to outputs */ - status = abx500_get_register_interruptible(codec->dev, AB8500_MISC, + status = abx500_get_register_interruptible(component->dev, AB8500_MISC, AB8500_GPIO_DIR4_REG, &value8); if (status < 0) return status; value = value8 | GPIO27_DIR_OUTPUT | GPIO29_DIR_OUTPUT | GPIO31_DIR_OUTPUT; - status = abx500_set_register_interruptible(codec->dev, + status = abx500_set_register_interruptible(component->dev, AB8500_MISC, AB8500_GPIO_DIR4_REG, value); @@ -1970,41 +1970,41 @@ static int ab8500_audio_setup_mics(struct snd_soc_codec *codec, return status; /* Attach regulators to AMic DAPM-paths */ - dev_dbg(codec->dev, "%s: Mic 1a regulator: %s\n", __func__, + dev_dbg(component->dev, "%s: Mic 1a regulator: %s\n", __func__, amic_micbias_str(amics->mic1a_micbias)); route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias]; status = snd_soc_dapm_add_routes(dapm, route, 1); - dev_dbg(codec->dev, "%s: Mic 1b regulator: %s\n", __func__, + dev_dbg(component->dev, "%s: Mic 1b regulator: %s\n", __func__, amic_micbias_str(amics->mic1b_micbias)); route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias]; status |= snd_soc_dapm_add_routes(dapm, route, 1); - dev_dbg(codec->dev, "%s: Mic 2 regulator: %s\n", __func__, + dev_dbg(component->dev, "%s: Mic 2 regulator: %s\n", __func__, amic_micbias_str(amics->mic2_micbias)); route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias]; status |= snd_soc_dapm_add_routes(dapm, route, 1); if (status < 0) { - dev_err(codec->dev, + dev_err(component->dev, "%s: Failed to add AMic-regulator DAPM-routes (%d).\n", __func__, status); return status; } /* Set AMic-configuration */ - dev_dbg(codec->dev, "%s: Mic 1 mic-type: %s\n", __func__, + dev_dbg(component->dev, "%s: Mic 1 mic-type: %s\n", __func__, amic_type_str(amics->mic1_type)); - snd_soc_update_bits(codec, AB8500_ANAGAIN1, AB8500_ANAGAINX_ENSEMICX, + snd_soc_component_update_bits(component, AB8500_ANAGAIN1, AB8500_ANAGAINX_ENSEMICX, amics->mic1_type == AMIC_TYPE_DIFFERENTIAL ? 0 : AB8500_ANAGAINX_ENSEMICX); - dev_dbg(codec->dev, "%s: Mic 2 mic-type: %s\n", __func__, + dev_dbg(component->dev, "%s: Mic 2 mic-type: %s\n", __func__, amic_type_str(amics->mic2_type)); - snd_soc_update_bits(codec, AB8500_ANAGAIN2, AB8500_ANAGAINX_ENSEMICX, + snd_soc_component_update_bits(component, AB8500_ANAGAIN2, AB8500_ANAGAINX_ENSEMICX, amics->mic2_type == AMIC_TYPE_DIFFERENTIAL ? 0 : AB8500_ANAGAINX_ENSEMICX); return 0; } -static int ab8500_audio_set_ear_cmv(struct snd_soc_codec *codec, +static int ab8500_audio_set_ear_cmv(struct snd_soc_component *component, enum ear_cm_voltage ear_cmv) { char *cmv_str; @@ -2023,14 +2023,14 @@ static int ab8500_audio_set_ear_cmv(struct snd_soc_codec *codec, cmv_str = "1.58V"; break; default: - dev_err(codec->dev, + dev_err(component->dev, "%s: Unknown earpiece CM-voltage (%d)!\n", __func__, (int)ear_cmv); return -EINVAL; } - dev_dbg(codec->dev, "%s: Earpiece CM-voltage: %s\n", __func__, + dev_dbg(component->dev, "%s: Earpiece CM-voltage: %s\n", __func__, cmv_str); - snd_soc_update_bits(codec, AB8500_ANACONF1, AB8500_ANACONF1_EARSELCM, + snd_soc_component_update_bits(component, AB8500_ANACONF1, AB8500_ANACONF1_EARSELCM, ear_cmv); return 0; @@ -2040,7 +2040,7 @@ static int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai, unsigned int delay) { unsigned int mask, val; - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; mask = BIT(AB8500_DIGIFCONF2_IF0DEL); val = 0; @@ -2052,21 +2052,21 @@ static int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai, val |= BIT(AB8500_DIGIFCONF2_IF0DEL); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupported bit-delay (0x%x)!\n", __func__, delay); return -EINVAL; } - dev_dbg(dai->codec->dev, "%s: IF0 Bit-delay: %d bits.\n", + dev_dbg(dai->component->dev, "%s: IF0 Bit-delay: %d bits.\n", __func__, delay); - snd_soc_update_bits(codec, AB8500_DIGIFCONF2, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val); return 0; } /* Gates clocking according format mask */ -static int ab8500_codec_set_dai_clock_gate(struct snd_soc_codec *codec, +static int ab8500_codec_set_dai_clock_gate(struct snd_soc_component *component, unsigned int fmt) { unsigned int mask; @@ -2079,22 +2079,22 @@ static int ab8500_codec_set_dai_clock_gate(struct snd_soc_codec *codec, switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) { case SND_SOC_DAIFMT_CONT: /* continuous clock */ - dev_dbg(codec->dev, "%s: IF0 Clock is continuous.\n", + dev_dbg(component->dev, "%s: IF0 Clock is continuous.\n", __func__); val |= BIT(AB8500_DIGIFCONF1_ENFSBITCLK0); break; case SND_SOC_DAIFMT_GATED: /* clock is gated */ - dev_dbg(codec->dev, "%s: IF0 Clock is gated.\n", + dev_dbg(component->dev, "%s: IF0 Clock is gated.\n", __func__); break; default: - dev_err(codec->dev, + dev_err(component->dev, "%s: ERROR: Unsupported clock mask (0x%x)!\n", __func__, fmt & SND_SOC_DAIFMT_CLOCK_MASK); return -EINVAL; } - snd_soc_update_bits(codec, AB8500_DIGIFCONF1, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val); return 0; } @@ -2103,10 +2103,10 @@ static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { unsigned int mask; unsigned int val; - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int status; - dev_dbg(codec->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt); + dev_dbg(component->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt); mask = BIT(AB8500_DIGIFCONF3_IF1DATOIF0AD) | BIT(AB8500_DIGIFCONF3_IF1CLKTOIF0CLK) | @@ -2116,32 +2116,32 @@ static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & FRM master */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0 Master-mode: AB8500 master.\n", __func__); val |= BIT(AB8500_DIGIFCONF3_IF0MASTER); break; case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & FRM slave */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0 Master-mode: AB8500 slave.\n", __func__); break; case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & FRM master */ case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */ - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: The device is either a master or a slave.\n", __func__); default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupporter master mask 0x%x\n", __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); return -EINVAL; } - snd_soc_update_bits(codec, AB8500_DIGIFCONF3, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF3, mask, val); /* Set clock gating */ - status = ab8500_codec_set_dai_clock_gate(codec, fmt); + status = ab8500_codec_set_dai_clock_gate(component, fmt); if (status) { - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Failed to set clock gate (%d).\n", __func__, status); return status; @@ -2157,27 +2157,27 @@ static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: /* I2S mode */ - dev_dbg(dai->codec->dev, "%s: IF0 Protocol: I2S\n", __func__); + dev_dbg(dai->component->dev, "%s: IF0 Protocol: I2S\n", __func__); val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT1); ab8500_audio_set_bit_delay(dai, 0); break; case SND_SOC_DAIFMT_DSP_A: /* L data MSB after FRM LRC */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0 Protocol: DSP A (TDM)\n", __func__); val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0); ab8500_audio_set_bit_delay(dai, 1); break; case SND_SOC_DAIFMT_DSP_B: /* L data MSB during FRM LRC */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0 Protocol: DSP B (TDM)\n", __func__); val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0); ab8500_audio_set_bit_delay(dai, 0); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupported format (0x%x)!\n", __func__, fmt & SND_SOC_DAIFMT_FORMAT_MASK); return -EINVAL; @@ -2185,37 +2185,37 @@ static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0: Normal bit clock, normal frame\n", __func__); break; case SND_SOC_DAIFMT_NB_IF: /* normal BCLK + inv FRM */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0: Normal bit clock, inverted frame\n", __func__); val |= BIT(AB8500_DIGIFCONF2_FSYNC0P); break; case SND_SOC_DAIFMT_IB_NF: /* invert BCLK + nor FRM */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0: Inverted bit clock, normal frame\n", __func__); val |= BIT(AB8500_DIGIFCONF2_BITCLK0P); break; case SND_SOC_DAIFMT_IB_IF: /* invert BCLK + FRM */ - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: IF0: Inverted bit clock, inverted frame\n", __func__); val |= BIT(AB8500_DIGIFCONF2_FSYNC0P); val |= BIT(AB8500_DIGIFCONF2_BITCLK0P); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupported INV mask 0x%x\n", __func__, fmt & SND_SOC_DAIFMT_INV_MASK); return -EINVAL; } - snd_soc_update_bits(codec, AB8500_DIGIFCONF2, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val); return 0; } @@ -2224,7 +2224,7 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val, mask, slot, slots_active; mask = BIT(AB8500_DIGIFCONF2_IF0WL0) | @@ -2245,17 +2245,17 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, BIT(AB8500_DIGIFCONF2_IF0WL0); break; default: - dev_err(dai->codec->dev, "%s: Unsupported slot-width 0x%x\n", + dev_err(dai->component->dev, "%s: Unsupported slot-width 0x%x\n", __func__, slot_width); return -EINVAL; } - dev_dbg(dai->codec->dev, "%s: IF0 slot-width: %d bits.\n", + dev_dbg(dai->component->dev, "%s: IF0 slot-width: %d bits.\n", __func__, slot_width); - snd_soc_update_bits(codec, AB8500_DIGIFCONF2, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val); /* Setup TDM clocking according to slot count */ - dev_dbg(dai->codec->dev, "%s: Slots, total: %d\n", __func__, slots); + dev_dbg(dai->component->dev, "%s: Slots, total: %d\n", __func__, slots); mask = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) | BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1); switch (slots) { @@ -2273,12 +2273,12 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupported number of slots (%d)!\n", __func__, slots); return -EINVAL; } - snd_soc_update_bits(codec, AB8500_DIGIFCONF1, mask, val); + snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val); /* Setup TDM DA according to active tx slots */ @@ -2289,7 +2289,7 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, tx_mask = tx_mask << AB8500_DA_DATA0_OFFSET; slots_active = hweight32(tx_mask); - dev_dbg(dai->codec->dev, "%s: Slots, active, TX: %d\n", __func__, + dev_dbg(dai->component->dev, "%s: Slots, active, TX: %d\n", __func__, slots_active); switch (slots_active) { @@ -2297,26 +2297,26 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, break; case 1: slot = ffs(tx_mask); - snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot); - snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot); - snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot); - snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot); break; case 2: slot = ffs(tx_mask); - snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot); - snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot); slot = fls(tx_mask); - snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot); - snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot); + snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot); break; case 8: - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: In 8-channel mode DA-from-slot mapping is set manually.", __func__); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: Unsupported number of active TX-slots (%d)!\n", __func__, slots_active); return -EINVAL; @@ -2330,7 +2330,7 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, rx_mask = rx_mask << AB8500_AD_DATA0_OFFSET; slots_active = hweight32(rx_mask); - dev_dbg(dai->codec->dev, "%s: Slots, active, RX: %d\n", __func__, + dev_dbg(dai->component->dev, "%s: Slots, active, RX: %d\n", __func__, slots_active); switch (slots_active) { @@ -2338,29 +2338,29 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai, break; case 1: slot = ffs(rx_mask); - snd_soc_update_bits(codec, AB8500_ADSLOTSEL(slot), + snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot), AB8500_MASK_SLOT(slot), AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot)); break; case 2: slot = ffs(rx_mask); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot), AB8500_MASK_SLOT(slot), AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot)); slot = fls(rx_mask); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot), AB8500_MASK_SLOT(slot), AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT2, slot)); break; case 8: - dev_dbg(dai->codec->dev, + dev_dbg(dai->component->dev, "%s: In 8-channel mode AD-to-slot mapping is set manually.", __func__); break; default: - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: Unsupported number of active RX-slots (%d)!\n", __func__, slots_active); return -EINVAL; @@ -2458,10 +2458,10 @@ static void ab8500_codec_of_probe(struct device *dev, struct device_node *np, } } -static int ab8500_codec_probe(struct snd_soc_codec *codec) +static int ab8500_codec_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct device *dev = codec->dev; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct device *dev = component->dev; struct device_node *np = dev->of_node; struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(dev); struct ab8500_codec_platform_data codec_pdata; @@ -2472,19 +2472,19 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec) ab8500_codec_of_probe(dev, np, &codec_pdata); - status = ab8500_audio_setup_mics(codec, &codec_pdata.amics); + status = ab8500_audio_setup_mics(component, &codec_pdata.amics); if (status < 0) { pr_err("%s: Failed to setup mics (%d)!\n", __func__, status); return status; } - status = ab8500_audio_set_ear_cmv(codec, codec_pdata.ear_cmv); + status = ab8500_audio_set_ear_cmv(component, codec_pdata.ear_cmv); if (status < 0) { pr_err("%s: Failed to set earpiece CM-voltage (%d)!\n", __func__, status); return status; } - status = ab8500_audio_init_audioblock(codec); + status = ab8500_audio_init_audioblock(component); if (status < 0) { dev_err(dev, "%s: failed to init audio-block (%d)!\n", __func__, status); @@ -2492,13 +2492,13 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec) } /* Override HW-defaults */ - snd_soc_write(codec, AB8500_ANACONF5, + snd_soc_component_write(component, AB8500_ANACONF5, BIT(AB8500_ANACONF5_HSAUTOEN)); - snd_soc_write(codec, AB8500_SHORTCIRCONF, + snd_soc_component_write(component, AB8500_SHORTCIRCONF, BIT(AB8500_SHORTCIRCONF_HSZCDDIS)); /* Add filter controls */ - status = snd_soc_add_codec_controls(codec, ab8500_filter_controls, + status = snd_soc_add_component_controls(component, ab8500_filter_controls, ARRAY_SIZE(ab8500_filter_controls)); if (status < 0) { dev_err(dev, @@ -2523,16 +2523,18 @@ static int ab8500_codec_probe(struct snd_soc_codec *codec) return status; } -static const struct snd_soc_codec_driver ab8500_codec_driver = { - .probe = ab8500_codec_probe, - .component_driver = { - .controls = ab8500_ctrls, - .num_controls = ARRAY_SIZE(ab8500_ctrls), - .dapm_widgets = ab8500_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ab8500_dapm_widgets), - .dapm_routes = ab8500_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ab8500_dapm_routes), - }, +static const struct snd_soc_component_driver ab8500_component_driver = { + .probe = ab8500_codec_probe, + .controls = ab8500_ctrls, + .num_controls = ARRAY_SIZE(ab8500_ctrls), + .dapm_widgets = ab8500_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ab8500_dapm_widgets), + .dapm_routes = ab8500_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ab8500_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ab8500_codec_driver_probe(struct platform_device *pdev) @@ -2561,7 +2563,8 @@ static int ab8500_codec_driver_probe(struct platform_device *pdev) } dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__); - status = snd_soc_register_codec(&pdev->dev, &ab8500_codec_driver, + status = devm_snd_soc_register_component(&pdev->dev, + &ab8500_component_driver, ab8500_codec_dai, ARRAY_SIZE(ab8500_codec_dai)); if (status < 0) @@ -2572,21 +2575,11 @@ static int ab8500_codec_driver_probe(struct platform_device *pdev) return status; } -static int ab8500_codec_driver_remove(struct platform_device *pdev) -{ - dev_dbg(&pdev->dev, "%s Enter.\n", __func__); - - snd_soc_unregister_codec(&pdev->dev); - - return 0; -} - static struct platform_driver ab8500_codec_platform_driver = { .driver = { .name = "ab8500-codec", }, .probe = ab8500_codec_driver_probe, - .remove = ab8500_codec_driver_remove, }; module_platform_driver(ab8500_codec_platform_driver); diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c index 440b4ce54376..02b4d01adb40 100644 --- a/sound/soc/codecs/ac97.c +++ b/sound/soc/codecs/ac97.c @@ -36,8 +36,8 @@ static const struct snd_soc_dapm_route ac97_routes[] = { static int ac97_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE; @@ -65,7 +65,7 @@ static struct snd_soc_dai_driver ac97_dai = { .ops = &ac97_dai_ops, }; -static int ac97_soc_probe(struct snd_soc_codec *codec) +static int ac97_soc_probe(struct snd_soc_component *component) { struct snd_ac97 *ac97; struct snd_ac97_bus *ac97_bus; @@ -73,7 +73,7 @@ static int ac97_soc_probe(struct snd_soc_codec *codec) int ret; /* add codec as bus device for standard ac97 */ - ret = snd_ac97_bus(codec->component.card->snd_card, 0, soc_ac97_ops, + ret = snd_ac97_bus(component->card->snd_card, 0, soc_ac97_ops, NULL, &ac97_bus); if (ret < 0) return ret; @@ -83,25 +83,25 @@ static int ac97_soc_probe(struct snd_soc_codec *codec) if (ret < 0) return ret; - snd_soc_codec_set_drvdata(codec, ac97); + snd_soc_component_set_drvdata(component, ac97); return 0; } #ifdef CONFIG_PM -static int ac97_soc_suspend(struct snd_soc_codec *codec) +static int ac97_soc_suspend(struct snd_soc_component *component) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); snd_ac97_suspend(ac97); return 0; } -static int ac97_soc_resume(struct snd_soc_codec *codec) +static int ac97_soc_resume(struct snd_soc_component *component) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); snd_ac97_resume(ac97); @@ -112,28 +112,28 @@ static int ac97_soc_resume(struct snd_soc_codec *codec) #define ac97_soc_resume NULL #endif -static const struct snd_soc_codec_driver soc_codec_dev_ac97 = { - .probe = ac97_soc_probe, - .suspend = ac97_soc_suspend, - .resume = ac97_soc_resume, - - .component_driver = { - .dapm_widgets = ac97_widgets, - .num_dapm_widgets = ARRAY_SIZE(ac97_widgets), - .dapm_routes = ac97_routes, - .num_dapm_routes = ARRAY_SIZE(ac97_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ac97 = { + .probe = ac97_soc_probe, + .suspend = ac97_soc_suspend, + .resume = ac97_soc_resume, + .dapm_widgets = ac97_widgets, + .num_dapm_widgets = ARRAY_SIZE(ac97_widgets), + .dapm_routes = ac97_routes, + .num_dapm_routes = ARRAY_SIZE(ac97_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ac97_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_ac97, &ac97_dai, 1); + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_ac97, &ac97_dai, 1); } static int ac97_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/codecs/ad1836.c b/sound/soc/codecs/ad1836.c index d0361caad09e..ada663bf5648 100644 --- a/sound/soc/codecs/ad1836.c +++ b/sound/soc/codecs/ad1836.c @@ -164,7 +164,7 @@ static int ad1836_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(dai->codec); + struct ad1836_priv *ad1836 = snd_soc_component_get_drvdata(dai->component); int word_len = 0; /* bit size */ @@ -228,17 +228,17 @@ static struct snd_soc_dai_driver ad183x_dais[] = { }; #ifdef CONFIG_PM -static int ad1836_suspend(struct snd_soc_codec *codec) +static int ad1836_suspend(struct snd_soc_component *component) { - struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); + struct ad1836_priv *ad1836 = snd_soc_component_get_drvdata(component); /* reset clock control mode */ return regmap_update_bits(ad1836->regmap, AD1836_ADC_CTRL2, AD1836_ADC_SERFMT_MASK, 0); } -static int ad1836_resume(struct snd_soc_codec *codec) +static int ad1836_resume(struct snd_soc_component *component) { - struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); + struct ad1836_priv *ad1836 = snd_soc_component_get_drvdata(component); /* restore clock control mode */ return regmap_update_bits(ad1836->regmap, AD1836_ADC_CTRL2, AD1836_ADC_SERFMT_MASK, AD1836_ADC_AUX); @@ -248,10 +248,10 @@ static int ad1836_resume(struct snd_soc_codec *codec) #define ad1836_resume NULL #endif -static int ad1836_probe(struct snd_soc_codec *codec) +static int ad1836_probe(struct snd_soc_component *component) { - struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct ad1836_priv *ad1836 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int num_dacs, num_adcs; int ret = 0; int i; @@ -277,7 +277,7 @@ static int ad1836_probe(struct snd_soc_codec *codec) if (ad1836->type == AD1836) { /* left/right diff:PGA/MUX */ regmap_write(ad1836->regmap, AD1836_ADC_CTRL3, 0x3A); - ret = snd_soc_add_codec_controls(codec, ad1836_controls, + ret = snd_soc_add_component_controls(component, ad1836_controls, ARRAY_SIZE(ad1836_controls)); if (ret) return ret; @@ -285,11 +285,11 @@ static int ad1836_probe(struct snd_soc_codec *codec) regmap_write(ad1836->regmap, AD1836_ADC_CTRL3, 0x00); } - ret = snd_soc_add_codec_controls(codec, ad183x_dac_controls, num_dacs * 2); + ret = snd_soc_add_component_controls(component, ad183x_dac_controls, num_dacs * 2); if (ret) return ret; - ret = snd_soc_add_codec_controls(codec, ad183x_adc_controls, num_adcs); + ret = snd_soc_add_component_controls(component, ad183x_adc_controls, num_adcs); if (ret) return ret; @@ -313,28 +313,29 @@ static int ad1836_probe(struct snd_soc_codec *codec) } /* power down chip */ -static int ad1836_remove(struct snd_soc_codec *codec) +static void ad1836_remove(struct snd_soc_component *component) { - struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); + struct ad1836_priv *ad1836 = snd_soc_component_get_drvdata(component); /* reset clock control mode */ - return regmap_update_bits(ad1836->regmap, AD1836_ADC_CTRL2, + regmap_update_bits(ad1836->regmap, AD1836_ADC_CTRL2, AD1836_ADC_SERFMT_MASK, 0); } -static const struct snd_soc_codec_driver soc_codec_dev_ad1836 = { - .probe = ad1836_probe, - .remove = ad1836_remove, - .suspend = ad1836_suspend, - .resume = ad1836_resume, - - .component_driver = { - .controls = ad183x_controls, - .num_controls = ARRAY_SIZE(ad183x_controls), - .dapm_widgets = ad183x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ad183x_dapm_widgets), - .dapm_routes = ad183x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ad183x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ad1836 = { + .probe = ad1836_probe, + .remove = ad1836_remove, + .suspend = ad1836_suspend, + .resume = ad1836_resume, + .controls = ad183x_controls, + .num_controls = ARRAY_SIZE(ad183x_controls), + .dapm_widgets = ad183x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ad183x_dapm_widgets), + .dapm_routes = ad183x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ad183x_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct reg_default ad1836_reg_defaults[] = { @@ -382,17 +383,11 @@ static int ad1836_spi_probe(struct spi_device *spi) spi_set_drvdata(spi, ad1836); - ret = snd_soc_register_codec(&spi->dev, - &soc_codec_dev_ad1836, &ad183x_dais[ad1836->type], 1); + ret = devm_snd_soc_register_component(&spi->dev, + &soc_component_dev_ad1836, &ad183x_dais[ad1836->type], 1); return ret; } -static int ad1836_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static const struct spi_device_id ad1836_ids[] = { { "ad1835", AD1835 }, { "ad1836", AD1836 }, @@ -408,7 +403,6 @@ static struct spi_driver ad1836_spi_driver = { .name = "ad1836", }, .probe = ad1836_spi_probe, - .remove = ad1836_spi_remove, .id_table = ad1836_ids, }; diff --git a/sound/soc/codecs/ad193x-i2c.c b/sound/soc/codecs/ad193x-i2c.c index 171313664bc8..b9551334f6b4 100644 --- a/sound/soc/codecs/ad193x-i2c.c +++ b/sound/soc/codecs/ad193x-i2c.c @@ -35,18 +35,11 @@ static int ad193x_i2c_probe(struct i2c_client *client, (enum ad193x_type)id->driver_data); } -static int ad193x_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static struct i2c_driver ad193x_i2c_driver = { .driver = { .name = "ad193x", }, .probe = ad193x_i2c_probe, - .remove = ad193x_i2c_remove, .id_table = ad193x_id, }; module_i2c_driver(ad193x_i2c_driver); diff --git a/sound/soc/codecs/ad193x-spi.c b/sound/soc/codecs/ad193x-spi.c index 23c28573bdb7..3c1394a803b8 100644 --- a/sound/soc/codecs/ad193x-spi.c +++ b/sound/soc/codecs/ad193x-spi.c @@ -29,12 +29,6 @@ static int ad193x_spi_probe(struct spi_device *spi) (enum ad193x_type)id->driver_data); } -static int ad193x_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static const struct spi_device_id ad193x_spi_id[] = { { "ad193x", AD193X }, { "ad1933", AD1933 }, @@ -51,7 +45,6 @@ static struct spi_driver ad193x_spi_driver = { .name = "ad193x", }, .probe = ad193x_spi_probe, - .remove = ad193x_spi_remove, .id_table = ad193x_spi_id, }; module_spi_driver(ad193x_spi_driver); diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index d10988eec0c1..4b60ebee491d 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c @@ -130,7 +130,7 @@ static inline bool ad193x_has_adc(const struct ad193x_priv *ad193x) static int ad193x_mute(struct snd_soc_dai *dai, int mute) { - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec); + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component); if (mute) regmap_update_bits(ad193x->regmap, AD193X_DAC_CTRL2, @@ -146,7 +146,7 @@ static int ad193x_mute(struct snd_soc_dai *dai, int mute) static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int width) { - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(dai->codec); + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(dai->component); unsigned int channels; switch (slots) { @@ -179,7 +179,7 @@ static int ad193x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec_dai->codec); + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(codec_dai->component); unsigned int adc_serfmt = 0; unsigned int adc_fmt = 0; unsigned int dac_fmt = 0; @@ -257,8 +257,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, static int ad193x_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); switch (freq) { case 12288000: case 18432000: @@ -275,8 +275,8 @@ static int ad193x_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int word_len = 0, master_rate = 0; - struct snd_soc_codec *codec = dai->codec; - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); /* bit size */ switch (params_width(params)) { @@ -351,10 +351,10 @@ static struct snd_soc_dai_driver ad193x_dai = { .ops = &ad193x_dai_ops, }; -static int ad193x_codec_probe(struct snd_soc_codec *codec) +static int ad193x_component_probe(struct snd_soc_component *component) { - struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct ad193x_priv *ad193x = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int num, ret; /* default setting for ad193x */ @@ -382,7 +382,7 @@ static int ad193x_codec_probe(struct snd_soc_codec *codec) if (ad193x_has_adc(ad193x)) { /* add adc controls */ num = ARRAY_SIZE(ad193x_adc_snd_controls); - ret = snd_soc_add_codec_controls(codec, + ret = snd_soc_add_component_controls(component, ad193x_adc_snd_controls, num); if (ret) @@ -408,16 +408,18 @@ static int ad193x_codec_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_ad193x = { - .probe = ad193x_codec_probe, - .component_driver = { - .controls = ad193x_snd_controls, - .num_controls = ARRAY_SIZE(ad193x_snd_controls), - .dapm_widgets = ad193x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets), - .dapm_routes = audio_paths, - .num_dapm_routes = ARRAY_SIZE(audio_paths), - }, +static const struct snd_soc_component_driver soc_component_dev_ad193x = { + .probe = ad193x_component_probe, + .controls = ad193x_snd_controls, + .num_controls = ARRAY_SIZE(ad193x_snd_controls), + .dapm_widgets = ad193x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ad193x_dapm_widgets), + .dapm_routes = audio_paths, + .num_dapm_routes = ARRAY_SIZE(audio_paths), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; const struct regmap_config ad193x_regmap_config = { @@ -442,7 +444,7 @@ int ad193x_probe(struct device *dev, struct regmap *regmap, dev_set_drvdata(dev, ad193x); - return snd_soc_register_codec(dev, &soc_codec_dev_ad193x, + return devm_snd_soc_register_component(dev, &soc_component_dev_ad193x, &ad193x_dai, 1); } EXPORT_SYMBOL_GPL(ad193x_probe); diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index ce89bfb42094..16dab3f00a1c 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c @@ -205,9 +205,9 @@ static struct snd_soc_dai_driver ad1980_dai = { #define AD1980_VENDOR_ID 0x41445300 #define AD1980_VENDOR_MASK 0xffffff00 -static int ad1980_reset(struct snd_soc_codec *codec, int try_warm) +static int ad1980_reset(struct snd_soc_component *component, int try_warm) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); unsigned int retry_cnt = 0; int ret; @@ -223,16 +223,16 @@ static int ad1980_reset(struct snd_soc_codec *codec, int try_warm) * case the first nibble of data is eaten by the addr. (Tag is * always 16 bit) */ - snd_soc_write(codec, AC97_AD_SERIAL_CFG, 0x9900); + snd_soc_component_write(component, AC97_AD_SERIAL_CFG, 0x9900); } while (retry_cnt++ < 10); - dev_err(codec->dev, "Failed to reset: AC97 link error\n"); + dev_err(component->dev, "Failed to reset: AC97 link error\n"); return -EIO; } -static int ad1980_soc_probe(struct snd_soc_codec *codec) +static int ad1980_soc_probe(struct snd_soc_component *component) { struct snd_ac97 *ac97; struct regmap *regmap; @@ -240,10 +240,10 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec) u16 vendor_id2; u16 ext_status; - ac97 = snd_soc_new_ac97_codec(codec, 0, 0); + ac97 = snd_soc_new_ac97_component(component, 0, 0); if (IS_ERR(ac97)) { ret = PTR_ERR(ac97); - dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); + dev_err(component->dev, "Failed to register AC97 component: %d\n", ret); return ret; } @@ -253,72 +253,66 @@ static int ad1980_soc_probe(struct snd_soc_codec *codec) goto err_free_ac97; } - snd_soc_codec_init_regmap(codec, regmap); - snd_soc_codec_set_drvdata(codec, ac97); + snd_soc_component_init_regmap(component, regmap); + snd_soc_component_set_drvdata(component, ac97); - ret = ad1980_reset(codec, 0); + ret = ad1980_reset(component, 0); if (ret < 0) goto reset_err; - vendor_id2 = snd_soc_read(codec, AC97_VENDOR_ID2); + vendor_id2 = snd_soc_component_read32(component, AC97_VENDOR_ID2); if (vendor_id2 == 0x5374) { - dev_warn(codec->dev, + dev_warn(component->dev, "Found AD1981 - only 2/2 IN/OUT Channels supported\n"); } /* unmute captures and playbacks volume */ - snd_soc_write(codec, AC97_MASTER, 0x0000); - snd_soc_write(codec, AC97_PCM, 0x0000); - snd_soc_write(codec, AC97_REC_GAIN, 0x0000); - snd_soc_write(codec, AC97_CENTER_LFE_MASTER, 0x0000); - snd_soc_write(codec, AC97_SURROUND_MASTER, 0x0000); + snd_soc_component_write(component, AC97_MASTER, 0x0000); + snd_soc_component_write(component, AC97_PCM, 0x0000); + snd_soc_component_write(component, AC97_REC_GAIN, 0x0000); + snd_soc_component_write(component, AC97_CENTER_LFE_MASTER, 0x0000); + snd_soc_component_write(component, AC97_SURROUND_MASTER, 0x0000); /*power on LFE/CENTER/Surround DACs*/ - ext_status = snd_soc_read(codec, AC97_EXTENDED_STATUS); - snd_soc_write(codec, AC97_EXTENDED_STATUS, ext_status&~0x3800); + ext_status = snd_soc_component_read32(component, AC97_EXTENDED_STATUS); + snd_soc_component_write(component, AC97_EXTENDED_STATUS, ext_status&~0x3800); return 0; reset_err: - snd_soc_codec_exit_regmap(codec); + snd_soc_component_exit_regmap(component); err_free_ac97: - snd_soc_free_ac97_codec(ac97); + snd_soc_free_ac97_component(ac97); return ret; } -static int ad1980_soc_remove(struct snd_soc_codec *codec) +static void ad1980_soc_remove(struct snd_soc_component *component) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); - snd_soc_codec_exit_regmap(codec); - snd_soc_free_ac97_codec(ac97); - return 0; + snd_soc_component_exit_regmap(component); + snd_soc_free_ac97_component(ac97); } -static const struct snd_soc_codec_driver soc_codec_dev_ad1980 = { - .probe = ad1980_soc_probe, - .remove = ad1980_soc_remove, - - .component_driver = { - .controls = ad1980_snd_ac97_controls, - .num_controls = ARRAY_SIZE(ad1980_snd_ac97_controls), - .dapm_widgets = ad1980_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ad1980_dapm_widgets), - .dapm_routes = ad1980_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ad1980_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ad1980 = { + .probe = ad1980_soc_probe, + .remove = ad1980_soc_remove, + .controls = ad1980_snd_ac97_controls, + .num_controls = ARRAY_SIZE(ad1980_snd_ac97_controls), + .dapm_widgets = ad1980_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ad1980_dapm_widgets), + .dapm_routes = ad1980_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ad1980_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ad1980_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_ad1980, &ad1980_dai, 1); -} - -static int ad1980_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_ad1980, &ad1980_dai, 1); } static struct platform_driver ad1980_codec_driver = { @@ -327,7 +321,6 @@ static struct platform_driver ad1980_codec_driver = { }, .probe = ad1980_probe, - .remove = ad1980_remove, }; module_platform_driver(ad1980_codec_driver); diff --git a/sound/soc/codecs/ad73311.c b/sound/soc/codecs/ad73311.c index d8d86a0fea60..03ee571e1b7a 100644 --- a/sound/soc/codecs/ad73311.c +++ b/sound/soc/codecs/ad73311.c @@ -54,25 +54,21 @@ static struct snd_soc_dai_driver ad73311_dai = { .formats = SNDRV_PCM_FMTBIT_S16_LE, }, }; -static const struct snd_soc_codec_driver soc_codec_dev_ad73311 = { - .component_driver = { - .dapm_widgets = ad73311_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ad73311_dapm_widgets), - .dapm_routes = ad73311_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ad73311_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ad73311 = { + .dapm_widgets = ad73311_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ad73311_dapm_widgets), + .dapm_routes = ad73311_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ad73311_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ad73311_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_ad73311, &ad73311_dai, 1); -} - -static int ad73311_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_ad73311, &ad73311_dai, 1); } static struct platform_driver ad73311_codec_driver = { @@ -81,7 +77,6 @@ static struct platform_driver ad73311_codec_driver = { }, .probe = ad73311_probe, - .remove = ad73311_remove, }; module_platform_driver(ad73311_codec_driver); diff --git a/sound/soc/codecs/adau1373.c b/sound/soc/codecs/adau1373.c index a865945d776a..f22ff9f6ab47 100644 --- a/sound/soc/codecs/adau1373.c +++ b/sound/soc/codecs/adau1373.c @@ -549,8 +549,8 @@ static const struct snd_kcontrol_new adau1373_drc_controls[] = { static int adau1373_pll_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); unsigned int pll_id = w->name[3] - '1'; unsigned int val; @@ -821,8 +821,8 @@ static const struct snd_soc_dapm_widget adau1373_dapm_widgets[] = { static int adau1373_check_aif_clk(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); unsigned int dai; const char *clk; @@ -842,8 +842,8 @@ static int adau1373_check_aif_clk(struct snd_soc_dapm_widget *source, static int adau1373_check_src(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); unsigned int dai; dai = sink->name[3] - '1'; @@ -1031,8 +1031,8 @@ static const struct snd_soc_dapm_route adau1373_dapm_routes[] = { static int adau1373_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); struct adau1373_dai *adau1373_dai = &adau1373->dais[dai->id]; unsigned int div; unsigned int freq; @@ -1098,8 +1098,8 @@ static int adau1373_hw_params(struct snd_pcm_substream *substream, static int adau1373_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); struct adau1373_dai *adau1373_dai = &adau1373->dais[dai->id]; unsigned int ctrl; @@ -1158,7 +1158,7 @@ static int adau1373_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int adau1373_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(dai->component); struct adau1373_dai *adau1373_dai = &adau1373->dais[dai->id]; switch (clk_id) { @@ -1250,10 +1250,10 @@ static struct snd_soc_dai_driver adau1373_dai_driver[] = { }, }; -static int adau1373_set_pll(struct snd_soc_codec *codec, int pll_id, +static int adau1373_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); unsigned int dpll_div = 0; uint8_t pll_regs[5]; int ret; @@ -1348,10 +1348,10 @@ static bool adau1373_valid_micbias(enum adau1373_micbias_voltage micbias) return false; } -static int adau1373_probe(struct snd_soc_codec *codec) +static int adau1373_probe(struct snd_soc_component *component) { - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); - struct adau1373_platform_data *pdata = codec->dev->platform_data; + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); + struct adau1373_platform_data *pdata = component->dev->platform_data; bool lineout_differential = false; unsigned int val; int i; @@ -1369,7 +1369,7 @@ static int adau1373_probe(struct snd_soc_codec *codec) pdata->drc_setting[i]); } - snd_soc_add_codec_controls(codec, adau1373_drc_controls, + snd_soc_add_component_controls(component, adau1373_drc_controls, pdata->num_drc); val = 0; @@ -1394,7 +1394,7 @@ static int adau1373_probe(struct snd_soc_codec *codec) } if (!lineout_differential) { - snd_soc_add_codec_controls(codec, adau1373_lineout2_controls, + snd_soc_add_component_controls(component, adau1373_lineout2_controls, ARRAY_SIZE(adau1373_lineout2_controls)); } @@ -1404,10 +1404,10 @@ static int adau1373_probe(struct snd_soc_codec *codec) return 0; } -static int adau1373_set_bias_level(struct snd_soc_codec *codec, +static int adau1373_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -1426,9 +1426,9 @@ static int adau1373_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int adau1373_resume(struct snd_soc_codec *codec) +static int adau1373_resume(struct snd_soc_component *component) { - struct adau1373 *adau1373 = snd_soc_codec_get_drvdata(codec); + struct adau1373 *adau1373 = snd_soc_component_get_drvdata(component); regcache_sync(adau1373->regmap); @@ -1458,22 +1458,20 @@ static const struct regmap_config adau1373_regmap_config = { .num_reg_defaults = ARRAY_SIZE(adau1373_reg_defaults), }; -static const struct snd_soc_codec_driver adau1373_codec_driver = { - .probe = adau1373_probe, - .resume = adau1373_resume, - .set_bias_level = adau1373_set_bias_level, - .idle_bias_off = true, - - .set_pll = adau1373_set_pll, - - .component_driver = { - .controls = adau1373_controls, - .num_controls = ARRAY_SIZE(adau1373_controls), - .dapm_widgets = adau1373_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau1373_dapm_widgets), - .dapm_routes = adau1373_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adau1373_dapm_routes), - }, +static const struct snd_soc_component_driver adau1373_component_driver = { + .probe = adau1373_probe, + .resume = adau1373_resume, + .set_bias_level = adau1373_set_bias_level, + .set_pll = adau1373_set_pll, + .controls = adau1373_controls, + .num_controls = ARRAY_SIZE(adau1373_controls), + .dapm_widgets = adau1373_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau1373_dapm_widgets), + .dapm_routes = adau1373_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adau1373_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int adau1373_i2c_probe(struct i2c_client *client, @@ -1495,17 +1493,12 @@ static int adau1373_i2c_probe(struct i2c_client *client, dev_set_drvdata(&client->dev, adau1373); - ret = snd_soc_register_codec(&client->dev, &adau1373_codec_driver, + ret = devm_snd_soc_register_component(&client->dev, + &adau1373_component_driver, adau1373_dai_driver, ARRAY_SIZE(adau1373_dai_driver)); return ret; } -static int adau1373_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id adau1373_i2c_id[] = { { "adau1373", 0 }, { } @@ -1517,7 +1510,6 @@ static struct i2c_driver adau1373_i2c_driver = { .name = "adau1373", }, .probe = adau1373_i2c_probe, - .remove = adau1373_i2c_remove, .id_table = adau1373_i2c_id, }; diff --git a/sound/soc/codecs/adau1701.c b/sound/soc/codecs/adau1701.c index 805afac8146b..b5a61741c800 100644 --- a/sound/soc/codecs/adau1701.c +++ b/sound/soc/codecs/adau1701.c @@ -298,10 +298,10 @@ static const struct sigmadsp_ops adau1701_sigmadsp_ops = { .safeload = adau1701_safeload, }; -static int adau1701_reset(struct snd_soc_codec *codec, unsigned int clkdiv, +static int adau1701_reset(struct snd_soc_component *component, unsigned int clkdiv, unsigned int rate) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); int ret; sigmadsp_reset(adau1701->sigmadsp); @@ -348,7 +348,7 @@ static int adau1701_reset(struct snd_soc_codec *codec, unsigned int clkdiv, if (clkdiv != ADAU1707_CLKDIV_UNSET) { ret = sigmadsp_setup(adau1701->sigmadsp, rate); if (ret) { - dev_warn(codec->dev, "Failed to load firmware\n"); + dev_warn(component->dev, "Failed to load firmware\n"); return ret; } } @@ -362,10 +362,10 @@ static int adau1701_reset(struct snd_soc_codec *codec, unsigned int clkdiv, return 0; } -static int adau1701_set_capture_pcm_format(struct snd_soc_codec *codec, +static int adau1701_set_capture_pcm_format(struct snd_soc_component *component, struct snd_pcm_hw_params *params) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); unsigned int mask = ADAU1701_SEROCTL_WORD_LEN_MASK; unsigned int val; @@ -403,10 +403,10 @@ static int adau1701_set_capture_pcm_format(struct snd_soc_codec *codec, return 0; } -static int adau1701_set_playback_pcm_format(struct snd_soc_codec *codec, +static int adau1701_set_playback_pcm_format(struct snd_soc_component *component, struct snd_pcm_hw_params *params) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); unsigned int val; if (adau1701->dai_fmt != SND_SOC_DAIFMT_RIGHT_J) @@ -435,8 +435,8 @@ static int adau1701_set_playback_pcm_format(struct snd_soc_codec *codec, static int adau1701_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); unsigned int clkdiv = adau1701->sysclk / params_rate(params); unsigned int val; int ret; @@ -447,7 +447,7 @@ static int adau1701_hw_params(struct snd_pcm_substream *substream, * firmware upload. */ if (clkdiv != adau1701->pll_clkdiv) { - ret = adau1701_reset(codec, clkdiv, params_rate(params)); + ret = adau1701_reset(component, clkdiv, params_rate(params)); if (ret < 0) return ret; } @@ -470,16 +470,16 @@ static int adau1701_hw_params(struct snd_pcm_substream *substream, ADAU1701_DSPCTRL_SR_MASK, val); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - return adau1701_set_playback_pcm_format(codec, params); + return adau1701_set_playback_pcm_format(component, params); else - return adau1701_set_capture_pcm_format(codec, params); + return adau1701_set_capture_pcm_format(component, params); } static int adau1701_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); unsigned int serictl = 0x00, seroctl = 0x00; bool invert_lrclk; @@ -548,11 +548,11 @@ static int adau1701_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } -static int adau1701_set_bias_level(struct snd_soc_codec *codec, +static int adau1701_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { unsigned int mask = ADAU1701_AUXNPOW_VBPD | ADAU1701_AUXNPOW_VRPD; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -576,9 +576,9 @@ static int adau1701_set_bias_level(struct snd_soc_codec *codec, static int adau1701_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int mask = ADAU1701_DSPCTRL_DAM; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); unsigned int val; if (mute) @@ -591,11 +591,11 @@ static int adau1701_digital_mute(struct snd_soc_dai *dai, int mute) return 0; } -static int adau1701_set_sysclk(struct snd_soc_codec *codec, int clk_id, +static int adau1701_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { unsigned int val; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); switch (clk_id) { case ADAU1701_CLK_SRC_OSC: @@ -618,7 +618,7 @@ static int adau1701_set_sysclk(struct snd_soc_codec *codec, int clk_id, static int adau1701_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(dai->component); return sigmadsp_restrict_params(adau1701->sigmadsp, substream); } @@ -664,20 +664,20 @@ static const struct of_device_id adau1701_dt_ids[] = { MODULE_DEVICE_TABLE(of, adau1701_dt_ids); #endif -static int adau1701_probe(struct snd_soc_codec *codec) +static int adau1701_probe(struct snd_soc_component *component) { int i, ret; unsigned int val; - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); - ret = sigmadsp_attach(adau1701->sigmadsp, &codec->component); + ret = sigmadsp_attach(adau1701->sigmadsp, component); if (ret) return ret; ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; } @@ -690,7 +690,7 @@ static int adau1701_probe(struct snd_soc_codec *codec) adau1701->pll_clkdiv = ADAU1707_CLKDIV_UNSET; /* initalize with pre-configured pll mode settings */ - ret = adau1701_reset(codec, adau1701->pll_clkdiv, 0); + ret = adau1701_reset(component, adau1701->pll_clkdiv, 0); if (ret < 0) goto exit_regulators_disable; @@ -715,22 +715,20 @@ exit_regulators_disable: return ret; } -static int adau1701_remove(struct snd_soc_codec *codec) +static void adau1701_remove(struct snd_soc_component *component) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); if (gpio_is_valid(adau1701->gpio_nreset)) gpio_set_value_cansleep(adau1701->gpio_nreset, 0); regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); - - return 0; } #ifdef CONFIG_PM -static int adau1701_suspend(struct snd_soc_codec *codec) +static int adau1701_suspend(struct snd_soc_component *component) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); @@ -738,42 +736,41 @@ static int adau1701_suspend(struct snd_soc_codec *codec) return 0; } -static int adau1701_resume(struct snd_soc_codec *codec) +static int adau1701_resume(struct snd_soc_component *component) { - struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); + struct adau1701 *adau1701 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; } - return adau1701_reset(codec, adau1701->pll_clkdiv, 0); + return adau1701_reset(component, adau1701->pll_clkdiv, 0); } #else #define adau1701_resume NULL #define adau1701_suspend NULL #endif /* CONFIG_PM */ -static const struct snd_soc_codec_driver adau1701_codec_drv = { +static const struct snd_soc_component_driver adau1701_component_drv = { .probe = adau1701_probe, .remove = adau1701_remove, .resume = adau1701_resume, .suspend = adau1701_suspend, .set_bias_level = adau1701_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = adau1701_controls, - .num_controls = ARRAY_SIZE(adau1701_controls), - .dapm_widgets = adau1701_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau1701_dapm_widgets), - .dapm_routes = adau1701_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adau1701_dapm_routes), - }, + .controls = adau1701_controls, + .num_controls = ARRAY_SIZE(adau1701_controls), + .dapm_widgets = adau1701_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau1701_dapm_widgets), + .dapm_routes = adau1701_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adau1701_dapm_routes), .set_sysclk = adau1701_set_sysclk, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config adau1701_regmap = { @@ -889,7 +886,8 @@ static int adau1701_i2c_probe(struct i2c_client *client, goto exit_regulators_disable; } - ret = snd_soc_register_codec(&client->dev, &adau1701_codec_drv, + ret = devm_snd_soc_register_component(&client->dev, + &adau1701_component_drv, &adau1701_dai, 1); exit_regulators_disable: @@ -898,12 +896,6 @@ exit_regulators_disable: return ret; } -static int adau1701_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id adau1701_i2c_id[] = { { "adau1401", 0 }, { "adau1401a", 0 }, @@ -919,7 +911,6 @@ static struct i2c_driver adau1701_i2c_driver = { .of_match_table = of_match_ptr(adau1701_dt_ids), }, .probe = adau1701_i2c_probe, - .remove = adau1701_i2c_remove, .id_table = adau1701_i2c_id, }; diff --git a/sound/soc/codecs/adau1761.c b/sound/soc/codecs/adau1761.c index 3bc3cc559dde..be136e981653 100644 --- a/sound/soc/codecs/adau1761.c +++ b/sound/soc/codecs/adau1761.c @@ -255,8 +255,8 @@ static const struct snd_kcontrol_new adau1761_input_mux_control = static int adau1761_dejitter_fixup(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct adau *adau = snd_soc_component_get_drvdata(component); /* After any power changes have been made the dejitter circuit * has to be reinitialized. */ @@ -445,10 +445,10 @@ static const struct snd_soc_dapm_route adau1761_dapm_routes[] = { { "Digital Clock 1", NULL, "SYSCLK" }, }; -static int adau1761_set_bias_level(struct snd_soc_codec *codec, +static int adau1761_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct adau *adau = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -460,7 +460,7 @@ static int adau1761_set_bias_level(struct snd_soc_codec *codec, regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL, ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, ADAU17X1_CLOCK_CONTROL_SYSCLK_EN); - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) regcache_sync(adau->regmap); break; case SND_SOC_BIAS_OFF: @@ -474,9 +474,9 @@ static int adau1761_set_bias_level(struct snd_soc_codec *codec, } static enum adau1761_output_mode adau1761_get_lineout_mode( - struct snd_soc_codec *codec) + struct snd_soc_component *component) { - struct adau1761_platform_data *pdata = codec->dev->platform_data; + struct adau1761_platform_data *pdata = component->dev->platform_data; if (pdata) return pdata->lineout_mode; @@ -484,11 +484,11 @@ static enum adau1761_output_mode adau1761_get_lineout_mode( return ADAU1761_OUTPUT_MODE_LINE; } -static int adau1761_setup_digmic_jackdetect(struct snd_soc_codec *codec) +static int adau1761_setup_digmic_jackdetect(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau1761_platform_data *pdata = codec->dev->platform_data; - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau1761_platform_data *pdata = component->dev->platform_data; + struct adau *adau = snd_soc_component_get_drvdata(component); enum adau1761_digmic_jackdet_pin_mode mode; unsigned int val = 0; int ret; @@ -513,7 +513,7 @@ static int adau1761_setup_digmic_jackdetect(struct snd_soc_codec *codec) if (pdata->jackdetect_active_low) val |= ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW; - ret = snd_soc_add_codec_controls(codec, + ret = snd_soc_add_component_controls(component, adau1761_jack_detect_controls, ARRAY_SIZE(adau1761_jack_detect_controls)); if (ret) @@ -546,11 +546,11 @@ static int adau1761_setup_digmic_jackdetect(struct snd_soc_codec *codec) return 0; } -static int adau1761_setup_headphone_mode(struct snd_soc_codec *codec) +static int adau1761_setup_headphone_mode(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau *adau = snd_soc_codec_get_drvdata(codec); - struct adau1761_platform_data *pdata = codec->dev->platform_data; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau *adau = snd_soc_component_get_drvdata(component); + struct adau1761_platform_data *pdata = component->dev->platform_data; enum adau1761_output_mode mode; int ret; @@ -588,7 +588,7 @@ static int adau1761_setup_headphone_mode(struct snd_soc_codec *codec) adau1761_capless_dapm_routes, ARRAY_SIZE(adau1761_capless_dapm_routes)); } else { - ret = snd_soc_add_codec_controls(codec, adau1761_mono_controls, + ret = snd_soc_add_component_controls(component, adau1761_mono_controls, ARRAY_SIZE(adau1761_mono_controls)); if (ret) return ret; @@ -640,14 +640,14 @@ static bool adau1761_readable_register(struct device *dev, unsigned int reg) return adau17x1_readable_register(dev, reg); } -static int adau1761_codec_probe(struct snd_soc_codec *codec) +static int adau1761_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau1761_platform_data *pdata = codec->dev->platform_data; - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau1761_platform_data *pdata = component->dev->platform_data; + struct adau *adau = snd_soc_component_get_drvdata(component); int ret; - ret = adau17x1_add_widgets(codec); + ret = adau17x1_add_widgets(component); if (ret < 0) return ret; @@ -658,20 +658,20 @@ static int adau1761_codec_probe(struct snd_soc_codec *codec) regmap_update_bits(adau->regmap, ADAU1761_RIGHT_DIFF_INPUT_VOL, ADAU1761_DIFF_INPUT_VOL_LDEN, ADAU1761_DIFF_INPUT_VOL_LDEN); - ret = snd_soc_add_codec_controls(codec, + ret = snd_soc_add_component_controls(component, adau1761_differential_mode_controls, ARRAY_SIZE(adau1761_differential_mode_controls)); if (ret) return ret; } else { - ret = snd_soc_add_codec_controls(codec, + ret = snd_soc_add_component_controls(component, adau1761_single_mode_controls, ARRAY_SIZE(adau1761_single_mode_controls)); if (ret) return ret; } - switch (adau1761_get_lineout_mode(codec)) { + switch (adau1761_get_lineout_mode(component)) { case ADAU1761_OUTPUT_MODE_LINE: break; case ADAU1761_OUTPUT_MODE_HEADPHONE: @@ -686,11 +686,11 @@ static int adau1761_codec_probe(struct snd_soc_codec *codec) return -EINVAL; } - ret = adau1761_setup_headphone_mode(codec); + ret = adau1761_setup_headphone_mode(component); if (ret) return ret; - ret = adau1761_setup_digmic_jackdetect(codec); + ret = adau1761_setup_digmic_jackdetect(component); if (ret) return ret; @@ -706,27 +706,28 @@ static int adau1761_codec_probe(struct snd_soc_codec *codec) return ret; } - ret = adau17x1_add_routes(codec); + ret = adau17x1_add_routes(component); if (ret < 0) return ret; return 0; } -static const struct snd_soc_codec_driver adau1761_codec_driver = { - .probe = adau1761_codec_probe, - .resume = adau17x1_resume, - .set_bias_level = adau1761_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = adau1761_controls, - .num_controls = ARRAY_SIZE(adau1761_controls), - .dapm_widgets = adau1x61_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau1x61_dapm_widgets), - .dapm_routes = adau1x61_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adau1x61_dapm_routes), - }, +static const struct snd_soc_component_driver adau1761_component_driver = { + .probe = adau1761_component_probe, + .resume = adau17x1_resume, + .set_bias_level = adau1761_set_bias_level, + .controls = adau1761_controls, + .num_controls = ARRAY_SIZE(adau1761_controls), + .dapm_widgets = adau1x61_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau1x61_dapm_widgets), + .dapm_routes = adau1x61_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adau1x61_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; #define ADAU1761_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \ @@ -793,7 +794,8 @@ int adau1761_probe(struct device *dev, struct regmap *regmap, * reaches standby and the core clock is enabled */ regcache_cache_only(regmap, true); - return snd_soc_register_codec(dev, &adau1761_codec_driver, dai_drv, 1); + return devm_snd_soc_register_component(dev, &adau1761_component_driver, + dai_drv, 1); } EXPORT_SYMBOL_GPL(adau1761_probe); diff --git a/sound/soc/codecs/adau1781.c b/sound/soc/codecs/adau1781.c index 546071c6c0d0..6a6655730cd4 100644 --- a/sound/soc/codecs/adau1781.c +++ b/sound/soc/codecs/adau1781.c @@ -174,8 +174,8 @@ static const struct snd_kcontrol_new adau1781_mono_mixer_controls[] = { static int adau1781_dejitter_fixup(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct adau *adau = snd_soc_component_get_drvdata(component); /* After any power changes have been made the dejitter circuit * has to be reinitialized. */ @@ -314,10 +314,10 @@ static const struct snd_soc_dapm_route adau1781_dmic_dapm_routes[] = { { "Right Decimator", NULL, "DMIC Select" }, }; -static int adau1781_set_bias_level(struct snd_soc_codec *codec, +static int adau1781_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct adau *adau = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -380,14 +380,14 @@ static int adau1781_set_input_mode(struct adau *adau, unsigned int reg, ADAU1781_INPUT_DIFFERNTIAL, val); } -static int adau1781_codec_probe(struct snd_soc_codec *codec) +static int adau1781_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau1781_platform_data *pdata = dev_get_platdata(codec->dev); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau1781_platform_data *pdata = dev_get_platdata(component->dev); + struct adau *adau = snd_soc_component_get_drvdata(component); int ret; - ret = adau17x1_add_widgets(codec); + ret = adau17x1_add_widgets(component); if (ret) return ret; @@ -419,27 +419,28 @@ static int adau1781_codec_probe(struct snd_soc_codec *codec) return ret; } - ret = adau17x1_add_routes(codec); + ret = adau17x1_add_routes(component); if (ret < 0) return ret; return 0; } -static const struct snd_soc_codec_driver adau1781_codec_driver = { - .probe = adau1781_codec_probe, - .resume = adau17x1_resume, - .set_bias_level = adau1781_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = adau1781_controls, - .num_controls = ARRAY_SIZE(adau1781_controls), - .dapm_widgets = adau1781_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau1781_dapm_widgets), - .dapm_routes = adau1781_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adau1781_dapm_routes), - }, +static const struct snd_soc_component_driver adau1781_component_driver = { + .probe = adau1781_component_probe, + .resume = adau17x1_resume, + .set_bias_level = adau1781_set_bias_level, + .controls = adau1781_controls, + .num_controls = ARRAY_SIZE(adau1781_controls), + .dapm_widgets = adau1781_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau1781_dapm_widgets), + .dapm_routes = adau1781_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adau1781_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; #define ADAU1781_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \ @@ -498,7 +499,7 @@ int adau1781_probe(struct device *dev, struct regmap *regmap, if (ret) return ret; - return snd_soc_register_codec(dev, &adau1781_codec_driver, + return devm_snd_soc_register_component(dev, &adau1781_component_driver, &adau1781_dai_driver, 1); } EXPORT_SYMBOL_GPL(adau1781_probe); diff --git a/sound/soc/codecs/adau17x1.c b/sound/soc/codecs/adau17x1.c index 6758f789b712..80c2a06285bb 100644 --- a/sound/soc/codecs/adau17x1.c +++ b/sound/soc/codecs/adau17x1.c @@ -63,8 +63,8 @@ static const struct snd_kcontrol_new adau17x1_controls[] = { static int adau17x1_pll_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct adau *adau = snd_soc_component_get_drvdata(component); if (SND_SOC_DAPM_EVENT_ON(event)) { adau->pll_regs[5] = 1; @@ -93,8 +93,8 @@ static int adau17x1_pll_event(struct snd_soc_dapm_widget *w, static int adau17x1_adc_fixup(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct adau *adau = snd_soc_component_get_drvdata(component); /* * If we are capturing, toggle the ADOSR bit in Converter Control 0 to @@ -177,11 +177,11 @@ static const struct snd_soc_dapm_route adau17x1_dapm_pll_route = { static int adau17x1_dsp_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau *adau = snd_soc_component_get_drvdata(component); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct snd_soc_dapm_update update = { 0 }; + struct snd_soc_dapm_update update = {}; unsigned int stream = e->shift_l; unsigned int val, change; int reg; @@ -205,7 +205,7 @@ static int adau17x1_dsp_mux_enum_put(struct snd_kcontrol *kcontrol, else reg = ADAU17X1_SERIAL_OUTPUT_ROUTE; - change = snd_soc_test_bits(codec, reg, 0xff, val); + change = snd_soc_component_test_bits(component, reg, 0xff, val); if (change) { update.kcontrol = kcontrol; update.mask = 0xff; @@ -222,8 +222,8 @@ static int adau17x1_dsp_mux_enum_put(struct snd_kcontrol *kcontrol, static int adau17x1_dsp_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct adau *adau = snd_soc_component_get_drvdata(component); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int stream = e->shift_l; unsigned int reg, val; @@ -328,8 +328,8 @@ EXPORT_SYMBOL_GPL(adau17x1_has_dsp); static int adau17x1_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau *adau = snd_soc_component_get_drvdata(component); int ret; if (freq_in < 8000000 || freq_in > 27000000) @@ -353,8 +353,8 @@ static int adau17x1_set_dai_pll(struct snd_soc_dai *dai, int pll_id, static int adau17x1_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(dai->codec); - struct adau *adau = snd_soc_codec_get_drvdata(dai->codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(dai->component); + struct adau *adau = snd_soc_component_get_drvdata(dai->component); bool is_pll; bool was_pll; @@ -438,8 +438,8 @@ static int adau17x1_auto_pll(struct snd_soc_dai *dai, static int adau17x1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau *adau = snd_soc_component_get_drvdata(component); unsigned int val, div, dsp_div; unsigned int freq; int ret; @@ -531,7 +531,7 @@ static int adau17x1_hw_params(struct snd_pcm_substream *substream, static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct adau *adau = snd_soc_codec_get_drvdata(dai->codec); + struct adau *adau = snd_soc_component_get_drvdata(dai->component); unsigned int ctrl0, ctrl1; int lrclk_pol; @@ -603,7 +603,7 @@ static int adau17x1_set_dai_fmt(struct snd_soc_dai *dai, static int adau17x1_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct adau *adau = snd_soc_codec_get_drvdata(dai->codec); + struct adau *adau = snd_soc_component_get_drvdata(dai->component); unsigned int ser_ctrl0, ser_ctrl1; unsigned int conv_ctrl0, conv_ctrl1; @@ -728,7 +728,7 @@ static int adau17x1_set_dai_tdm_slot(struct snd_soc_dai *dai, static int adau17x1_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct adau *adau = snd_soc_codec_get_drvdata(dai->codec); + struct adau *adau = snd_soc_component_get_drvdata(dai->component); if (adau->sigmadsp) return sigmadsp_restrict_params(adau->sigmadsp, substream); @@ -746,10 +746,10 @@ const struct snd_soc_dai_ops adau17x1_dai_ops = { }; EXPORT_SYMBOL_GPL(adau17x1_dai_ops); -int adau17x1_set_micbias_voltage(struct snd_soc_codec *codec, +int adau17x1_set_micbias_voltage(struct snd_soc_component *component, enum adau17x1_micbias_voltage micbias) { - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct adau *adau = snd_soc_component_get_drvdata(component); switch (micbias) { case ADAU17X1_MICBIAS_0_90_AVDD: @@ -858,13 +858,13 @@ int adau17x1_setup_firmware(struct adau *adau, unsigned int rate) } EXPORT_SYMBOL_GPL(adau17x1_setup_firmware); -int adau17x1_add_widgets(struct snd_soc_codec *codec) +int adau17x1_add_widgets(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau *adau = snd_soc_component_get_drvdata(component); int ret; - ret = snd_soc_add_codec_controls(codec, adau17x1_controls, + ret = snd_soc_add_component_controls(component, adau17x1_controls, ARRAY_SIZE(adau17x1_controls)); if (ret) return ret; @@ -882,9 +882,9 @@ int adau17x1_add_widgets(struct snd_soc_codec *codec) if (!adau->sigmadsp) return 0; - ret = sigmadsp_attach(adau->sigmadsp, &codec->component); + ret = sigmadsp_attach(adau->sigmadsp, component); if (ret) { - dev_err(codec->dev, "Failed to attach firmware: %d\n", + dev_err(component->dev, "Failed to attach firmware: %d\n", ret); return ret; } @@ -894,10 +894,10 @@ int adau17x1_add_widgets(struct snd_soc_codec *codec) } EXPORT_SYMBOL_GPL(adau17x1_add_widgets); -int adau17x1_add_routes(struct snd_soc_codec *codec) +int adau17x1_add_routes(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau *adau = snd_soc_component_get_drvdata(component); int ret; ret = snd_soc_dapm_add_routes(dapm, adau17x1_dapm_routes, @@ -920,12 +920,12 @@ int adau17x1_add_routes(struct snd_soc_codec *codec) } EXPORT_SYMBOL_GPL(adau17x1_add_routes); -int adau17x1_resume(struct snd_soc_codec *codec) +int adau17x1_resume(struct snd_soc_component *component) { - struct adau *adau = snd_soc_codec_get_drvdata(codec); + struct adau *adau = snd_soc_component_get_drvdata(component); if (adau->switch_mode) - adau->switch_mode(codec->dev); + adau->switch_mode(component->dev); regcache_sync(adau->regmap); @@ -998,7 +998,6 @@ void adau17x1_remove(struct device *dev) { struct adau *adau = dev_get_drvdata(dev); - snd_soc_unregister_codec(dev); if (adau->mclk) clk_disable_unprepare(adau->mclk); } diff --git a/sound/soc/codecs/adau17x1.h b/sound/soc/codecs/adau17x1.h index eaf8f933bab8..a7b1cb770814 100644 --- a/sound/soc/codecs/adau17x1.h +++ b/sound/soc/codecs/adau17x1.h @@ -53,18 +53,18 @@ struct adau { struct sigmadsp *sigmadsp; }; -int adau17x1_add_widgets(struct snd_soc_codec *codec); -int adau17x1_add_routes(struct snd_soc_codec *codec); +int adau17x1_add_widgets(struct snd_soc_component *component); +int adau17x1_add_routes(struct snd_soc_component *component); int adau17x1_probe(struct device *dev, struct regmap *regmap, enum adau17x1_type type, void (*switch_mode)(struct device *dev), const char *firmware_name); void adau17x1_remove(struct device *dev); -int adau17x1_set_micbias_voltage(struct snd_soc_codec *codec, +int adau17x1_set_micbias_voltage(struct snd_soc_component *component, enum adau17x1_micbias_voltage micbias); bool adau17x1_readable_register(struct device *dev, unsigned int reg); bool adau17x1_volatile_register(struct device *dev, unsigned int reg); bool adau17x1_precious_register(struct device *dev, unsigned int reg); -int adau17x1_resume(struct snd_soc_codec *codec); +int adau17x1_resume(struct snd_soc_component *component); extern const struct snd_soc_dai_ops adau17x1_dai_ops; diff --git a/sound/soc/codecs/adau1977-i2c.c b/sound/soc/codecs/adau1977-i2c.c index 21e7394a972a..e7fe1ee5cdeb 100644 --- a/sound/soc/codecs/adau1977-i2c.c +++ b/sound/soc/codecs/adau1977-i2c.c @@ -29,12 +29,6 @@ static int adau1977_i2c_probe(struct i2c_client *client, id->driver_data, NULL); } -static int adau1977_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id adau1977_i2c_ids[] = { { "adau1977", ADAU1977 }, { "adau1978", ADAU1978 }, @@ -48,7 +42,6 @@ static struct i2c_driver adau1977_i2c_driver = { .name = "adau1977", }, .probe = adau1977_i2c_probe, - .remove = adau1977_i2c_remove, .id_table = adau1977_i2c_ids, }; module_i2c_driver(adau1977_i2c_driver); diff --git a/sound/soc/codecs/adau1977-spi.c b/sound/soc/codecs/adau1977-spi.c index 0b46d88b481c..84ffbde9583f 100644 --- a/sound/soc/codecs/adau1977-spi.c +++ b/sound/soc/codecs/adau1977-spi.c @@ -46,12 +46,6 @@ static int adau1977_spi_probe(struct spi_device *spi) id->driver_data, adau1977_spi_switch_mode); } -static int adau1977_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static const struct spi_device_id adau1977_spi_ids[] = { { "adau1977", ADAU1977 }, { "adau1978", ADAU1978 }, @@ -65,7 +59,6 @@ static struct spi_driver adau1977_spi_driver = { .name = "adau1977", }, .probe = adau1977_spi_probe, - .remove = adau1977_spi_remove, .id_table = adau1977_spi_ids, }; module_spi_driver(adau1977_spi_driver); diff --git a/sound/soc/codecs/adau1977.c b/sound/soc/codecs/adau1977.c index e384f212beb2..116af6a9ce3b 100644 --- a/sound/soc/codecs/adau1977.c +++ b/sound/soc/codecs/adau1977.c @@ -294,8 +294,8 @@ static int adau1977_lookup_mcs(struct adau1977 *adau1977, unsigned int rate, static int adau1977_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); unsigned int slot_width; unsigned int ctrl0, ctrl0_mask; @@ -471,10 +471,10 @@ err_disable_avdd: return ret; } -static int adau1977_set_bias_level(struct snd_soc_codec *codec, +static int adau1977_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component); int ret = 0; switch (level) { @@ -483,7 +483,7 @@ static int adau1977_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) ret = adau1977_power_enable(adau1977); break; case SND_SOC_BIAS_OFF: @@ -497,7 +497,7 @@ static int adau1977_set_bias_level(struct snd_soc_codec *codec, static int adau1977_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int width) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component); unsigned int ctrl0, ctrl1, drv; unsigned int slot[4]; unsigned int i; @@ -603,7 +603,7 @@ static int adau1977_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int adau1977_mute(struct snd_soc_dai *dai, int mute, int stream) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component); unsigned int val; if (mute) @@ -617,7 +617,7 @@ static int adau1977_mute(struct snd_soc_dai *dai, int mute, int stream) static int adau1977_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component); unsigned int ctrl0 = 0, ctrl1 = 0, block_power = 0; bool invert_lrclk; int ret; @@ -704,7 +704,7 @@ static int adau1977_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int adau1977_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component); u64 formats = 0; if (adau1977->slot_width == 16) @@ -729,7 +729,7 @@ static int adau1977_startup(struct snd_pcm_substream *substream, static int adau1977_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(dai->codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component); unsigned int val; if (tristate) @@ -790,10 +790,10 @@ static bool adau1977_check_sysclk(unsigned int mclk, unsigned int base_freq) return true; } -static int adau1977_set_sysclk(struct snd_soc_codec *codec, +static int adau1977_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(codec); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component); unsigned int mask = 0; unsigned int clk_src; unsigned int ret; @@ -844,10 +844,10 @@ static int adau1977_set_sysclk(struct snd_soc_codec *codec, return 0; } -static int adau1977_codec_probe(struct snd_soc_codec *codec) +static int adau1977_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adau1977 *adau1977 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component); int ret; switch (adau1977->type) { @@ -865,20 +865,19 @@ static int adau1977_codec_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver adau1977_codec_driver = { - .probe = adau1977_codec_probe, - .set_bias_level = adau1977_set_bias_level, - .set_sysclk = adau1977_set_sysclk, - .idle_bias_off = true, - - .component_driver = { - .controls = adau1977_snd_controls, - .num_controls = ARRAY_SIZE(adau1977_snd_controls), - .dapm_widgets = adau1977_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau1977_dapm_widgets), - .dapm_routes = adau1977_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adau1977_dapm_routes), - }, +static const struct snd_soc_component_driver adau1977_component_driver = { + .probe = adau1977_component_probe, + .set_bias_level = adau1977_set_bias_level, + .set_sysclk = adau1977_set_sysclk, + .controls = adau1977_snd_controls, + .num_controls = ARRAY_SIZE(adau1977_snd_controls), + .dapm_widgets = adau1977_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau1977_dapm_widgets), + .dapm_routes = adau1977_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adau1977_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int adau1977_setup_micbias(struct adau1977 *adau1977) @@ -968,7 +967,7 @@ int adau1977_probe(struct device *dev, struct regmap *regmap, if (ret) return ret; - return snd_soc_register_codec(dev, &adau1977_codec_driver, + return devm_snd_soc_register_component(dev, &adau1977_component_driver, &adau1977_dai, 1); err_poweroff: diff --git a/sound/soc/codecs/adau7002.c b/sound/soc/codecs/adau7002.c index 6384c5491de8..fdff86878287 100644 --- a/sound/soc/codecs/adau7002.c +++ b/sound/soc/codecs/adau7002.c @@ -7,6 +7,7 @@ * Licensed under the GPL-2. */ +#include <linux/acpi.h> #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> @@ -38,24 +39,26 @@ static struct snd_soc_dai_driver adau7002_dai = { }, }; -static const struct snd_soc_codec_driver adau7002_codec_driver = { - .component_driver = { - .dapm_widgets = adau7002_widgets, - .num_dapm_widgets = ARRAY_SIZE(adau7002_widgets), - .dapm_routes = adau7002_routes, - .num_dapm_routes = ARRAY_SIZE(adau7002_routes), - }, +static const struct snd_soc_component_driver adau7002_component_driver = { + .dapm_widgets = adau7002_widgets, + .num_dapm_widgets = ARRAY_SIZE(adau7002_widgets), + .dapm_routes = adau7002_routes, + .num_dapm_routes = ARRAY_SIZE(adau7002_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int adau7002_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &adau7002_codec_driver, + return devm_snd_soc_register_component(&pdev->dev, + &adau7002_component_driver, &adau7002_dai, 1); } static int adau7002_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } @@ -67,10 +70,19 @@ static const struct of_device_id adau7002_dt_ids[] = { MODULE_DEVICE_TABLE(of, adau7002_dt_ids); #endif +#ifdef CONFIG_ACPI +static const struct acpi_device_id adau7002_acpi_match[] = { + { "ADAU7002", 0 }, + {}, +}; +MODULE_DEVICE_TABLE(acpi, adau7002_acpi_match); +#endif + static struct platform_driver adau7002_driver = { .driver = { .name = "adau7002", .of_match_table = of_match_ptr(adau7002_dt_ids), + .acpi_match_table = ACPI_PTR(adau7002_acpi_match), }, .probe = adau7002_probe, .remove = adau7002_remove, diff --git a/sound/soc/codecs/adav801.c b/sound/soc/codecs/adav801.c index 055f1228c2b4..d82f79dd1b38 100644 --- a/sound/soc/codecs/adav801.c +++ b/sound/soc/codecs/adav801.c @@ -30,18 +30,11 @@ static int adav80x_spi_probe(struct spi_device *spi) return adav80x_bus_probe(&spi->dev, devm_regmap_init_spi(spi, &config)); } -static int adav80x_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver adav80x_spi_driver = { .driver = { .name = "adav801", }, .probe = adav80x_spi_probe, - .remove = adav80x_spi_remove, .id_table = adav80x_spi_id, }; module_spi_driver(adav80x_spi_driver); diff --git a/sound/soc/codecs/adav803.c b/sound/soc/codecs/adav803.c index 52881faedcf6..deb14bc0f1f7 100644 --- a/sound/soc/codecs/adav803.c +++ b/sound/soc/codecs/adav803.c @@ -27,18 +27,11 @@ static int adav803_probe(struct i2c_client *client, devm_regmap_init_i2c(client, &adav80x_regmap_config)); } -static int adav803_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static struct i2c_driver adav803_driver = { .driver = { .name = "adav803", }, .probe = adav803_probe, - .remove = adav803_remove, .id_table = adav803_id, }; module_i2c_driver(adav803_driver); diff --git a/sound/soc/codecs/adav80x.c b/sound/soc/codecs/adav80x.c index da7ca81f47cf..db21ecbe0762 100644 --- a/sound/soc/codecs/adav80x.c +++ b/sound/soc/codecs/adav80x.c @@ -212,8 +212,8 @@ static const struct snd_soc_dapm_widget adav80x_dapm_widgets[] = { static int adav80x_dapm_sysclk_check(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); const char *clk; switch (adav80x->clk_src) { @@ -236,8 +236,8 @@ static int adav80x_dapm_sysclk_check(struct snd_soc_dapm_widget *source, static int adav80x_dapm_pll_check(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); return adav80x->pll_src == ADAV80X_PLL_SRC_XTAL; } @@ -281,9 +281,9 @@ static const struct snd_soc_dapm_route adav80x_dapm_routes[] = { { "AIFAUXIN", NULL, "SYSCLK" }, }; -static int adav80x_set_deemph(struct snd_soc_codec *codec) +static int adav80x_set_deemph(struct snd_soc_component *component) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int val; if (adav80x->deemph) { @@ -315,8 +315,8 @@ static int adav80x_set_deemph(struct snd_soc_codec *codec) static int adav80x_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int deemph = ucontrol->value.integer.value[0]; if (deemph > 1) @@ -324,14 +324,14 @@ static int adav80x_put_deemph(struct snd_kcontrol *kcontrol, adav80x->deemph = deemph; - return adav80x_set_deemph(codec); + return adav80x_set_deemph(component); } static int adav80x_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = adav80x->deemph; return 0; @@ -365,8 +365,8 @@ static unsigned int adav80x_port_ctrl_regs[2][2] = { static int adav80x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int capture = 0x00; unsigned int playback = 0x00; @@ -415,10 +415,10 @@ static int adav80x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) return 0; } -static int adav80x_set_adc_clock(struct snd_soc_codec *codec, +static int adav80x_set_adc_clock(struct snd_soc_component *component, unsigned int sample_rate) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int val; if (sample_rate <= 48000) @@ -432,10 +432,10 @@ static int adav80x_set_adc_clock(struct snd_soc_codec *codec, return 0; } -static int adav80x_set_dac_clock(struct snd_soc_codec *codec, +static int adav80x_set_dac_clock(struct snd_soc_component *component, unsigned int sample_rate) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int val; if (sample_rate <= 48000) @@ -450,10 +450,10 @@ static int adav80x_set_dac_clock(struct snd_soc_codec *codec, return 0; } -static int adav80x_set_capture_pcm_format(struct snd_soc_codec *codec, +static int adav80x_set_capture_pcm_format(struct snd_soc_component *component, struct snd_soc_dai *dai, struct snd_pcm_hw_params *params) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int val; switch (params_width(params)) { @@ -479,10 +479,10 @@ static int adav80x_set_capture_pcm_format(struct snd_soc_codec *codec, return 0; } -static int adav80x_set_playback_pcm_format(struct snd_soc_codec *codec, +static int adav80x_set_playback_pcm_format(struct snd_soc_component *component, struct snd_soc_dai *dai, struct snd_pcm_hw_params *params) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int val; if (adav80x->dai_fmt[dai->id] != SND_SOC_DAIFMT_RIGHT_J) @@ -514,32 +514,32 @@ static int adav80x_set_playback_pcm_format(struct snd_soc_codec *codec, static int adav80x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); if (rate * 256 != adav80x->sysclk) return -EINVAL; if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - adav80x_set_playback_pcm_format(codec, dai, params); - adav80x_set_dac_clock(codec, rate); + adav80x_set_playback_pcm_format(component, dai, params); + adav80x_set_dac_clock(component, rate); } else { - adav80x_set_capture_pcm_format(codec, dai, params); - adav80x_set_adc_clock(codec, rate); + adav80x_set_capture_pcm_format(component, dai, params); + adav80x_set_adc_clock(component, rate); } adav80x->rate = rate; - adav80x_set_deemph(codec); + adav80x_set_deemph(component); return 0; } -static int adav80x_set_sysclk(struct snd_soc_codec *codec, +static int adav80x_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (dir == SND_SOC_CLOCK_IN) { switch (clk_id) { @@ -619,11 +619,11 @@ static int adav80x_set_sysclk(struct snd_soc_codec *codec, return 0; } -static int adav80x_set_pll(struct snd_soc_codec *codec, int pll_id, +static int adav80x_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int pll_ctrl1 = 0; unsigned int pll_ctrl2 = 0; unsigned int pll_src; @@ -694,10 +694,10 @@ static int adav80x_set_pll(struct snd_soc_codec *codec, int pll_id, return 0; } -static int adav80x_set_bias_level(struct snd_soc_codec *codec, +static int adav80x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); unsigned int mask = ADAV80X_DAC_CTRL1_PD; switch (level) { @@ -722,10 +722,10 @@ static int adav80x_set_bias_level(struct snd_soc_codec *codec, static int adav80x_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); - if (!snd_soc_codec_is_active(codec) || !adav80x->rate) + if (!snd_soc_component_is_active(component) || !adav80x->rate) return 0; return snd_pcm_hw_constraint_single(substream->runtime, @@ -735,10 +735,10 @@ static int adav80x_dai_startup(struct snd_pcm_substream *substream, static void adav80x_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); - if (!snd_soc_codec_is_active(codec)) + if (!snd_soc_component_is_active(component)) adav80x->rate = 0; } @@ -799,10 +799,10 @@ static struct snd_soc_dai_driver adav80x_dais[] = { }, }; -static int adav80x_probe(struct snd_soc_codec *codec) +static int adav80x_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); /* Force PLLs on for SYSCLK output */ snd_soc_dapm_force_enable_pin(dapm, "PLL1"); @@ -816,32 +816,32 @@ static int adav80x_probe(struct snd_soc_codec *codec) return 0; } -static int adav80x_resume(struct snd_soc_codec *codec) +static int adav80x_resume(struct snd_soc_component *component) { - struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); + struct adav80x *adav80x = snd_soc_component_get_drvdata(component); regcache_sync(adav80x->regmap); return 0; } -static const struct snd_soc_codec_driver adav80x_codec_driver = { - .probe = adav80x_probe, - .resume = adav80x_resume, - .set_bias_level = adav80x_set_bias_level, - .suspend_bias_off = true, - - .set_pll = adav80x_set_pll, - .set_sysclk = adav80x_set_sysclk, - - .component_driver = { - .controls = adav80x_controls, - .num_controls = ARRAY_SIZE(adav80x_controls), - .dapm_widgets = adav80x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(adav80x_dapm_widgets), - .dapm_routes = adav80x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(adav80x_dapm_routes), - }, +static const struct snd_soc_component_driver adav80x_component_driver = { + .probe = adav80x_probe, + .resume = adav80x_resume, + .set_bias_level = adav80x_set_bias_level, + .set_pll = adav80x_set_pll, + .set_sysclk = adav80x_set_sysclk, + .controls = adav80x_controls, + .num_controls = ARRAY_SIZE(adav80x_controls), + .dapm_widgets = adav80x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(adav80x_dapm_widgets), + .dapm_routes = adav80x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(adav80x_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; int adav80x_bus_probe(struct device *dev, struct regmap *regmap) @@ -858,7 +858,7 @@ int adav80x_bus_probe(struct device *dev, struct regmap *regmap) dev_set_drvdata(dev, adav80x); adav80x->regmap = regmap; - return snd_soc_register_codec(dev, &adav80x_codec_driver, + return devm_snd_soc_register_component(dev, &adav80x_component_driver, adav80x_dais, ARRAY_SIZE(adav80x_dais)); } EXPORT_SYMBOL_GPL(adav80x_bus_probe); diff --git a/sound/soc/codecs/ads117x.c b/sound/soc/codecs/ads117x.c index b7f0057c0239..bcd45ff5db0c 100644 --- a/sound/soc/codecs/ads117x.c +++ b/sound/soc/codecs/ads117x.c @@ -58,25 +58,21 @@ static struct snd_soc_dai_driver ads117x_dai = { .formats = ADS117X_FORMATS,}, }; -static const struct snd_soc_codec_driver soc_codec_dev_ads117x = { - .component_driver = { - .dapm_widgets = ads117x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ads117x_dapm_widgets), - .dapm_routes = ads117x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ads117x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ads117x = { + .dapm_widgets = ads117x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ads117x_dapm_widgets), + .dapm_routes = ads117x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ads117x_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ads117x_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_ads117x, &ads117x_dai, 1); -} - -static int ads117x_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_ads117x, &ads117x_dai, 1); } #if defined(CONFIG_OF) @@ -95,7 +91,6 @@ static struct platform_driver ads117x_codec_driver = { }, .probe = ads117x_probe, - .remove = ads117x_remove, }; module_platform_driver(ads117x_codec_driver); diff --git a/sound/soc/codecs/ak4104.c b/sound/soc/codecs/ak4104.c index dbb184118f2e..32bc545c19cf 100644 --- a/sound/soc/codecs/ak4104.c +++ b/sound/soc/codecs/ak4104.c @@ -65,8 +65,8 @@ static const struct snd_soc_dapm_route ak4104_dapm_routes[] = { static int ak4104_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ak4104_private *ak4104 = snd_soc_component_get_drvdata(component); int val = 0; int ret; @@ -81,7 +81,7 @@ static int ak4104_set_dai_fmt(struct snd_soc_dai *codec_dai, val |= AK4104_CONTROL1_DIF0 | AK4104_CONTROL1_DIF1; break; default: - dev_err(codec->dev, "invalid dai format\n"); + dev_err(component->dev, "invalid dai format\n"); return -EINVAL; } @@ -102,8 +102,8 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4104_private *ak4104 = snd_soc_component_get_drvdata(component); int ret, val = 0; /* set the IEC958 bits: consumer mode, no copyright bit */ @@ -141,7 +141,7 @@ static int ak4104_hw_params(struct snd_pcm_substream *substream, val |= IEC958_AES3_CON_FS_192000; break; default: - dev_err(codec->dev, "unsupported sampling rate\n"); + dev_err(component->dev, "unsupported sampling rate\n"); return -EINVAL; } @@ -174,14 +174,14 @@ static struct snd_soc_dai_driver ak4104_dai = { .ops = &ak4101_dai_ops, }; -static int ak4104_probe(struct snd_soc_codec *codec) +static int ak4104_probe(struct snd_soc_component *component) { - struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec); + struct ak4104_private *ak4104 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_enable(ak4104->regulator); if (ret < 0) { - dev_err(codec->dev, "Unable to enable regulator: %d\n", ret); + dev_err(component->dev, "Unable to enable regulator: %d\n", ret); return ret; } @@ -205,30 +205,28 @@ exit_disable_regulator: return ret; } -static int ak4104_remove(struct snd_soc_codec *codec) +static void ak4104_remove(struct snd_soc_component *component) { - struct ak4104_private *ak4104 = snd_soc_codec_get_drvdata(codec); + struct ak4104_private *ak4104 = snd_soc_component_get_drvdata(component); regmap_update_bits(ak4104->regmap, AK4104_REG_CONTROL1, AK4104_CONTROL1_PW | AK4104_CONTROL1_RSTN, 0); regulator_disable(ak4104->regulator); - - return 0; } #ifdef CONFIG_PM -static int ak4104_soc_suspend(struct snd_soc_codec *codec) +static int ak4104_soc_suspend(struct snd_soc_component *component) { - struct ak4104_private *priv = snd_soc_codec_get_drvdata(codec); + struct ak4104_private *priv = snd_soc_component_get_drvdata(component); regulator_disable(priv->regulator); return 0; } -static int ak4104_soc_resume(struct snd_soc_codec *codec) +static int ak4104_soc_resume(struct snd_soc_component *component) { - struct ak4104_private *priv = snd_soc_codec_get_drvdata(codec); + struct ak4104_private *priv = snd_soc_component_get_drvdata(component); int ret; ret = regulator_enable(priv->regulator); @@ -242,18 +240,19 @@ static int ak4104_soc_resume(struct snd_soc_codec *codec) #define ak4104_soc_resume NULL #endif /* CONFIG_PM */ -static const struct snd_soc_codec_driver soc_codec_device_ak4104 = { - .probe = ak4104_probe, - .remove = ak4104_remove, - .suspend = ak4104_soc_suspend, - .resume = ak4104_soc_resume, - - .component_driver = { - .dapm_widgets = ak4104_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4104_dapm_widgets), - .dapm_routes = ak4104_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ak4104_dapm_routes), - } +static const struct snd_soc_component_driver soc_component_device_ak4104 = { + .probe = ak4104_probe, + .remove = ak4104_remove, + .suspend = ak4104_soc_suspend, + .resume = ak4104_soc_resume, + .dapm_widgets = ak4104_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4104_dapm_widgets), + .dapm_routes = ak4104_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ak4104_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ak4104_regmap = { @@ -323,17 +322,11 @@ static int ak4104_spi_probe(struct spi_device *spi) spi_set_drvdata(spi, ak4104); - ret = snd_soc_register_codec(&spi->dev, - &soc_codec_device_ak4104, &ak4104_dai, 1); + ret = devm_snd_soc_register_component(&spi->dev, + &soc_component_device_ak4104, &ak4104_dai, 1); return ret; } -static int ak4104_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static const struct of_device_id ak4104_of_match[] = { { .compatible = "asahi-kasei,ak4104", }, { } @@ -353,7 +346,6 @@ static struct spi_driver ak4104_spi_driver = { }, .id_table = ak4104_id_table, .probe = ak4104_spi_probe, - .remove = ak4104_spi_remove, }; module_spi_driver(ak4104_spi_driver); diff --git a/sound/soc/codecs/ak4458.c b/sound/soc/codecs/ak4458.c new file mode 100644 index 000000000000..31ec0ba2e639 --- /dev/null +++ b/sound/soc/codecs/ak4458.c @@ -0,0 +1,657 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Audio driver for AK4458 DAC +// +// Copyright (C) 2016 Asahi Kasei Microdevices Corporation +// Copyright 2018 NXP + +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/of_device.h> +#include <linux/of_gpio.h> +#include <linux/pm_runtime.h> +#include <linux/slab.h> +#include <sound/initval.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#include <sound/tlv.h> + +#include "ak4458.h" + +/* AK4458 Codec Private Data */ +struct ak4458_priv { + struct device *dev; + struct regmap *regmap; + struct gpio_desc *reset_gpiod; + struct gpio_desc *mute_gpiod; + int digfil; /* SSLOW, SD, SLOW bits */ + int fs; /* sampling rate */ + int fmt; + int slots; + int slot_width; +}; + +static const struct reg_default ak4458_reg_defaults[] = { + { 0x00, 0x0C }, /* 0x00 AK4458_00_CONTROL1 */ + { 0x01, 0x22 }, /* 0x01 AK4458_01_CONTROL2 */ + { 0x02, 0x00 }, /* 0x02 AK4458_02_CONTROL3 */ + { 0x03, 0xFF }, /* 0x03 AK4458_03_LCHATT */ + { 0x04, 0xFF }, /* 0x04 AK4458_04_RCHATT */ + { 0x05, 0x00 }, /* 0x05 AK4458_05_CONTROL4 */ + { 0x06, 0x00 }, /* 0x06 AK4458_06_DSD1 */ + { 0x07, 0x03 }, /* 0x07 AK4458_07_CONTROL5 */ + { 0x08, 0x00 }, /* 0x08 AK4458_08_SOUND_CONTROL */ + { 0x09, 0x00 }, /* 0x09 AK4458_09_DSD2 */ + { 0x0A, 0x0D }, /* 0x0A AK4458_0A_CONTROL6 */ + { 0x0B, 0x0C }, /* 0x0B AK4458_0B_CONTROL7 */ + { 0x0C, 0x00 }, /* 0x0C AK4458_0C_CONTROL8 */ + { 0x0D, 0x00 }, /* 0x0D AK4458_0D_CONTROL9 */ + { 0x0E, 0x50 }, /* 0x0E AK4458_0E_CONTROL10 */ + { 0x0F, 0xFF }, /* 0x0F AK4458_0F_L2CHATT */ + { 0x10, 0xFF }, /* 0x10 AK4458_10_R2CHATT */ + { 0x11, 0xFF }, /* 0x11 AK4458_11_L3CHATT */ + { 0x12, 0xFF }, /* 0x12 AK4458_12_R3CHATT */ + { 0x13, 0xFF }, /* 0x13 AK4458_13_L4CHATT */ + { 0x14, 0xFF }, /* 0x14 AK4458_14_R4CHATT */ +}; + +/* + * Volume control: + * from -127 to 0 dB in 0.5 dB steps (mute instead of -127.5 dB) + */ +static DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1); + +/* + * DEM1 bit DEM0 bit Mode + * 0 0 44.1kHz + * 0 1 OFF (default) + * 1 0 48kHz + * 1 1 32kHz + */ +static const char * const ak4458_dem_select_texts[] = { + "44.1kHz", "OFF", "48kHz", "32kHz" +}; + +/* + * SSLOW, SD, SLOW bits Digital Filter Setting + * 0, 0, 0 : Sharp Roll-Off Filter + * 0, 0, 1 : Slow Roll-Off Filter + * 0, 1, 0 : Short delay Sharp Roll-Off Filter + * 0, 1, 1 : Short delay Slow Roll-Off Filter + * 1, *, * : Super Slow Roll-Off Filter + */ +static const char * const ak4458_digfil_select_texts[] = { + "Sharp Roll-Off Filter", + "Slow Roll-Off Filter", + "Short delay Sharp Roll-Off Filter", + "Short delay Slow Roll-Off Filter", + "Super Slow Roll-Off Filter" +}; + +/* + * DZFB: Inverting Enable of DZF + * 0: DZF goes H at Zero Detection + * 1: DZF goes L at Zero Detection + */ +static const char * const ak4458_dzfb_select_texts[] = {"H", "L"}; + +/* + * SC1-0 bits: Sound Mode Setting + * 0 0 : Sound Mode 0 + * 0 1 : Sound Mode 1 + * 1 0 : Sound Mode 2 + * 1 1 : Reserved + */ +static const char * const ak4458_sc_select_texts[] = { + "Sound Mode 0", "Sound Mode 1", "Sound Mode 2" +}; + +/* FIR2-0 bits: FIR Filter Mode Setting */ +static const char * const ak4458_fir_select_texts[] = { + "Mode 0", "Mode 1", "Mode 2", "Mode 3", + "Mode 4", "Mode 5", "Mode 6", "Mode 7", +}; + +/* ATS1-0 bits Attenuation Speed */ +static const char * const ak4458_ats_select_texts[] = { + "4080/fs", "2040/fs", "510/fs", "255/fs", +}; + +/* DIF2 bit Audio Interface Format Setting(BICK fs) */ +static const char * const ak4458_dif_select_texts[] = {"32fs,48fs", "64fs",}; + +static const struct soc_enum ak4458_dac1_dem_enum = + SOC_ENUM_SINGLE(AK4458_01_CONTROL2, 1, + ARRAY_SIZE(ak4458_dem_select_texts), + ak4458_dem_select_texts); +static const struct soc_enum ak4458_dac2_dem_enum = + SOC_ENUM_SINGLE(AK4458_0A_CONTROL6, 0, + ARRAY_SIZE(ak4458_dem_select_texts), + ak4458_dem_select_texts); +static const struct soc_enum ak4458_dac3_dem_enum = + SOC_ENUM_SINGLE(AK4458_0E_CONTROL10, 4, + ARRAY_SIZE(ak4458_dem_select_texts), + ak4458_dem_select_texts); +static const struct soc_enum ak4458_dac4_dem_enum = + SOC_ENUM_SINGLE(AK4458_0E_CONTROL10, 6, + ARRAY_SIZE(ak4458_dem_select_texts), + ak4458_dem_select_texts); +static const struct soc_enum ak4458_digfil_enum = + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(ak4458_digfil_select_texts), + ak4458_digfil_select_texts); +static const struct soc_enum ak4458_dzfb_enum = + SOC_ENUM_SINGLE(AK4458_02_CONTROL3, 2, + ARRAY_SIZE(ak4458_dzfb_select_texts), + ak4458_dzfb_select_texts); +static const struct soc_enum ak4458_sm_enum = + SOC_ENUM_SINGLE(AK4458_08_SOUND_CONTROL, 0, + ARRAY_SIZE(ak4458_sc_select_texts), + ak4458_sc_select_texts); +static const struct soc_enum ak4458_fir_enum = + SOC_ENUM_SINGLE(AK4458_0C_CONTROL8, 0, + ARRAY_SIZE(ak4458_fir_select_texts), + ak4458_fir_select_texts); +static const struct soc_enum ak4458_ats_enum = + SOC_ENUM_SINGLE(AK4458_0B_CONTROL7, 6, + ARRAY_SIZE(ak4458_ats_select_texts), + ak4458_ats_select_texts); +static const struct soc_enum ak4458_dif_enum = + SOC_ENUM_SINGLE(AK4458_00_CONTROL1, 3, + ARRAY_SIZE(ak4458_dif_select_texts), + ak4458_dif_select_texts); + +static int get_digfil(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + + ucontrol->value.enumerated.item[0] = ak4458->digfil; + + return 0; +} + +static int set_digfil(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + int num; + + num = ucontrol->value.enumerated.item[0]; + if (num > 4) + return -EINVAL; + + ak4458->digfil = num; + + /* write SD bit */ + snd_soc_component_update_bits(component, AK4458_01_CONTROL2, + AK4458_SD_MASK, + ((ak4458->digfil & 0x02) << 4)); + + /* write SLOW bit */ + snd_soc_component_update_bits(component, AK4458_02_CONTROL3, + AK4458_SLOW_MASK, + (ak4458->digfil & 0x01)); + + /* write SSLOW bit */ + snd_soc_component_update_bits(component, AK4458_05_CONTROL4, + AK4458_SSLOW_MASK, + ((ak4458->digfil & 0x04) >> 2)); + + return 0; +} + +static const struct snd_kcontrol_new ak4458_snd_controls[] = { + SOC_DOUBLE_R_TLV("DAC1 Playback Volume", AK4458_03_LCHATT, + AK4458_04_RCHATT, 0, 0xFF, 0, dac_tlv), + SOC_DOUBLE_R_TLV("DAC2 Playback Volume", AK4458_0F_L2CHATT, + AK4458_10_R2CHATT, 0, 0xFF, 0, dac_tlv), + SOC_DOUBLE_R_TLV("DAC3 Playback Volume", AK4458_11_L3CHATT, + AK4458_12_R3CHATT, 0, 0xFF, 0, dac_tlv), + SOC_DOUBLE_R_TLV("DAC4 Playback Volume", AK4458_13_L4CHATT, + AK4458_14_R4CHATT, 0, 0xFF, 0, dac_tlv), + SOC_ENUM("AK4458 De-emphasis Response DAC1", ak4458_dac1_dem_enum), + SOC_ENUM("AK4458 De-emphasis Response DAC2", ak4458_dac2_dem_enum), + SOC_ENUM("AK4458 De-emphasis Response DAC3", ak4458_dac3_dem_enum), + SOC_ENUM("AK4458 De-emphasis Response DAC4", ak4458_dac4_dem_enum), + SOC_ENUM_EXT("AK4458 Digital Filter Setting", ak4458_digfil_enum, + get_digfil, set_digfil), + SOC_ENUM("AK4458 Inverting Enable of DZFB", ak4458_dzfb_enum), + SOC_ENUM("AK4458 Sound Mode", ak4458_sm_enum), + SOC_ENUM("AK4458 FIR Filter Mode Setting", ak4458_fir_enum), + SOC_ENUM("AK4458 Attenuation transition Time Setting", + ak4458_ats_enum), + SOC_ENUM("AK4458 BICK fs Setting", ak4458_dif_enum), +}; + +/* ak4458 dapm widgets */ +static const struct snd_soc_dapm_widget ak4458_dapm_widgets[] = { + SND_SOC_DAPM_DAC("AK4458 DAC1", NULL, AK4458_0A_CONTROL6, 2, 0),/*pw*/ + SND_SOC_DAPM_AIF_IN("AK4458 SDTI", "Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_OUTPUT("AK4458 AOUTA"), + + SND_SOC_DAPM_DAC("AK4458 DAC2", NULL, AK4458_0A_CONTROL6, 3, 0),/*pw*/ + SND_SOC_DAPM_OUTPUT("AK4458 AOUTB"), + + SND_SOC_DAPM_DAC("AK4458 DAC3", NULL, AK4458_0B_CONTROL7, 2, 0),/*pw*/ + SND_SOC_DAPM_OUTPUT("AK4458 AOUTC"), + + SND_SOC_DAPM_DAC("AK4458 DAC4", NULL, AK4458_0B_CONTROL7, 3, 0),/*pw*/ + SND_SOC_DAPM_OUTPUT("AK4458 AOUTD"), +}; + +static const struct snd_soc_dapm_route ak4458_intercon[] = { + {"AK4458 DAC1", NULL, "AK4458 SDTI"}, + {"AK4458 AOUTA", NULL, "AK4458 DAC1"}, + + {"AK4458 DAC2", NULL, "AK4458 SDTI"}, + {"AK4458 AOUTB", NULL, "AK4458 DAC2"}, + + {"AK4458 DAC3", NULL, "AK4458 SDTI"}, + {"AK4458 AOUTC", NULL, "AK4458 DAC3"}, + + {"AK4458 DAC4", NULL, "AK4458 SDTI"}, + {"AK4458 AOUTD", NULL, "AK4458 DAC4"}, +}; + +static int ak4458_rstn_control(struct snd_soc_component *component, int bit) +{ + int ret; + + if (bit) + ret = snd_soc_component_update_bits(component, + AK4458_00_CONTROL1, + AK4458_RSTN_MASK, + 0x1); + else + ret = snd_soc_component_update_bits(component, + AK4458_00_CONTROL1, + AK4458_RSTN_MASK, + 0x0); + return ret; +} + +static int ak4458_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + int pcm_width = max(params_physical_width(params), ak4458->slot_width); + int nfs1; + u8 format; + + nfs1 = params_rate(params); + ak4458->fs = nfs1; + + /* Master Clock Frequency Auto Setting Mode Enable */ + snd_soc_component_update_bits(component, AK4458_00_CONTROL1, 0x80, 0x80); + + switch (pcm_width) { + case 16: + if (ak4458->fmt == SND_SOC_DAIFMT_I2S) + format = AK4458_DIF_24BIT_I2S; + else + format = AK4458_DIF_16BIT_LSB; + break; + case 32: + switch (ak4458->fmt) { + case SND_SOC_DAIFMT_I2S: + format = AK4458_DIF_32BIT_I2S; + break; + case SND_SOC_DAIFMT_LEFT_J: + format = AK4458_DIF_32BIT_MSB; + break; + case SND_SOC_DAIFMT_RIGHT_J: + format = AK4458_DIF_32BIT_LSB; + break; + case SND_SOC_DAIFMT_DSP_B: + format = AK4458_DIF_32BIT_MSB; + break; + default: + return -EINVAL; + } + break; + default: + return -EINVAL; + } + + snd_soc_component_update_bits(component, AK4458_00_CONTROL1, + AK4458_DIF_MASK, format); + + ak4458_rstn_control(component, 0); + ak4458_rstn_control(component, 1); + + return 0; +} + +static int ak4458_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct snd_soc_component *component = dai->component; + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: /* Slave Mode */ + break; + case SND_SOC_DAIFMT_CBM_CFM: /* Master Mode is not supported */ + case SND_SOC_DAIFMT_CBS_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + default: + dev_err(component->dev, "Master mode unsupported\n"); + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + case SND_SOC_DAIFMT_LEFT_J: + case SND_SOC_DAIFMT_RIGHT_J: + case SND_SOC_DAIFMT_DSP_B: + ak4458->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; + break; + default: + dev_err(component->dev, "Audio format 0x%02X unsupported\n", + fmt & SND_SOC_DAIFMT_FORMAT_MASK); + return -EINVAL; + } + + ak4458_rstn_control(component, 0); + ak4458_rstn_control(component, 1); + + return 0; +} + +static const int att_speed[] = { 4080, 2040, 510, 255 }; + +static int ak4458_set_dai_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_component *component = dai->component; + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + int nfs, ndt, ret, reg; + int ats; + + nfs = ak4458->fs; + + reg = snd_soc_component_read32(component, AK4458_0B_CONTROL7); + ats = (reg & AK4458_ATS_MASK) >> AK4458_ATS_SHIFT; + + ndt = att_speed[ats] / (nfs / 1000); + + if (mute) { + ret = snd_soc_component_update_bits(component, AK4458_01_CONTROL2, 0x01, 1); + mdelay(ndt); + if (ak4458->mute_gpiod) + gpiod_set_value_cansleep(ak4458->mute_gpiod, 1); + } else { + if (ak4458->mute_gpiod) + gpiod_set_value_cansleep(ak4458->mute_gpiod, 0); + ret = snd_soc_component_update_bits(component, AK4458_01_CONTROL2, 0x01, 0); + mdelay(ndt); + } + + return 0; +} + +static int ak4458_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, + unsigned int rx_mask, int slots, int slot_width) +{ + struct snd_soc_component *component = dai->component; + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + int mode; + + ak4458->slots = slots; + ak4458->slot_width = slot_width; + + switch (slots * slot_width) { + case 128: + mode = AK4458_MODE_TDM128; + break; + case 256: + mode = AK4458_MODE_TDM256; + break; + case 512: + mode = AK4458_MODE_TDM512; + break; + default: + mode = AK4458_MODE_NORMAL; + break; + } + + snd_soc_component_update_bits(component, AK4458_0A_CONTROL6, + AK4458_MODE_MASK, + mode); + + return 0; +} + +#define AK4458_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ + SNDRV_PCM_FMTBIT_S24_LE |\ + SNDRV_PCM_FMTBIT_S32_LE) + +static const unsigned int ak4458_rates[] = { + 8000, 11025, 16000, 22050, + 32000, 44100, 48000, 88200, + 96000, 176400, 192000, 352800, + 384000, 705600, 768000, 1411200, + 2822400, +}; + +static const struct snd_pcm_hw_constraint_list ak4458_rate_constraints = { + .count = ARRAY_SIZE(ak4458_rates), + .list = ak4458_rates, +}; + +static int ak4458_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + int ret; + + ret = snd_pcm_hw_constraint_list(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + &ak4458_rate_constraints); + + return ret; +} + +static struct snd_soc_dai_ops ak4458_dai_ops = { + .startup = ak4458_startup, + .hw_params = ak4458_hw_params, + .set_fmt = ak4458_set_dai_fmt, + .digital_mute = ak4458_set_dai_mute, + .set_tdm_slot = ak4458_set_tdm_slot, +}; + +static struct snd_soc_dai_driver ak4458_dai = { + .name = "ak4458-aif", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 8, + .rates = SNDRV_PCM_RATE_KNOT, + .formats = AK4458_FORMATS, + }, + .ops = &ak4458_dai_ops, +}; + +static void ak4458_power_off(struct ak4458_priv *ak4458) +{ + if (ak4458->reset_gpiod) { + gpiod_set_value_cansleep(ak4458->reset_gpiod, 0); + usleep_range(1000, 2000); + } +} + +static void ak4458_power_on(struct ak4458_priv *ak4458) +{ + if (ak4458->reset_gpiod) { + gpiod_set_value_cansleep(ak4458->reset_gpiod, 1); + usleep_range(1000, 2000); + } +} + +static void ak4458_init(struct snd_soc_component *component) +{ + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + + /* External Mute ON */ + if (ak4458->mute_gpiod) + gpiod_set_value_cansleep(ak4458->mute_gpiod, 1); + + ak4458_power_on(ak4458); + + snd_soc_component_update_bits(component, AK4458_00_CONTROL1, + 0x80, 0x80); /* ACKS bit = 1; 10000000 */ + + ak4458_rstn_control(component, 1); +} + +static int ak4458_probe(struct snd_soc_component *component) +{ + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + + ak4458_init(component); + + ak4458->fs = 48000; + + return 0; +} + +static void ak4458_remove(struct snd_soc_component *component) +{ + struct ak4458_priv *ak4458 = snd_soc_component_get_drvdata(component); + + ak4458_power_off(ak4458); +} + +#ifdef CONFIG_PM +static int __maybe_unused ak4458_runtime_suspend(struct device *dev) +{ + struct ak4458_priv *ak4458 = dev_get_drvdata(dev); + + regcache_cache_only(ak4458->regmap, true); + + ak4458_power_off(ak4458); + + if (ak4458->mute_gpiod) + gpiod_set_value_cansleep(ak4458->mute_gpiod, 0); + + return 0; +} + +static int __maybe_unused ak4458_runtime_resume(struct device *dev) +{ + struct ak4458_priv *ak4458 = dev_get_drvdata(dev); + + if (ak4458->mute_gpiod) + gpiod_set_value_cansleep(ak4458->mute_gpiod, 1); + + ak4458_power_off(ak4458); + ak4458_power_on(ak4458); + + regcache_cache_only(ak4458->regmap, false); + regcache_mark_dirty(ak4458->regmap); + + return regcache_sync(ak4458->regmap); +} +#endif /* CONFIG_PM */ + +struct snd_soc_component_driver soc_codec_dev_ak4458 = { + .probe = ak4458_probe, + .remove = ak4458_remove, + .controls = ak4458_snd_controls, + .num_controls = ARRAY_SIZE(ak4458_snd_controls), + .dapm_widgets = ak4458_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4458_dapm_widgets), + .dapm_routes = ak4458_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4458_intercon), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; + +static const struct regmap_config ak4458_regmap = { + .reg_bits = 8, + .val_bits = 8, + + .max_register = AK4458_14_R4CHATT, + .reg_defaults = ak4458_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(ak4458_reg_defaults), + .cache_type = REGCACHE_RBTREE, +}; + +static const struct dev_pm_ops ak4458_pm = { + SET_RUNTIME_PM_OPS(ak4458_runtime_suspend, ak4458_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) +}; + +static int ak4458_i2c_probe(struct i2c_client *i2c) +{ + struct ak4458_priv *ak4458; + int ret; + + ak4458 = devm_kzalloc(&i2c->dev, sizeof(*ak4458), GFP_KERNEL); + if (!ak4458) + return -ENOMEM; + + ak4458->regmap = devm_regmap_init_i2c(i2c, &ak4458_regmap); + if (IS_ERR(ak4458->regmap)) + return PTR_ERR(ak4458->regmap); + + i2c_set_clientdata(i2c, ak4458); + ak4458->dev = &i2c->dev; + + ak4458->reset_gpiod = devm_gpiod_get_optional(ak4458->dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(ak4458->reset_gpiod)) + return PTR_ERR(ak4458->reset_gpiod); + + ak4458->mute_gpiod = devm_gpiod_get_optional(ak4458->dev, "mute", + GPIOD_OUT_LOW); + if (IS_ERR(ak4458->mute_gpiod)) + return PTR_ERR(ak4458->mute_gpiod); + + ret = devm_snd_soc_register_component(ak4458->dev, &soc_codec_dev_ak4458, + &ak4458_dai, 1); + if (ret < 0) { + dev_err(ak4458->dev, "Failed to register CODEC: %d\n", ret); + return ret; + } + + pm_runtime_enable(&i2c->dev); + + return 0; +} + +static int ak4458_i2c_remove(struct i2c_client *i2c) +{ + pm_runtime_disable(&i2c->dev); + + return 0; +} + +static const struct of_device_id ak4458_of_match[] = { + { .compatible = "asahi-kasei,ak4458", }, + { }, +}; + +static struct i2c_driver ak4458_i2c_driver = { + .driver = { + .name = "ak4458", + .pm = &ak4458_pm, + .of_match_table = ak4458_of_match, + }, + .probe_new = ak4458_i2c_probe, + .remove = ak4458_i2c_remove, +}; + +module_i2c_driver(ak4458_i2c_driver); + +MODULE_AUTHOR("Junichi Wakasugi <wakasugi.jb@om.asahi-kasei.co.jp>"); +MODULE_AUTHOR("Mihai Serban <mihai.serban@nxp.com>"); +MODULE_DESCRIPTION("ASoC AK4458 DAC driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/codecs/ak4458.h b/sound/soc/codecs/ak4458.h new file mode 100644 index 000000000000..f906215f7e4e --- /dev/null +++ b/sound/soc/codecs/ak4458.h @@ -0,0 +1,86 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Audio driver for AK4458 + * + * Copyright (C) 2016 Asahi Kasei Microdevices Corporation + * Copyright 2018 NXP + */ + +#ifndef _AK4458_H +#define _AK4458_H + +#include <linux/regmap.h> + +/* Settings */ + +#define AK4458_00_CONTROL1 0x00 +#define AK4458_01_CONTROL2 0x01 +#define AK4458_02_CONTROL3 0x02 +#define AK4458_03_LCHATT 0x03 +#define AK4458_04_RCHATT 0x04 +#define AK4458_05_CONTROL4 0x05 +#define AK4458_06_DSD1 0x06 +#define AK4458_07_CONTROL5 0x07 +#define AK4458_08_SOUND_CONTROL 0x08 +#define AK4458_09_DSD2 0x09 +#define AK4458_0A_CONTROL6 0x0A +#define AK4458_0B_CONTROL7 0x0B +#define AK4458_0C_CONTROL8 0x0C +#define AK4458_0D_CONTROL9 0x0D +#define AK4458_0E_CONTROL10 0x0E +#define AK4458_0F_L2CHATT 0x0F +#define AK4458_10_R2CHATT 0x10 +#define AK4458_11_L3CHATT 0x11 +#define AK4458_12_R3CHATT 0x12 +#define AK4458_13_L4CHATT 0x13 +#define AK4458_14_R4CHATT 0x14 + +/* Bitfield Definitions */ + +/* AK4458_00_CONTROL1 (0x00) Fields + * Addr Register Name D7 D6 D5 D4 D3 D2 D1 D0 + * 00H Control 1 ACKS 0 0 0 DIF2 DIF1 DIF0 RSTN + */ + +/* Digital Filter (SD, SLOW, SSLOW) */ +#define AK4458_SD_MASK GENMASK(5, 5) +#define AK4458_SLOW_MASK GENMASK(0, 0) +#define AK4458_SSLOW_MASK GENMASK(0, 0) + +/* DIF2 1 0 + * x 1 0 MSB justified Figure 3 (default) + * x 1 1 I2S Compliment Figure 4 + */ +#define AK4458_DIF_SHIFT 1 +#define AK4458_DIF_MASK GENMASK(3, 1) + +#define AK4458_DIF_16BIT_LSB (0 << 1) +#define AK4458_DIF_24BIT_I2S (3 << 1) +#define AK4458_DIF_32BIT_LSB (5 << 1) +#define AK4458_DIF_32BIT_MSB (6 << 1) +#define AK4458_DIF_32BIT_I2S (7 << 1) + +/* AK4458_00_CONTROL1 (0x00) D0 bit */ +#define AK4458_RSTN_MASK GENMASK(0, 0) +#define AK4458_RSTN (0x1 << 0) + +/* AK4458_0A_CONTROL6 Mode bits */ +#define AK4458_MODE_SHIFT 6 +#define AK4458_MODE_MASK GENMASK(7, 6) +#define AK4458_MODE_NORMAL (0 << AK4458_MODE_SHIFT) +#define AK4458_MODE_TDM128 (1 << AK4458_MODE_SHIFT) +#define AK4458_MODE_TDM256 (2 << AK4458_MODE_SHIFT) +#define AK4458_MODE_TDM512 (3 << AK4458_MODE_SHIFT) + +/* DAC Digital attenuator transition time setting + * Table 19 + * Mode ATS1 ATS2 ATT speed + * 0 0 0 4080/fs + * 1 0 1 2040/fs + * 2 1 0 510/fs + * 3 1 1 255/fs + * */ +#define AK4458_ATS_SHIFT 6 +#define AK4458_ATS_MASK GENMASK(7, 6) + +#endif /* _AK4458_H */ diff --git a/sound/soc/codecs/ak4535.c b/sound/soc/codecs/ak4535.c index e3c157dc88db..31f609910bd6 100644 --- a/sound/soc/codecs/ak4535.c +++ b/sound/soc/codecs/ak4535.c @@ -251,8 +251,8 @@ static const struct snd_soc_dapm_route ak4535_audio_map[] = { static int ak4535_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ak4535_priv *ak4535 = snd_soc_component_get_drvdata(component); ak4535->sysclk = freq; return 0; @@ -262,9 +262,9 @@ static int ak4535_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4535_priv *ak4535 = snd_soc_codec_get_drvdata(codec); - u8 mode2 = snd_soc_read(codec, AK4535_MODE2) & ~(0x3 << 5); + struct snd_soc_component *component = dai->component; + struct ak4535_priv *ak4535 = snd_soc_component_get_drvdata(component); + u8 mode2 = snd_soc_component_read32(component, AK4535_MODE2) & ~(0x3 << 5); int rate = params_rate(params), fs = 256; if (rate) @@ -283,14 +283,14 @@ static int ak4535_hw_params(struct snd_pcm_substream *substream, } /* set rate */ - snd_soc_write(codec, AK4535_MODE2, mode2); + snd_soc_component_write(component, AK4535_MODE2, mode2); return 0; } static int ak4535_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 mode1 = 0; /* interface format */ @@ -308,37 +308,37 @@ static int ak4535_set_dai_fmt(struct snd_soc_dai *codec_dai, /* use 32 fs for BCLK to save power */ mode1 |= 0x4; - snd_soc_write(codec, AK4535_MODE1, mode1); + snd_soc_component_write(component, AK4535_MODE1, mode1); return 0; } static int ak4535_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - u16 mute_reg = snd_soc_read(codec, AK4535_DAC); + struct snd_soc_component *component = dai->component; + u16 mute_reg = snd_soc_component_read32(component, AK4535_DAC); if (!mute) - snd_soc_write(codec, AK4535_DAC, mute_reg & ~0x20); + snd_soc_component_write(component, AK4535_DAC, mute_reg & ~0x20); else - snd_soc_write(codec, AK4535_DAC, mute_reg | 0x20); + snd_soc_component_write(component, AK4535_DAC, mute_reg | 0x20); return 0; } -static int ak4535_set_bias_level(struct snd_soc_codec *codec, +static int ak4535_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: - snd_soc_update_bits(codec, AK4535_DAC, 0x20, 0); + snd_soc_component_update_bits(component, AK4535_DAC, 0x20, 0); break; case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, AK4535_DAC, 0x20, 0x20); + snd_soc_component_update_bits(component, AK4535_DAC, 0x20, 0x20); break; case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, AK4535_PM1, 0x80, 0x80); - snd_soc_update_bits(codec, AK4535_PM2, 0x80, 0); + snd_soc_component_update_bits(component, AK4535_PM1, 0x80, 0x80); + snd_soc_component_update_bits(component, AK4535_PM2, 0x80, 0); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, AK4535_PM1, 0x80, 0); + snd_soc_component_update_bits(component, AK4535_PM1, 0x80, 0); break; } return 0; @@ -372,9 +372,9 @@ static struct snd_soc_dai_driver ak4535_dai = { .ops = &ak4535_dai_ops, }; -static int ak4535_resume(struct snd_soc_codec *codec) +static int ak4535_resume(struct snd_soc_component *component) { - snd_soc_cache_sync(codec); + snd_soc_component_cache_sync(component); return 0; } @@ -390,19 +390,20 @@ static const struct regmap_config ak4535_regmap = { .num_reg_defaults = ARRAY_SIZE(ak4535_reg_defaults), }; -static const struct snd_soc_codec_driver soc_codec_dev_ak4535 = { - .resume = ak4535_resume, - .set_bias_level = ak4535_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = ak4535_snd_controls, - .num_controls = ARRAY_SIZE(ak4535_snd_controls), - .dapm_widgets = ak4535_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4535_dapm_widgets), - .dapm_routes = ak4535_audio_map, - .num_dapm_routes = ARRAY_SIZE(ak4535_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_ak4535 = { + .resume = ak4535_resume, + .set_bias_level = ak4535_set_bias_level, + .controls = ak4535_snd_controls, + .num_controls = ARRAY_SIZE(ak4535_snd_controls), + .dapm_widgets = ak4535_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4535_dapm_widgets), + .dapm_routes = ak4535_audio_map, + .num_dapm_routes = ARRAY_SIZE(ak4535_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ak4535_i2c_probe(struct i2c_client *i2c, @@ -425,18 +426,12 @@ static int ak4535_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, ak4535); - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_ak4535, &ak4535_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_ak4535, &ak4535_dai, 1); return ret; } -static int ak4535_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id ak4535_i2c_id[] = { { "ak4535", 0 }, { } @@ -448,7 +443,6 @@ static struct i2c_driver ak4535_i2c_driver = { .name = "ak4535", }, .probe = ak4535_i2c_probe, - .remove = ak4535_i2c_remove, .id_table = ak4535_i2c_id, }; diff --git a/sound/soc/codecs/ak4554.c b/sound/soc/codecs/ak4554.c index 0bb4fe5c122a..b7ee13406d93 100644 --- a/sound/soc/codecs/ak4554.c +++ b/sound/soc/codecs/ak4554.c @@ -64,28 +64,24 @@ static struct snd_soc_dai_driver ak4554_dai = { .symmetric_rates = 1, }; -static const struct snd_soc_codec_driver soc_codec_dev_ak4554 = { - .component_driver = { - .dapm_widgets = ak4554_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), - .dapm_routes = ak4554_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ak4554_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ak4554 = { + .dapm_widgets = ak4554_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4554_dapm_widgets), + .dapm_routes = ak4554_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ak4554_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ak4554_soc_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_ak4554, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_ak4554, &ak4554_dai, 1); } -static int ak4554_soc_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - static const struct of_device_id ak4554_of_match[] = { { .compatible = "asahi-kasei,ak4554" }, {}, @@ -98,7 +94,6 @@ static struct platform_driver ak4554_driver = { .of_match_table = ak4554_of_match, }, .probe = ak4554_soc_probe, - .remove = ak4554_soc_remove, }; module_platform_driver(ak4554_driver); diff --git a/sound/soc/codecs/ak4613.c b/sound/soc/codecs/ak4613.c index 3d1cf4784e87..8523ff9351cf 100644 --- a/sound/soc/codecs/ak4613.c +++ b/sound/soc/codecs/ak4613.c @@ -243,9 +243,9 @@ static const struct snd_soc_dapm_route ak4613_intercon[] = { static void ak4613_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); - struct device *dev = codec->dev; + struct snd_soc_component *component = dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); + struct device *dev = component->dev; mutex_lock(&priv->lock); priv->cnt--; @@ -305,8 +305,8 @@ static void ak4613_hw_constraints(struct ak4613_priv *priv, static int ak4613_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); priv->cnt++; @@ -318,8 +318,8 @@ static int ak4613_dai_startup(struct snd_pcm_substream *substream, static int ak4613_dai_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); priv->sysclk = freq; @@ -328,8 +328,8 @@ static int ak4613_dai_set_sysclk(struct snd_soc_dai *codec_dai, static int ak4613_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); fmt &= SND_SOC_DAIFMT_FORMAT_MASK; @@ -366,10 +366,10 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); const struct ak4613_interface *iface; - struct device *dev = codec->dev; + struct device *dev = component->dev; unsigned int width = params_width(params); unsigned int fmt = priv->fmt; unsigned int rate; @@ -434,11 +434,11 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, fmt_ctrl = AUDIO_IFACE_TO_VAL(iface); - snd_soc_update_bits(codec, CTRL1, FMT_MASK, fmt_ctrl); - snd_soc_update_bits(codec, CTRL2, DFS_MASK, ctrl2); + snd_soc_component_update_bits(component, CTRL1, FMT_MASK, fmt_ctrl); + snd_soc_component_update_bits(component, CTRL2, DFS_MASK, ctrl2); - snd_soc_update_bits(codec, ICTRL, ICTRL_MASK, priv->ic); - snd_soc_update_bits(codec, OCTRL, OCTRL_MASK, priv->oc); + snd_soc_component_update_bits(component, ICTRL, ICTRL_MASK, priv->ic); + snd_soc_component_update_bits(component, OCTRL, OCTRL_MASK, priv->oc); hw_params_end: if (ret < 0) @@ -447,7 +447,7 @@ hw_params_end: return ret; } -static int ak4613_set_bias_level(struct snd_soc_codec *codec, +static int ak4613_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { u8 mgmt1 = 0; @@ -467,7 +467,7 @@ static int ak4613_set_bias_level(struct snd_soc_codec *codec, break; } - snd_soc_write(codec, PW_MGMT1, mgmt1); + snd_soc_component_write(component, PW_MGMT1, mgmt1); return 0; } @@ -504,8 +504,8 @@ static void ak4613_dummy_write(struct work_struct *work) static int ak4613_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4613_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4613_priv *priv = snd_soc_component_get_drvdata(component); /* * FIXME @@ -537,7 +537,7 @@ static int ak4613_dai_trigger(struct snd_pcm_substream *substream, int cmd, if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) return 0; - priv->component = &codec->component; + priv->component = component; schedule_work(&priv->dummy_write_work); return 0; @@ -582,35 +582,36 @@ static struct snd_soc_dai_driver ak4613_dai = { .symmetric_rates = 1, }; -static int ak4613_suspend(struct snd_soc_codec *codec) +static int ak4613_suspend(struct snd_soc_component *component) { - struct regmap *regmap = dev_get_regmap(codec->dev, NULL); + struct regmap *regmap = dev_get_regmap(component->dev, NULL); regcache_cache_only(regmap, true); regcache_mark_dirty(regmap); return 0; } -static int ak4613_resume(struct snd_soc_codec *codec) +static int ak4613_resume(struct snd_soc_component *component) { - struct regmap *regmap = dev_get_regmap(codec->dev, NULL); + struct regmap *regmap = dev_get_regmap(component->dev, NULL); regcache_cache_only(regmap, false); return regcache_sync(regmap); } -static const struct snd_soc_codec_driver soc_codec_dev_ak4613 = { +static const struct snd_soc_component_driver soc_component_dev_ak4613 = { .suspend = ak4613_suspend, .resume = ak4613_resume, .set_bias_level = ak4613_set_bias_level, - .component_driver = { - .controls = ak4613_snd_controls, - .num_controls = ARRAY_SIZE(ak4613_snd_controls), - .dapm_widgets = ak4613_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4613_dapm_widgets), - .dapm_routes = ak4613_intercon, - .num_dapm_routes = ARRAY_SIZE(ak4613_intercon), - }, + .controls = ak4613_snd_controls, + .num_controls = ARRAY_SIZE(ak4613_snd_controls), + .dapm_widgets = ak4613_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4613_dapm_widgets), + .dapm_routes = ak4613_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4613_intercon), + .idle_bias_on = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static void ak4613_parse_of(struct ak4613_priv *priv, @@ -677,13 +678,12 @@ static int ak4613_i2c_probe(struct i2c_client *i2c, if (IS_ERR(regmap)) return PTR_ERR(regmap); - return snd_soc_register_codec(dev, &soc_codec_dev_ak4613, + return devm_snd_soc_register_component(dev, &soc_component_dev_ak4613, &ak4613_dai, 1); } static int ak4613_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/ak4641.c b/sound/soc/codecs/ak4641.c index 60142ff32d4f..05869beff26e 100644 --- a/sound/soc/codecs/ak4641.c +++ b/sound/soc/codecs/ak4641.c @@ -70,9 +70,9 @@ static const struct reg_default ak4641_reg_defaults[] = { static const int deemph_settings[] = {44100, 0, 48000, 32000}; -static int ak4641_set_deemph(struct snd_soc_codec *codec) +static int ak4641_set_deemph(struct snd_soc_component *component) { - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); int i, best = 0; for (i = 0 ; i < ARRAY_SIZE(deemph_settings); i++) { @@ -86,16 +86,16 @@ static int ak4641_set_deemph(struct snd_soc_codec *codec) best = i; } - dev_dbg(codec->dev, "Set deemphasis %d\n", best); + dev_dbg(component->dev, "Set deemphasis %d\n", best); - return snd_soc_update_bits(codec, AK4641_DAC, 0x3, best); + return snd_soc_component_update_bits(component, AK4641_DAC, 0x3, best); } static int ak4641_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); int deemph = ucontrol->value.integer.value[0]; if (deemph > 1) @@ -103,14 +103,14 @@ static int ak4641_put_deemph(struct snd_kcontrol *kcontrol, ak4641->deemph = deemph; - return ak4641_set_deemph(codec); + return ak4641_set_deemph(component); } static int ak4641_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = ak4641->deemph; return 0; @@ -307,8 +307,8 @@ static const struct snd_soc_dapm_route ak4641_audio_map[] = { static int ak4641_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); ak4641->sysclk = freq; return 0; @@ -318,8 +318,8 @@ static int ak4641_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); int rate = params_rate(params), fs = 256; u8 mode2; @@ -340,16 +340,16 @@ static int ak4641_i2s_hw_params(struct snd_pcm_substream *substream, mode2 = (0x0 << 5); break; default: - dev_err(codec->dev, "Error: unsupported fs=%d\n", fs); + dev_err(component->dev, "Error: unsupported fs=%d\n", fs); return -EINVAL; } - snd_soc_update_bits(codec, AK4641_MODE2, (0x3 << 5), mode2); + snd_soc_component_update_bits(component, AK4641_MODE2, (0x3 << 5), mode2); /* Update de-emphasis filter for the new rate */ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { ak4641->playback_fs = rate; - ak4641_set_deemph(codec); + ak4641_set_deemph(component); } return 0; @@ -358,7 +358,7 @@ static int ak4641_i2s_hw_params(struct snd_pcm_substream *substream, static int ak4641_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 btif; int ret; @@ -380,7 +380,7 @@ static int ak4641_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - ret = snd_soc_update_bits(codec, AK4641_BTIF, (0x3 << 5), btif); + ret = snd_soc_component_update_bits(component, AK4641_BTIF, (0x3 << 5), btif); if (ret < 0) return ret; @@ -390,7 +390,7 @@ static int ak4641_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, static int ak4641_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 mode1 = 0; /* interface format */ @@ -405,34 +405,34 @@ static int ak4641_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - return snd_soc_write(codec, AK4641_MODE1, mode1); + return snd_soc_component_write(component, AK4641_MODE1, mode1); } static int ak4641_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - return snd_soc_update_bits(codec, AK4641_DAC, 0x20, mute ? 0x20 : 0); + return snd_soc_component_update_bits(component, AK4641_DAC, 0x20, mute ? 0x20 : 0); } -static int ak4641_set_bias_level(struct snd_soc_codec *codec, +static int ak4641_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct ak4641_priv *ak4641 = snd_soc_codec_get_drvdata(codec); - struct ak4641_platform_data *pdata = codec->dev->platform_data; + struct ak4641_priv *ak4641 = snd_soc_component_get_drvdata(component); + struct ak4641_platform_data *pdata = component->dev->platform_data; int ret; switch (level) { case SND_SOC_BIAS_ON: /* unmute */ - snd_soc_update_bits(codec, AK4641_DAC, 0x20, 0); + snd_soc_component_update_bits(component, AK4641_DAC, 0x20, 0); break; case SND_SOC_BIAS_PREPARE: /* mute */ - snd_soc_update_bits(codec, AK4641_DAC, 0x20, 0x20); + snd_soc_component_update_bits(component, AK4641_DAC, 0x20, 0x20); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { if (pdata && gpio_is_valid(pdata->gpio_power)) gpio_set_value(pdata->gpio_power, 1); mdelay(1); @@ -442,16 +442,16 @@ static int ak4641_set_bias_level(struct snd_soc_codec *codec, ret = regcache_sync(ak4641->regmap); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to sync cache: %d\n", ret); return ret; } } - snd_soc_update_bits(codec, AK4641_PM1, 0x80, 0x80); - snd_soc_update_bits(codec, AK4641_PM2, 0x80, 0); + snd_soc_component_update_bits(component, AK4641_PM1, 0x80, 0x80); + snd_soc_component_update_bits(component, AK4641_PM2, 0x80, 0); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, AK4641_PM1, 0x80, 0); + snd_soc_component_update_bits(component, AK4641_PM1, 0x80, 0); if (pdata && gpio_is_valid(pdata->gpio_npdn)) gpio_set_value(pdata->gpio_npdn, 0); if (pdata && gpio_is_valid(pdata->gpio_power)) @@ -524,17 +524,19 @@ static struct snd_soc_dai_driver ak4641_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_ak4641 = { - .component_driver = { - .controls = ak4641_snd_controls, - .num_controls = ARRAY_SIZE(ak4641_snd_controls), - .dapm_widgets = ak4641_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4641_dapm_widgets), - .dapm_routes = ak4641_audio_map, - .num_dapm_routes = ARRAY_SIZE(ak4641_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_ak4641 = { + .controls = ak4641_snd_controls, + .num_controls = ARRAY_SIZE(ak4641_snd_controls), + .dapm_widgets = ak4641_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4641_dapm_widgets), + .dapm_routes = ak4641_audio_map, + .num_dapm_routes = ARRAY_SIZE(ak4641_audio_map), .set_bias_level = ak4641_set_bias_level, - .suspend_bias_off = true, + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ak4641_regmap = { @@ -583,7 +585,8 @@ static int ak4641_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, ak4641); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_ak4641, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_ak4641, ak4641_dai, ARRAY_SIZE(ak4641_dai)); if (ret != 0) goto err_gpio2; @@ -608,8 +611,6 @@ static int ak4641_i2c_remove(struct i2c_client *i2c) { struct ak4641_platform_data *pdata = i2c->dev.platform_data; - snd_soc_unregister_codec(&i2c->dev); - if (pdata) { if (gpio_is_valid(pdata->gpio_power)) { gpio_set_value(pdata->gpio_power, 0); diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 29530c567bd9..605055964529 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -178,19 +178,19 @@ static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { static int ak4642_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMD: case SND_SOC_DAPM_PRE_PMU: /* Power save mode ON */ - snd_soc_update_bits(codec, SG_SL2, LOPS, LOPS); + snd_soc_component_update_bits(component, SG_SL2, LOPS, LOPS); break; case SND_SOC_DAPM_POST_PMU: case SND_SOC_DAPM_POST_PMD: /* Power save mode OFF */ msleep(300); - snd_soc_update_bits(codec, SG_SL2, LOPS, 0); + snd_soc_component_update_bits(component, SG_SL2, LOPS, 0); break; } @@ -282,7 +282,7 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (is_play) { /* @@ -295,8 +295,8 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p97. */ - snd_soc_write(codec, L_IVC, 0x91); /* volume */ - snd_soc_write(codec, R_IVC, 0x91); /* volume */ + snd_soc_component_write(component, L_IVC, 0x91); /* volume */ + snd_soc_component_write(component, R_IVC, 0x91); /* volume */ } else { /* * start stereo input @@ -311,11 +311,11 @@ static int ak4642_dai_startup(struct snd_pcm_substream *substream, * This operation came from example code of * "ASAHI KASEI AK4642" (japanese) manual p94. */ - snd_soc_update_bits(codec, SG_SL1, PMMP | MGAIN0, PMMP | MGAIN0); - snd_soc_write(codec, TIMER, ZTM(0x3) | WTM(0x3)); - snd_soc_write(codec, ALC_CTL1, ALC | LMTH0); - snd_soc_update_bits(codec, PW_MGMT1, PMADL, PMADL); - snd_soc_update_bits(codec, PW_MGMT3, PMADR, PMADR); + snd_soc_component_update_bits(component, SG_SL1, PMMP | MGAIN0, PMMP | MGAIN0); + snd_soc_component_write(component, TIMER, ZTM(0x3) | WTM(0x3)); + snd_soc_component_write(component, ALC_CTL1, ALC | LMTH0); + snd_soc_component_update_bits(component, PW_MGMT1, PMADL, PMADL); + snd_soc_component_update_bits(component, PW_MGMT3, PMADR, PMADR); } return 0; @@ -325,22 +325,22 @@ static void ak4642_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int is_play = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (is_play) { } else { /* stop stereo input */ - snd_soc_update_bits(codec, PW_MGMT1, PMADL, 0); - snd_soc_update_bits(codec, PW_MGMT3, PMADR, 0); - snd_soc_update_bits(codec, ALC_CTL1, ALC, 0); + snd_soc_component_update_bits(component, PW_MGMT1, PMADL, 0); + snd_soc_component_update_bits(component, PW_MGMT3, PMADR, 0); + snd_soc_component_update_bits(component, ALC_CTL1, ALC, 0); } } static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ak4642_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ak4642_priv *priv = snd_soc_component_get_drvdata(component); u8 pll; int extended_freq = 0; @@ -382,14 +382,14 @@ static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai, if (extended_freq && !priv->drvdata->extended_frequencies) return -EINVAL; - snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll); + snd_soc_component_update_bits(component, MD_CTL1, PLL_MASK, pll); return 0; } static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 data; u8 bcko; @@ -407,8 +407,8 @@ static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) default: return -EINVAL; } - snd_soc_update_bits(codec, PW_MGMT2, MS | MCKO | PMPLL, data); - snd_soc_update_bits(codec, MD_CTL1, BCKO_MASK, bcko); + snd_soc_component_update_bits(component, PW_MGMT2, MS | MCKO | PMPLL, data); + snd_soc_component_update_bits(component, MD_CTL1, BCKO_MASK, bcko); /* format type */ data = 0; @@ -425,12 +425,12 @@ static int ak4642_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) default: return -EINVAL; } - snd_soc_update_bits(codec, MD_CTL1, DIF_MASK, data); + snd_soc_component_update_bits(component, MD_CTL1, DIF_MASK, data); return 0; } -static int ak4642_set_mcko(struct snd_soc_codec *codec, +static int ak4642_set_mcko(struct snd_soc_component *component, u32 frequency) { static const u32 fs_list[] = { @@ -458,7 +458,7 @@ static int ak4642_set_mcko(struct snd_soc_codec *codec, for (ps = 0; ps < ARRAY_SIZE(ps_list); ps++) { for (fs = 0; fs < ARRAY_SIZE(fs_list); fs++) { if (frequency == ps_list[ps] * fs_list[fs]) { - snd_soc_write(codec, MD_CTL2, + snd_soc_component_write(component, MD_CTL2, PSs(ps) | FSs(fs)); return 0; } @@ -472,25 +472,25 @@ static int ak4642_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak4642_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak4642_priv *priv = snd_soc_component_get_drvdata(component); u32 rate = clk_get_rate(priv->mcko); if (!rate) rate = params_rate(params) * 256; - return ak4642_set_mcko(codec, rate); + return ak4642_set_mcko(component, rate); } -static int ak4642_set_bias_level(struct snd_soc_codec *codec, +static int ak4642_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_OFF: - snd_soc_write(codec, PW_MGMT1, 0x00); + snd_soc_component_write(component, PW_MGMT1, 0x00); break; default: - snd_soc_update_bits(codec, PW_MGMT1, PMVCM, PMVCM); + snd_soc_component_update_bits(component, PW_MGMT1, PMVCM, PMVCM); break; } @@ -523,46 +523,47 @@ static struct snd_soc_dai_driver ak4642_dai = { .symmetric_rates = 1, }; -static int ak4642_suspend(struct snd_soc_codec *codec) +static int ak4642_suspend(struct snd_soc_component *component) { - struct regmap *regmap = dev_get_regmap(codec->dev, NULL); + struct regmap *regmap = dev_get_regmap(component->dev, NULL); regcache_cache_only(regmap, true); regcache_mark_dirty(regmap); return 0; } -static int ak4642_resume(struct snd_soc_codec *codec) +static int ak4642_resume(struct snd_soc_component *component) { - struct regmap *regmap = dev_get_regmap(codec->dev, NULL); + struct regmap *regmap = dev_get_regmap(component->dev, NULL); regcache_cache_only(regmap, false); regcache_sync(regmap); return 0; } -static int ak4642_probe(struct snd_soc_codec *codec) +static int ak4642_probe(struct snd_soc_component *component) { - struct ak4642_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ak4642_priv *priv = snd_soc_component_get_drvdata(component); if (priv->mcko) - ak4642_set_mcko(codec, clk_get_rate(priv->mcko)); + ak4642_set_mcko(component, clk_get_rate(priv->mcko)); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_ak4642 = { +static const struct snd_soc_component_driver soc_component_dev_ak4642 = { .probe = ak4642_probe, .suspend = ak4642_suspend, .resume = ak4642_resume, .set_bias_level = ak4642_set_bias_level, - .component_driver = { - .controls = ak4642_snd_controls, - .num_controls = ARRAY_SIZE(ak4642_snd_controls), - .dapm_widgets = ak4642_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), - .dapm_routes = ak4642_intercon, - .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), - }, + .controls = ak4642_snd_controls, + .num_controls = ARRAY_SIZE(ak4642_snd_controls), + .dapm_widgets = ak4642_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4642_dapm_widgets), + .dapm_routes = ak4642_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4642_intercon), + .idle_bias_on = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ak4642_regmap = { @@ -675,14 +676,8 @@ static int ak4642_i2c_probe(struct i2c_client *i2c, if (IS_ERR(regmap)) return PTR_ERR(regmap); - return snd_soc_register_codec(dev, - &soc_codec_dev_ak4642, &ak4642_dai, 1); -} - -static int ak4642_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; + return devm_snd_soc_register_component(dev, + &soc_component_dev_ak4642, &ak4642_dai, 1); } static const struct of_device_id ak4642_of_match[] = { @@ -707,7 +702,6 @@ static struct i2c_driver ak4642_i2c_driver = { .of_match_table = ak4642_of_match, }, .probe = ak4642_i2c_probe, - .remove = ak4642_i2c_remove, .id_table = ak4642_i2c_id, }; diff --git a/sound/soc/codecs/ak4671.c b/sound/soc/codecs/ak4671.c index dcfdff56fc5a..7133fd69c641 100644 --- a/sound/soc/codecs/ak4671.c +++ b/sound/soc/codecs/ak4671.c @@ -163,15 +163,15 @@ static const struct snd_kcontrol_new ak4671_snd_controls[] = { static int ak4671_out2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, AK4671_LOUT2_POWER_MANAGERMENT, + snd_soc_component_update_bits(component, AK4671_LOUT2_POWER_MANAGERMENT, AK4671_MUTEN, AK4671_MUTEN); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, AK4671_LOUT2_POWER_MANAGERMENT, + snd_soc_component_update_bits(component, AK4671_LOUT2_POWER_MANAGERMENT, AK4671_MUTEN, 0); break; } @@ -427,10 +427,10 @@ static int ak4671_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 fs; - fs = snd_soc_read(codec, AK4671_PLL_MODE_SELECT0); + fs = snd_soc_component_read32(component, AK4671_PLL_MODE_SELECT0); fs &= ~AK4671_FS; switch (params_rate(params)) { @@ -465,7 +465,7 @@ static int ak4671_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_write(codec, AK4671_PLL_MODE_SELECT0, fs); + snd_soc_component_write(component, AK4671_PLL_MODE_SELECT0, fs); return 0; } @@ -473,10 +473,10 @@ static int ak4671_hw_params(struct snd_pcm_substream *substream, static int ak4671_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 pll; - pll = snd_soc_read(codec, AK4671_PLL_MODE_SELECT0); + pll = snd_soc_component_read32(component, AK4671_PLL_MODE_SELECT0); pll &= ~AK4671_PLL; switch (freq) { @@ -511,19 +511,19 @@ static int ak4671_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, return -EINVAL; } - snd_soc_write(codec, AK4671_PLL_MODE_SELECT0, pll); + snd_soc_component_write(component, AK4671_PLL_MODE_SELECT0, pll); return 0; } static int ak4671_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 mode; u8 format; /* set master/slave audio interface */ - mode = snd_soc_read(codec, AK4671_PLL_MODE_SELECT1); + mode = snd_soc_component_read32(component, AK4671_PLL_MODE_SELECT1); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -537,7 +537,7 @@ static int ak4671_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) } /* interface format */ - format = snd_soc_read(codec, AK4671_FORMAT_SELECT); + format = snd_soc_component_read32(component, AK4671_FORMAT_SELECT); format &= ~AK4671_DIF; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -557,24 +557,24 @@ static int ak4671_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) } /* set mode and format */ - snd_soc_write(codec, AK4671_PLL_MODE_SELECT1, mode); - snd_soc_write(codec, AK4671_FORMAT_SELECT, format); + snd_soc_component_write(component, AK4671_PLL_MODE_SELECT1, mode); + snd_soc_component_write(component, AK4671_FORMAT_SELECT, format); return 0; } -static int ak4671_set_bias_level(struct snd_soc_codec *codec, +static int ak4671_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, AK4671_AD_DA_POWER_MANAGEMENT, + snd_soc_component_update_bits(component, AK4671_AD_DA_POWER_MANAGEMENT, AK4671_PMVCM, AK4671_PMVCM); break; case SND_SOC_BIAS_OFF: - snd_soc_write(codec, AK4671_AD_DA_POWER_MANAGEMENT, 0x00); + snd_soc_component_write(component, AK4671_AD_DA_POWER_MANAGEMENT, 0x00); break; } return 0; @@ -610,16 +610,18 @@ static struct snd_soc_dai_driver ak4671_dai = { .ops = &ak4671_dai_ops, }; -static const struct snd_soc_codec_driver soc_codec_dev_ak4671 = { - .set_bias_level = ak4671_set_bias_level, - .component_driver = { - .controls = ak4671_snd_controls, - .num_controls = ARRAY_SIZE(ak4671_snd_controls), - .dapm_widgets = ak4671_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak4671_dapm_widgets), - .dapm_routes = ak4671_intercon, - .num_dapm_routes = ARRAY_SIZE(ak4671_intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_ak4671 = { + .set_bias_level = ak4671_set_bias_level, + .controls = ak4671_snd_controls, + .num_controls = ARRAY_SIZE(ak4671_snd_controls), + .dapm_widgets = ak4671_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak4671_dapm_widgets), + .dapm_routes = ak4671_intercon, + .num_dapm_routes = ARRAY_SIZE(ak4671_intercon), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ak4671_regmap = { @@ -645,17 +647,11 @@ static int ak4671_i2c_probe(struct i2c_client *client, return ret; } - ret = snd_soc_register_codec(&client->dev, - &soc_codec_dev_ak4671, &ak4671_dai, 1); + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_dev_ak4671, &ak4671_dai, 1); return ret; } -static int ak4671_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id ak4671_i2c_id[] = { { "ak4671", 0 }, { } @@ -667,7 +663,6 @@ static struct i2c_driver ak4671_i2c_driver = { .name = "ak4671-codec", }, .probe = ak4671_i2c_probe, - .remove = ak4671_i2c_remove, .id_table = ak4671_i2c_id, }; diff --git a/sound/soc/codecs/ak5386.c b/sound/soc/codecs/ak5386.c index d0e16c03815c..d212960b4dda 100644 --- a/sound/soc/codecs/ak5386.c +++ b/sound/soc/codecs/ak5386.c @@ -38,30 +38,29 @@ static const struct snd_soc_dapm_route ak5386_dapm_routes[] = { { "Capture", NULL, "AINR" }, }; -static int ak5386_soc_probe(struct snd_soc_codec *codec) +static int ak5386_soc_probe(struct snd_soc_component *component) { - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } -static int ak5386_soc_remove(struct snd_soc_codec *codec) +static void ak5386_soc_remove(struct snd_soc_component *component) { - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); - return 0; } #ifdef CONFIG_PM -static int ak5386_soc_suspend(struct snd_soc_codec *codec) +static int ak5386_soc_suspend(struct snd_soc_component *component) { - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return 0; } -static int ak5386_soc_resume(struct snd_soc_codec *codec) +static int ak5386_soc_resume(struct snd_soc_component *component) { - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); } #else @@ -69,28 +68,30 @@ static int ak5386_soc_resume(struct snd_soc_codec *codec) #define ak5386_soc_resume NULL #endif /* CONFIG_PM */ -static const struct snd_soc_codec_driver soc_codec_ak5386 = { - .probe = ak5386_soc_probe, - .remove = ak5386_soc_remove, - .suspend = ak5386_soc_suspend, - .resume = ak5386_soc_resume, - .component_driver = { - .dapm_widgets = ak5386_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets), - .dapm_routes = ak5386_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(ak5386_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_ak5386 = { + .probe = ak5386_soc_probe, + .remove = ak5386_soc_remove, + .suspend = ak5386_soc_suspend, + .resume = ak5386_soc_resume, + .dapm_widgets = ak5386_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets), + .dapm_routes = ak5386_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(ak5386_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ak5386_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; format &= SND_SOC_DAIFMT_FORMAT_MASK; if (format != SND_SOC_DAIFMT_LEFT_J && format != SND_SOC_DAIFMT_I2S) { - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -101,8 +102,8 @@ static int ak5386_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); /* * From the datasheet: @@ -123,8 +124,8 @@ static int ak5386_hw_params(struct snd_pcm_substream *substream, static int ak5386_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ak5386_priv *priv = snd_soc_component_get_drvdata(component); if (gpio_is_valid(priv->reset_gpio)) gpio_set_value(priv->reset_gpio, 0); @@ -192,19 +193,12 @@ static int ak5386_probe(struct platform_device *pdev) "AK5386 Reset")) priv->reset_gpio = -EINVAL; - return snd_soc_register_codec(dev, &soc_codec_ak5386, + return devm_snd_soc_register_component(dev, &soc_component_ak5386, &ak5386_dai, 1); } -static int ak5386_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - static struct platform_driver ak5386_driver = { .probe = ak5386_probe, - .remove = ak5386_remove, .driver = { .name = "ak5386", .of_match_table = of_match_ptr(ak5386_dt_ids), diff --git a/sound/soc/codecs/ak5558.c b/sound/soc/codecs/ak5558.c new file mode 100644 index 000000000000..f4ed5cc40661 --- /dev/null +++ b/sound/soc/codecs/ak5558.c @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Audio driver for AK5558 ADC +// +// Copyright (C) 2015 Asahi Kasei Microdevices Corporation +// Copyright 2018 NXP + +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/pm_runtime.h> +#include <linux/regmap.h> +#include <linux/slab.h> + +#include <sound/initval.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#include <sound/tlv.h> + +#include "ak5558.h" + +/* AK5558 Codec Private Data */ +struct ak5558_priv { + struct snd_soc_component component; + struct regmap *regmap; + struct i2c_client *i2c; + struct gpio_desc *reset_gpiod; /* Reset & Power down GPIO */ + int slots; + int slot_width; +}; + +/* ak5558 register cache & default register settings */ +static const struct reg_default ak5558_reg[] = { + { 0x0, 0xFF }, /* 0x00 AK5558_00_POWER_MANAGEMENT1 */ + { 0x1, 0x01 }, /* 0x01 AK5558_01_POWER_MANAGEMENT2 */ + { 0x2, 0x01 }, /* 0x02 AK5558_02_CONTROL1 */ + { 0x3, 0x00 }, /* 0x03 AK5558_03_CONTROL2 */ + { 0x4, 0x00 }, /* 0x04 AK5558_04_CONTROL3 */ + { 0x5, 0x00 } /* 0x05 AK5558_05_DSD */ +}; + +static const char * const mono_texts[] = { + "8 Slot", "2 Slot", "4 Slot", "1 Slot", +}; + +static const struct soc_enum ak5558_mono_enum[] = { + SOC_ENUM_SINGLE(AK5558_01_POWER_MANAGEMENT2, 1, + ARRAY_SIZE(mono_texts), mono_texts), +}; + +static const char * const digfil_texts[] = { + "Sharp Roll-Off", "Show Roll-Off", + "Short Delay Sharp Roll-Off", "Short Delay Show Roll-Off", +}; + +static const struct soc_enum ak5558_adcset_enum[] = { + SOC_ENUM_SINGLE(AK5558_04_CONTROL3, 0, + ARRAY_SIZE(digfil_texts), digfil_texts), +}; + +static const struct snd_kcontrol_new ak5558_snd_controls[] = { + SOC_ENUM("AK5558 Monaural Mode", ak5558_mono_enum[0]), + SOC_ENUM("AK5558 Digital Filter", ak5558_adcset_enum[0]), +}; + +static const struct snd_soc_dapm_widget ak5558_dapm_widgets[] = { + /* Analog Input */ + SND_SOC_DAPM_INPUT("AIN1"), + SND_SOC_DAPM_INPUT("AIN2"), + SND_SOC_DAPM_INPUT("AIN3"), + SND_SOC_DAPM_INPUT("AIN4"), + SND_SOC_DAPM_INPUT("AIN5"), + SND_SOC_DAPM_INPUT("AIN6"), + SND_SOC_DAPM_INPUT("AIN7"), + SND_SOC_DAPM_INPUT("AIN8"), + + SND_SOC_DAPM_ADC("ADC Ch1", NULL, AK5558_00_POWER_MANAGEMENT1, 0, 0), + SND_SOC_DAPM_ADC("ADC Ch2", NULL, AK5558_00_POWER_MANAGEMENT1, 1, 0), + SND_SOC_DAPM_ADC("ADC Ch3", NULL, AK5558_00_POWER_MANAGEMENT1, 2, 0), + SND_SOC_DAPM_ADC("ADC Ch4", NULL, AK5558_00_POWER_MANAGEMENT1, 3, 0), + SND_SOC_DAPM_ADC("ADC Ch5", NULL, AK5558_00_POWER_MANAGEMENT1, 4, 0), + SND_SOC_DAPM_ADC("ADC Ch6", NULL, AK5558_00_POWER_MANAGEMENT1, 5, 0), + SND_SOC_DAPM_ADC("ADC Ch7", NULL, AK5558_00_POWER_MANAGEMENT1, 6, 0), + SND_SOC_DAPM_ADC("ADC Ch8", NULL, AK5558_00_POWER_MANAGEMENT1, 7, 0), + + SND_SOC_DAPM_AIF_OUT("SDTO", "Capture", 0, SND_SOC_NOPM, 0, 0), +}; + +static const struct snd_soc_dapm_route ak5558_intercon[] = { + {"ADC Ch1", NULL, "AIN1"}, + {"SDTO", NULL, "ADC Ch1"}, + + {"ADC Ch2", NULL, "AIN2"}, + {"SDTO", NULL, "ADC Ch2"}, + + {"ADC Ch3", NULL, "AIN3"}, + {"SDTO", NULL, "ADC Ch3"}, + + {"ADC Ch4", NULL, "AIN4"}, + {"SDTO", NULL, "ADC Ch4"}, + + {"ADC Ch5", NULL, "AIN5"}, + {"SDTO", NULL, "ADC Ch5"}, + + {"ADC Ch6", NULL, "AIN6"}, + {"SDTO", NULL, "ADC Ch6"}, + + {"ADC Ch7", NULL, "AIN7"}, + {"SDTO", NULL, "ADC Ch7"}, + + {"ADC Ch8", NULL, "AIN8"}, + {"SDTO", NULL, "ADC Ch8"}, +}; + +static int ak5558_set_mcki(struct snd_soc_component *component) +{ + return snd_soc_component_update_bits(component, AK5558_02_CONTROL1, AK5558_CKS, + AK5558_CKS_AUTO); +} + +static int ak5558_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct ak5558_priv *ak5558 = snd_soc_component_get_drvdata(component); + u8 bits; + int pcm_width = max(params_physical_width(params), ak5558->slot_width); + + /* set master/slave audio interface */ + bits = snd_soc_component_read32(component, AK5558_02_CONTROL1); + bits &= ~AK5558_BITS; + + switch (pcm_width) { + case 16: + bits |= AK5558_DIF_24BIT_MODE; + break; + case 32: + bits |= AK5558_DIF_32BIT_MODE; + break; + default: + return -EINVAL; + } + + snd_soc_component_update_bits(component, AK5558_02_CONTROL1, AK5558_BITS, bits); + + return 0; +} + +static int ak5558_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct snd_soc_component *component = dai->component; + u8 format; + + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + break; + case SND_SOC_DAIFMT_CBM_CFM: + break; + case SND_SOC_DAIFMT_CBS_CFM: + case SND_SOC_DAIFMT_CBM_CFS: + default: + dev_err(dai->dev, "Clock mode unsupported"); + return -EINVAL; + } + + /* set master/slave audio interface */ + format = snd_soc_component_read32(component, AK5558_02_CONTROL1); + format &= ~AK5558_DIF; + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + format |= AK5558_DIF_I2S_MODE; + break; + case SND_SOC_DAIFMT_LEFT_J: + format |= AK5558_DIF_MSB_MODE; + break; + case SND_SOC_DAIFMT_DSP_B: + format |= AK5558_DIF_MSB_MODE; + break; + default: + return -EINVAL; + } + + snd_soc_component_update_bits(component, AK5558_02_CONTROL1, AK5558_DIF, format); + + return 0; +} + +static int ak5558_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, + unsigned int rx_mask, int slots, + int slot_width) +{ + struct snd_soc_component *component = dai->component; + struct ak5558_priv *ak5558 = snd_soc_component_get_drvdata(component); + int tdm_mode; + + ak5558->slots = slots; + ak5558->slot_width = slot_width; + + switch (slots * slot_width) { + case 128: + tdm_mode = AK5558_MODE_TDM128; + break; + case 256: + tdm_mode = AK5558_MODE_TDM256; + break; + case 512: + tdm_mode = AK5558_MODE_TDM512; + break; + default: + tdm_mode = AK5558_MODE_NORMAL; + break; + } + + snd_soc_component_update_bits(component, AK5558_03_CONTROL2, AK5558_MODE_BITS, + tdm_mode); + return 0; +} + +#define AK5558_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ + SNDRV_PCM_FMTBIT_S24_LE |\ + SNDRV_PCM_FMTBIT_S32_LE) + +static const unsigned int ak5558_rates[] = { + 8000, 11025, 16000, 22050, + 32000, 44100, 48000, 88200, + 96000, 176400, 192000, 352800, + 384000, 705600, 768000, 1411200, + 2822400, +}; + +static const struct snd_pcm_hw_constraint_list ak5558_rate_constraints = { + .count = ARRAY_SIZE(ak5558_rates), + .list = ak5558_rates, +}; + +static int ak5558_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + return snd_pcm_hw_constraint_list(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, + &ak5558_rate_constraints); +} + +static struct snd_soc_dai_ops ak5558_dai_ops = { + .startup = ak5558_startup, + .hw_params = ak5558_hw_params, + + .set_fmt = ak5558_set_dai_fmt, + .set_tdm_slot = ak5558_set_tdm_slot, +}; + +static struct snd_soc_dai_driver ak5558_dai = { + .name = "ak5558-aif", + .capture = { + .stream_name = "Capture", + .channels_min = 1, + .channels_max = 8, + .rates = SNDRV_PCM_RATE_KNOT, + .formats = AK5558_FORMATS, + }, + .ops = &ak5558_dai_ops, +}; + +static void ak5558_power_off(struct ak5558_priv *ak5558) +{ + if (!ak5558->reset_gpiod) + return; + + gpiod_set_value_cansleep(ak5558->reset_gpiod, 0); + usleep_range(1000, 2000); +} + +static void ak5558_power_on(struct ak5558_priv *ak5558) +{ + if (!ak5558->reset_gpiod) + return; + + gpiod_set_value_cansleep(ak5558->reset_gpiod, 1); + usleep_range(1000, 2000); +} + +static int ak5558_probe(struct snd_soc_component *component) +{ + struct ak5558_priv *ak5558 = snd_soc_component_get_drvdata(component); + + ak5558_power_on(ak5558); + return ak5558_set_mcki(component); +} + +static void ak5558_remove(struct snd_soc_component *component) +{ + struct ak5558_priv *ak5558 = snd_soc_component_get_drvdata(component); + + ak5558_power_off(ak5558); +} + +static int __maybe_unused ak5558_runtime_suspend(struct device *dev) +{ + struct ak5558_priv *ak5558 = dev_get_drvdata(dev); + + regcache_cache_only(ak5558->regmap, true); + ak5558_power_off(ak5558); + + return 0; +} + +static int __maybe_unused ak5558_runtime_resume(struct device *dev) +{ + struct ak5558_priv *ak5558 = dev_get_drvdata(dev); + + ak5558_power_off(ak5558); + ak5558_power_on(ak5558); + + regcache_cache_only(ak5558->regmap, false); + regcache_mark_dirty(ak5558->regmap); + + return regcache_sync(ak5558->regmap); +} + +const struct dev_pm_ops ak5558_pm = { + SET_RUNTIME_PM_OPS(ak5558_runtime_suspend, ak5558_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) +}; + +struct snd_soc_component_driver soc_codec_dev_ak5558 = { + .probe = ak5558_probe, + .remove = ak5558_remove, + .controls = ak5558_snd_controls, + .num_controls = ARRAY_SIZE(ak5558_snd_controls), + .dapm_widgets = ak5558_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ak5558_dapm_widgets), + .dapm_routes = ak5558_intercon, + .num_dapm_routes = ARRAY_SIZE(ak5558_intercon), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; + +static const struct regmap_config ak5558_regmap = { + .reg_bits = 8, + .val_bits = 8, + + .max_register = AK5558_05_DSD, + .reg_defaults = ak5558_reg, + .num_reg_defaults = ARRAY_SIZE(ak5558_reg), + .cache_type = REGCACHE_RBTREE, +}; + +static int ak5558_i2c_probe(struct i2c_client *i2c) +{ + struct ak5558_priv *ak5558; + int ret = 0; + + ak5558 = devm_kzalloc(&i2c->dev, sizeof(*ak5558), GFP_KERNEL); + if (!ak5558) + return -ENOMEM; + + ak5558->regmap = devm_regmap_init_i2c(i2c, &ak5558_regmap); + if (IS_ERR(ak5558->regmap)) + return PTR_ERR(ak5558->regmap); + + i2c_set_clientdata(i2c, ak5558); + ak5558->i2c = i2c; + + ak5558->reset_gpiod = devm_gpiod_get_optional(&i2c->dev, "reset", + GPIOD_OUT_LOW); + if (IS_ERR(ak5558->reset_gpiod)) + return PTR_ERR(ak5558->reset_gpiod); + + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_codec_dev_ak5558, + &ak5558_dai, 1); + if (ret) + return ret; + + pm_runtime_enable(&i2c->dev); + + return 0; +} + +static int ak5558_i2c_remove(struct i2c_client *i2c) +{ + pm_runtime_disable(&i2c->dev); + + return 0; +} + +static const struct of_device_id ak5558_i2c_dt_ids[] = { + { .compatible = "asahi-kasei,ak5558"}, + { } +}; + +static struct i2c_driver ak5558_i2c_driver = { + .driver = { + .name = "ak5558", + .of_match_table = of_match_ptr(ak5558_i2c_dt_ids), + .pm = &ak5558_pm, + }, + .probe_new = ak5558_i2c_probe, + .remove = ak5558_i2c_remove, +}; + +module_i2c_driver(ak5558_i2c_driver); + +MODULE_AUTHOR("Junichi Wakasugi <wakasugi.jb@om.asahi-kasei.co.jp>"); +MODULE_AUTHOR("Mihai Serban <mihai.serban@nxp.com>"); +MODULE_DESCRIPTION("ASoC AK5558 ADC driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/codecs/ak5558.h b/sound/soc/codecs/ak5558.h new file mode 100644 index 000000000000..61059086f161 --- /dev/null +++ b/sound/soc/codecs/ak5558.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * Audio driver header for AK5558 + * + * Copyright (C) 2016 Asahi Kasei Microdevices Corporation + * Copyright 2018 NXP + */ + +#ifndef _AK5558_H +#define _AK5558_H + +#define AK5558_00_POWER_MANAGEMENT1 0x00 +#define AK5558_01_POWER_MANAGEMENT2 0x01 +#define AK5558_02_CONTROL1 0x02 +#define AK5558_03_CONTROL2 0x03 +#define AK5558_04_CONTROL3 0x04 +#define AK5558_05_DSD 0x05 + +/* AK5558_02_CONTROL1 fields */ +#define AK5558_DIF GENMASK(1, 1) +#define AK5558_DIF_MSB_MODE (0 << 1) +#define AK5558_DIF_I2S_MODE (1 << 1) + +#define AK5558_BITS GENMASK(2, 2) +#define AK5558_DIF_24BIT_MODE (0 << 2) +#define AK5558_DIF_32BIT_MODE (1 << 2) + +#define AK5558_CKS GENMASK(6, 3) +#define AK5558_CKS_128FS_192KHZ (0 << 3) +#define AK5558_CKS_192FS_192KHZ (1 << 3) +#define AK5558_CKS_256FS_48KHZ (2 << 3) +#define AK5558_CKS_256FS_96KHZ (3 << 3) +#define AK5558_CKS_384FS_96KHZ (4 << 3) +#define AK5558_CKS_384FS_48KHZ (5 << 3) +#define AK5558_CKS_512FS_48KHZ (6 << 3) +#define AK5558_CKS_768FS_48KHZ (7 << 3) +#define AK5558_CKS_64FS_384KHZ (8 << 3) +#define AK5558_CKS_32FS_768KHZ (9 << 3) +#define AK5558_CKS_96FS_384KHZ (10 << 3) +#define AK5558_CKS_48FS_768KHZ (11 << 3) +#define AK5558_CKS_64FS_768KHZ (12 << 3) +#define AK5558_CKS_1024FS_16KHZ (13 << 3) +#define AK5558_CKS_AUTO (15 << 3) + +/* AK5558_03_CONTROL2 fields */ +#define AK5558_MODE_BITS GENMASK(6, 5) +#define AK5558_MODE_NORMAL (0 << 5) +#define AK5558_MODE_TDM128 (1 << 5) +#define AK5558_MODE_TDM256 (2 << 5) +#define AK5558_MODE_TDM512 (3 << 5) + +#endif diff --git a/sound/soc/codecs/alc5623.c b/sound/soc/codecs/alc5623.c index 1db965a93632..981a32973c08 100644 --- a/sound/soc/codecs/alc5623.c +++ b/sound/soc/codecs/alc5623.c @@ -47,28 +47,28 @@ struct alc5623_priv { unsigned int jack_det_ctrl; }; -static inline int alc5623_reset(struct snd_soc_codec *codec) +static inline int alc5623_reset(struct snd_soc_component *component) { - return snd_soc_write(codec, ALC5623_RESET, 0); + return snd_soc_component_write(component, ALC5623_RESET, 0); } static int amp_mixer_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); /* to power-on/off class-d amp generators/speaker */ /* need to write to 'index-46h' register : */ /* so write index num (here 0x46) to reg 0x6a */ /* and then 0xffff/0 to reg 0x6c */ - snd_soc_write(codec, ALC5623_HID_CTRL_INDEX, 0x46); + snd_soc_component_write(component, ALC5623_HID_CTRL_INDEX, 0x46); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_write(codec, ALC5623_HID_CTRL_DATA, 0xFFFF); + snd_soc_component_write(component, ALC5623_HID_CTRL_DATA, 0xFFFF); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, ALC5623_HID_CTRL_DATA, 0); + snd_soc_component_write(component, ALC5623_HID_CTRL_DATA, 0); break; } @@ -526,7 +526,7 @@ static int alc5623_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { int i; - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int gbl_clk = 0, pll_div = 0; u16 reg; @@ -534,12 +534,12 @@ static int alc5623_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, return -ENODEV; /* Disable PLL power */ - snd_soc_update_bits(codec, ALC5623_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5623_PWR_MANAG_ADD2, ALC5623_PWR_ADD2_PLL, 0); /* pll is not used in slave mode */ - reg = snd_soc_read(codec, ALC5623_DAI_CONTROL); + reg = snd_soc_component_read32(component, ALC5623_DAI_CONTROL); if (reg & ALC5623_DAI_SDP_SLAVE_MODE) return 0; @@ -575,13 +575,13 @@ static int alc5623_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, if (!pll_div) return -EINVAL; - snd_soc_write(codec, ALC5623_GLOBAL_CLK_CTRL_REG, gbl_clk); - snd_soc_write(codec, ALC5623_PLL_CTRL, pll_div); - snd_soc_update_bits(codec, ALC5623_PWR_MANAG_ADD2, + snd_soc_component_write(component, ALC5623_GLOBAL_CLK_CTRL_REG, gbl_clk); + snd_soc_component_write(component, ALC5623_PLL_CTRL, pll_div); + snd_soc_component_update_bits(component, ALC5623_PWR_MANAG_ADD2, ALC5623_PWR_ADD2_PLL, ALC5623_PWR_ADD2_PLL); gbl_clk |= ALC5623_GBL_CLK_SYS_SOUR_SEL_PLL; - snd_soc_write(codec, ALC5623_GLOBAL_CLK_CTRL_REG, gbl_clk); + snd_soc_component_write(component, ALC5623_GLOBAL_CLK_CTRL_REG, gbl_clk); return 0; } @@ -604,9 +604,9 @@ static const struct _coeff_div coeff_div[] = { {384*1, 0x0c6b}, }; -static int get_coeff(struct snd_soc_codec *codec, int rate) +static int get_coeff(struct snd_soc_component *component, int rate) { - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < ARRAY_SIZE(coeff_div); i++) { @@ -622,8 +622,8 @@ static int get_coeff(struct snd_soc_codec *codec, int rate) static int alc5623_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); switch (freq) { case 8192000: @@ -643,7 +643,7 @@ static int alc5623_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int alc5623_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u16 iface = 0; /* set master/slave audio interface */ @@ -695,18 +695,18 @@ static int alc5623_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - return snd_soc_write(codec, ALC5623_DAI_CONTROL, iface); + return snd_soc_component_write(component, ALC5623_DAI_CONTROL, iface); } static int alc5623_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); int coeff, rate; u16 iface; - iface = snd_soc_read(codec, ALC5623_DAI_CONTROL); + iface = snd_soc_component_read32(component, ALC5623_DAI_CONTROL); iface &= ~ALC5623_DAI_I2S_DL_MASK; /* bit size */ @@ -728,30 +728,30 @@ static int alc5623_pcm_hw_params(struct snd_pcm_substream *substream, } /* set iface & srate */ - snd_soc_write(codec, ALC5623_DAI_CONTROL, iface); + snd_soc_component_write(component, ALC5623_DAI_CONTROL, iface); rate = params_rate(params); - coeff = get_coeff(codec, rate); + coeff = get_coeff(component, rate); if (coeff < 0) return -EINVAL; coeff = coeff_div[coeff].regvalue; - dev_dbg(codec->dev, "%s: sysclk=%d,rate=%d,coeff=0x%04x\n", + dev_dbg(component->dev, "%s: sysclk=%d,rate=%d,coeff=0x%04x\n", __func__, alc5623->sysclk, rate, coeff); - snd_soc_write(codec, ALC5623_STEREO_AD_DA_CLK_CTRL, coeff); + snd_soc_component_write(component, ALC5623_STEREO_AD_DA_CLK_CTRL, coeff); return 0; } static int alc5623_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 hp_mute = ALC5623_MISC_M_DAC_L_INPUT | ALC5623_MISC_M_DAC_R_INPUT; - u16 mute_reg = snd_soc_read(codec, ALC5623_MISC_CTRL) & ~hp_mute; + u16 mute_reg = snd_soc_component_read32(component, ALC5623_MISC_CTRL) & ~hp_mute; if (mute) mute_reg |= hp_mute; - return snd_soc_write(codec, ALC5623_MISC_CTRL, mute_reg); + return snd_soc_component_write(component, ALC5623_MISC_CTRL, mute_reg); } #define ALC5623_ADD2_POWER_EN (ALC5623_PWR_ADD2_VREF \ @@ -769,60 +769,60 @@ static int alc5623_mute(struct snd_soc_dai *dai, int mute) (ALC5623_PWR_ADD1_SHORT_CURR_DET_EN \ | ALC5623_PWR_ADD1_HP_OUT_AMP) -static void enable_power_depop(struct snd_soc_codec *codec) +static void enable_power_depop(struct snd_soc_component *component) { - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); - snd_soc_update_bits(codec, ALC5623_PWR_MANAG_ADD1, + snd_soc_component_update_bits(component, ALC5623_PWR_MANAG_ADD1, ALC5623_PWR_ADD1_SOFTGEN_EN, ALC5623_PWR_ADD1_SOFTGEN_EN); - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD3, ALC5623_ADD3_POWER_EN); + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD3, ALC5623_ADD3_POWER_EN); - snd_soc_update_bits(codec, ALC5623_MISC_CTRL, + snd_soc_component_update_bits(component, ALC5623_MISC_CTRL, ALC5623_MISC_HP_DEPOP_MODE2_EN, ALC5623_MISC_HP_DEPOP_MODE2_EN); msleep(500); - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD2, ALC5623_ADD2_POWER_EN); + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD2, ALC5623_ADD2_POWER_EN); /* avoid writing '1' into 5622 reserved bits */ if (alc5623->id == 0x22) - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD1, + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD1, ALC5623_ADD1_POWER_EN_5622); else - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD1, + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD1, ALC5623_ADD1_POWER_EN); /* disable HP Depop2 */ - snd_soc_update_bits(codec, ALC5623_MISC_CTRL, + snd_soc_component_update_bits(component, ALC5623_MISC_CTRL, ALC5623_MISC_HP_DEPOP_MODE2_EN, 0); } -static int alc5623_set_bias_level(struct snd_soc_codec *codec, +static int alc5623_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: - enable_power_depop(codec); + enable_power_depop(component); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* everything off except vref/vmid, */ - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD2, + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD2, ALC5623_PWR_ADD2_VREF); - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD3, + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD3, ALC5623_PWR_ADD3_MAIN_BIAS); break; case SND_SOC_BIAS_OFF: /* everything off, dac mute, inactive */ - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD2, 0); - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD3, 0); - snd_soc_write(codec, ALC5623_PWR_MANAG_ADD1, 0); + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD2, 0); + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD3, 0); + snd_soc_component_write(component, ALC5623_PWR_MANAG_ADD1, 0); break; } return 0; @@ -862,25 +862,25 @@ static struct snd_soc_dai_driver alc5623_dai = { .ops = &alc5623_dai_ops, }; -static int alc5623_suspend(struct snd_soc_codec *codec) +static int alc5623_suspend(struct snd_soc_component *component) { - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); regcache_cache_only(alc5623->regmap, true); return 0; } -static int alc5623_resume(struct snd_soc_codec *codec) +static int alc5623_resume(struct snd_soc_component *component) { - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); int ret; /* Sync reg_cache with the hardware */ regcache_cache_only(alc5623->regmap, false); ret = regcache_sync(alc5623->regmap); if (ret != 0) { - dev_err(codec->dev, "Failed to sync register cache: %d\n", + dev_err(component->dev, "Failed to sync register cache: %d\n", ret); regcache_cache_only(alc5623->regmap, true); return ret; @@ -889,41 +889,41 @@ static int alc5623_resume(struct snd_soc_codec *codec) return 0; } -static int alc5623_probe(struct snd_soc_codec *codec) +static int alc5623_probe(struct snd_soc_component *component) { - struct alc5623_priv *alc5623 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct alc5623_priv *alc5623 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); - alc5623_reset(codec); + alc5623_reset(component); if (alc5623->add_ctrl) { - snd_soc_write(codec, ALC5623_ADD_CTRL_REG, + snd_soc_component_write(component, ALC5623_ADD_CTRL_REG, alc5623->add_ctrl); } if (alc5623->jack_det_ctrl) { - snd_soc_write(codec, ALC5623_JACK_DET_CTRL, + snd_soc_component_write(component, ALC5623_JACK_DET_CTRL, alc5623->jack_det_ctrl); } switch (alc5623->id) { case 0x21: - snd_soc_add_codec_controls(codec, alc5621_vol_snd_controls, + snd_soc_add_component_controls(component, alc5621_vol_snd_controls, ARRAY_SIZE(alc5621_vol_snd_controls)); break; case 0x22: - snd_soc_add_codec_controls(codec, alc5622_vol_snd_controls, + snd_soc_add_component_controls(component, alc5622_vol_snd_controls, ARRAY_SIZE(alc5622_vol_snd_controls)); break; case 0x23: - snd_soc_add_codec_controls(codec, alc5623_vol_snd_controls, + snd_soc_add_component_controls(component, alc5623_vol_snd_controls, ARRAY_SIZE(alc5623_vol_snd_controls)); break; default: return -EINVAL; } - snd_soc_add_codec_controls(codec, alc5623_snd_controls, + snd_soc_add_component_controls(component, alc5623_snd_controls, ARRAY_SIZE(alc5623_snd_controls)); snd_soc_dapm_new_controls(dapm, alc5623_dapm_widgets, @@ -951,12 +951,16 @@ static int alc5623_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_device_alc5623 = { - .probe = alc5623_probe, - .suspend = alc5623_suspend, - .resume = alc5623_resume, - .set_bias_level = alc5623_set_bias_level, - .suspend_bias_off = true, +static const struct snd_soc_component_driver soc_component_device_alc5623 = { + .probe = alc5623_probe, + .suspend = alc5623_suspend, + .resume = alc5623_resume, + .set_bias_level = alc5623_set_bias_level, + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config alc5623_regmap = { @@ -1052,20 +1056,14 @@ static int alc5623_i2c_probe(struct i2c_client *client, i2c_set_clientdata(client, alc5623); - ret = snd_soc_register_codec(&client->dev, - &soc_codec_device_alc5623, &alc5623_dai, 1); + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_device_alc5623, &alc5623_dai, 1); if (ret != 0) dev_err(&client->dev, "Failed to register codec: %d\n", ret); return ret; } -static int alc5623_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id alc5623_i2c_table[] = { {"alc5621", 0x21}, {"alc5622", 0x22}, @@ -1087,7 +1085,6 @@ static struct i2c_driver alc5623_i2c_driver = { .of_match_table = of_match_ptr(alc5623_of_match), }, .probe = alc5623_i2c_probe, - .remove = alc5623_i2c_remove, .id_table = alc5623_i2c_table, }; diff --git a/sound/soc/codecs/alc5632.c b/sound/soc/codecs/alc5632.c index adb80d8719bd..08034a6d4c5a 100644 --- a/sound/soc/codecs/alc5632.c +++ b/sound/soc/codecs/alc5632.c @@ -116,20 +116,20 @@ static inline int alc5632_reset(struct regmap *map) static int amp_mixer_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); /* to power-on/off class-d amp generators/speaker */ /* need to write to 'index-46h' register : */ /* so write index num (here 0x46) to reg 0x6a */ /* and then 0xffff/0 to reg 0x6c */ - snd_soc_write(codec, ALC5632_HID_CTRL_INDEX, 0x46); + snd_soc_component_write(component, ALC5632_HID_CTRL_INDEX, 0x46); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_write(codec, ALC5632_HID_CTRL_DATA, 0xFFFF); + snd_soc_component_write(component, ALC5632_HID_CTRL_DATA, 0xFFFF); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, ALC5632_HID_CTRL_DATA, 0); + snd_soc_component_write(component, ALC5632_HID_CTRL_DATA, 0); break; } @@ -681,7 +681,7 @@ static int alc5632_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { int i; - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int gbl_clk = 0, pll_div = 0; u16 reg; @@ -689,15 +689,15 @@ static int alc5632_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, return -EINVAL; /* Disable PLL power */ - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_ADD2_PLL1, 0); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_ADD2_PLL2, 0); /* pll is not used in slave mode */ - reg = snd_soc_read(codec, ALC5632_DAI_CONTROL); + reg = snd_soc_component_read32(component, ALC5632_DAI_CONTROL); if (reg & ALC5632_DAI_SDP_SLAVE_MODE) return 0; @@ -745,19 +745,19 @@ static int alc5632_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, return -EINVAL; /* choose MCLK/BCLK/VBCLK */ - snd_soc_write(codec, ALC5632_GPCR2, gbl_clk); + snd_soc_component_write(component, ALC5632_GPCR2, gbl_clk); /* choose PLL1 clock rate */ - snd_soc_write(codec, ALC5632_PLL1_CTRL, pll_div); + snd_soc_component_write(component, ALC5632_PLL1_CTRL, pll_div); /* enable PLL1 */ - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_ADD2_PLL1, ALC5632_PWR_ADD2_PLL1); /* enable PLL2 */ - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_ADD2_PLL2, ALC5632_PWR_ADD2_PLL2); /* use PLL1 as main SYSCLK */ - snd_soc_update_bits(codec, ALC5632_GPCR1, + snd_soc_component_update_bits(component, ALC5632_GPCR1, ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1, ALC5632_GPCR1_CLK_SYS_SRC_SEL_PLL1); @@ -775,9 +775,9 @@ static const struct _coeff_div coeff_div[] = { {512*1, 0x3075}, }; -static int get_coeff(struct snd_soc_codec *codec, int rate) +static int get_coeff(struct snd_soc_component *component, int rate) { - struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec); + struct alc5632_priv *alc5632 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < ARRAY_SIZE(coeff_div); i++) { @@ -793,8 +793,8 @@ static int get_coeff(struct snd_soc_codec *codec, int rate) static int alc5632_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct alc5632_priv *alc5632 = snd_soc_component_get_drvdata(component); switch (freq) { case 4096000: @@ -815,7 +815,7 @@ static int alc5632_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int alc5632_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u16 iface = 0; /* set master/slave audio interface */ @@ -864,17 +864,17 @@ static int alc5632_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - return snd_soc_write(codec, ALC5632_DAI_CONTROL, iface); + return snd_soc_component_write(component, ALC5632_DAI_CONTROL, iface); } static int alc5632_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int coeff, rate; u16 iface; - iface = snd_soc_read(codec, ALC5632_DAI_CONTROL); + iface = snd_soc_component_read32(component, ALC5632_DAI_CONTROL); iface &= ~ALC5632_DAI_I2S_DL_MASK; /* bit size */ @@ -893,29 +893,29 @@ static int alc5632_pcm_hw_params(struct snd_pcm_substream *substream, } /* set iface & srate */ - snd_soc_write(codec, ALC5632_DAI_CONTROL, iface); + snd_soc_component_write(component, ALC5632_DAI_CONTROL, iface); rate = params_rate(params); - coeff = get_coeff(codec, rate); + coeff = get_coeff(component, rate); if (coeff < 0) return -EINVAL; coeff = coeff_div[coeff].regvalue; - snd_soc_write(codec, ALC5632_DAC_CLK_CTRL1, coeff); + snd_soc_component_write(component, ALC5632_DAC_CLK_CTRL1, coeff); return 0; } static int alc5632_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 hp_mute = ALC5632_MISC_HP_DEPOP_MUTE_L |ALC5632_MISC_HP_DEPOP_MUTE_R; - u16 mute_reg = snd_soc_read(codec, ALC5632_MISC_CTRL) & ~hp_mute; + u16 mute_reg = snd_soc_component_read32(component, ALC5632_MISC_CTRL) & ~hp_mute; if (mute) mute_reg |= hp_mute; - return snd_soc_write(codec, ALC5632_MISC_CTRL, mute_reg); + return snd_soc_component_write(component, ALC5632_MISC_CTRL, mute_reg); } #define ALC5632_ADD2_POWER_EN (ALC5632_PWR_ADD2_VREF) @@ -929,73 +929,73 @@ static int alc5632_mute(struct snd_soc_dai *dai, int mute) | ALC5632_PWR_ADD1_HP_OUT_ENH_AMP \ | ALC5632_PWR_ADD1_MAIN_BIAS) -static void enable_power_depop(struct snd_soc_codec *codec) +static void enable_power_depop(struct snd_soc_component *component) { - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD1, ALC5632_PWR_ADD1_SOFTGEN_EN, ALC5632_PWR_ADD1_SOFTGEN_EN); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD3, ALC5632_ADD3_POWER_EN, ALC5632_ADD3_POWER_EN); - snd_soc_update_bits(codec, ALC5632_MISC_CTRL, + snd_soc_component_update_bits(component, ALC5632_MISC_CTRL, ALC5632_MISC_HP_DEPOP_MODE2_EN, ALC5632_MISC_HP_DEPOP_MODE2_EN); /* "normal" mode: 0 @ 26 */ /* set all PR0-7 mixers to 0 */ - snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS, + snd_soc_component_update_bits(component, ALC5632_PWR_DOWN_CTRL_STATUS, ALC5632_PWR_DOWN_CTRL_STATUS_MASK, 0); msleep(500); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_ADD2_POWER_EN, ALC5632_ADD2_POWER_EN); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD1, ALC5632_ADD1_POWER_EN, ALC5632_ADD1_POWER_EN); /* disable HP Depop2 */ - snd_soc_update_bits(codec, ALC5632_MISC_CTRL, + snd_soc_component_update_bits(component, ALC5632_MISC_CTRL, ALC5632_MISC_HP_DEPOP_MODE2_EN, 0); } -static int alc5632_set_bias_level(struct snd_soc_codec *codec, +static int alc5632_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: - enable_power_depop(codec); + enable_power_depop(component); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* everything off except vref/vmid, */ - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD1, ALC5632_PWR_MANAG_ADD1_MASK, ALC5632_PWR_ADD1_MAIN_BIAS); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_MANAG_ADD2_MASK, ALC5632_PWR_ADD2_VREF); /* "normal" mode: 0 @ 26 */ - snd_soc_update_bits(codec, ALC5632_PWR_DOWN_CTRL_STATUS, + snd_soc_component_update_bits(component, ALC5632_PWR_DOWN_CTRL_STATUS, ALC5632_PWR_DOWN_CTRL_STATUS_MASK, 0xffff ^ (ALC5632_PWR_VREF_PR3 | ALC5632_PWR_VREF_PR2)); break; case SND_SOC_BIAS_OFF: /* everything off, dac mute, inactive */ - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD2, ALC5632_PWR_MANAG_ADD2_MASK, 0); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD3, ALC5632_PWR_MANAG_ADD3_MASK, 0); - snd_soc_update_bits(codec, ALC5632_PWR_MANAG_ADD1, + snd_soc_component_update_bits(component, ALC5632_PWR_MANAG_ADD1, ALC5632_PWR_MANAG_ADD1_MASK, 0); break; } @@ -1038,9 +1038,9 @@ static struct snd_soc_dai_driver alc5632_dai = { }; #ifdef CONFIG_PM -static int alc5632_resume(struct snd_soc_codec *codec) +static int alc5632_resume(struct snd_soc_component *component) { - struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec); + struct alc5632_priv *alc5632 = snd_soc_component_get_drvdata(component); regcache_sync(alc5632->regmap); @@ -1050,13 +1050,13 @@ static int alc5632_resume(struct snd_soc_codec *codec) #define alc5632_resume NULL #endif -static int alc5632_probe(struct snd_soc_codec *codec) +static int alc5632_probe(struct snd_soc_component *component) { - struct alc5632_priv *alc5632 = snd_soc_codec_get_drvdata(codec); + struct alc5632_priv *alc5632 = snd_soc_component_get_drvdata(component); switch (alc5632->id) { case 0x5c: - snd_soc_add_codec_controls(codec, alc5632_vol_snd_controls, + snd_soc_add_component_controls(component, alc5632_vol_snd_controls, ARRAY_SIZE(alc5632_vol_snd_controls)); break; default: @@ -1066,20 +1066,21 @@ static int alc5632_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_device_alc5632 = { - .probe = alc5632_probe, - .resume = alc5632_resume, - .set_bias_level = alc5632_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = alc5632_snd_controls, - .num_controls = ARRAY_SIZE(alc5632_snd_controls), - .dapm_widgets = alc5632_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(alc5632_dapm_widgets), - .dapm_routes = alc5632_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(alc5632_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_device_alc5632 = { + .probe = alc5632_probe, + .resume = alc5632_resume, + .set_bias_level = alc5632_set_bias_level, + .controls = alc5632_snd_controls, + .num_controls = ARRAY_SIZE(alc5632_snd_controls), + .dapm_widgets = alc5632_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(alc5632_dapm_widgets), + .dapm_routes = alc5632_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(alc5632_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config alc5632_regmap = { @@ -1151,23 +1152,17 @@ static int alc5632_i2c_probe(struct i2c_client *client, return -EINVAL; } - ret = snd_soc_register_codec(&client->dev, - &soc_codec_device_alc5632, &alc5632_dai, 1); + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_device_alc5632, &alc5632_dai, 1); if (ret < 0) { - dev_err(&client->dev, "Failed to register codec: %d\n", ret); + dev_err(&client->dev, "Failed to register component: %d\n", ret); return ret; } return ret; } -static int alc5632_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id alc5632_i2c_table[] = { {"alc5632", 0x5c}, {} @@ -1187,7 +1182,6 @@ static struct i2c_driver alc5632_i2c_driver = { .of_match_table = of_match_ptr(alc5632_of_match), }, .probe = alc5632_i2c_probe, - .remove = alc5632_i2c_remove, .id_table = alc5632_i2c_table, }; diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index b3375e19598a..5727ea079ad7 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c @@ -84,13 +84,14 @@ static int arizona_spk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); int val; switch (event) { case SND_SOC_DAPM_POST_PMU: - val = snd_soc_read(codec, ARIZONA_INTERRUPT_RAW_STATUS_3); + val = snd_soc_component_read32(component, + ARIZONA_INTERRUPT_RAW_STATUS_3); if (val & ARIZONA_SPK_OVERHEAT_STS) { dev_crit(arizona->dev, "Speaker not enabled due to temperature\n"); @@ -169,10 +170,10 @@ static const struct snd_soc_dapm_widget arizona_spkr = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD); -int arizona_init_spk(struct snd_soc_codec *codec) +int arizona_init_spk(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int ret; @@ -238,10 +239,10 @@ static const struct snd_soc_dapm_route arizona_mono_routes[] = { { "OUT6R", NULL, "OUT6L" }, }; -int arizona_init_mono(struct snd_soc_codec *codec) +int arizona_init_mono(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int i; @@ -255,11 +256,9 @@ int arizona_init_mono(struct snd_soc_codec *codec) } EXPORT_SYMBOL_GPL(arizona_init_mono); -int arizona_init_gpio(struct snd_soc_codec *codec) +int arizona_init_gpio(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int i; @@ -643,7 +642,6 @@ const unsigned int arizona_rate_val[ARIZONA_RATE_ENUM_SIZE] = { }; EXPORT_SYMBOL_GPL(arizona_rate_val); - const struct soc_enum arizona_isrc_fsh[] = { SOC_VALUE_ENUM_SINGLE(ARIZONA_ISRC_1_CTRL_1, ARIZONA_ISRC1_FSH_SHIFT, 0xf, @@ -882,9 +880,9 @@ const struct snd_kcontrol_new arizona_voice_trigger_switch[] = { }; EXPORT_SYMBOL_GPL(arizona_voice_trigger_switch); -static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena) +static void arizona_in_set_vu(struct snd_soc_component *component, int ena) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); unsigned int val; int i; @@ -894,15 +892,15 @@ static void arizona_in_set_vu(struct snd_soc_codec *codec, int ena) val = 0; for (i = 0; i < priv->num_inputs; i++) - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 4), ARIZONA_IN_VU, val); } -bool arizona_input_analog(struct snd_soc_codec *codec, int shift) +bool arizona_input_analog(struct snd_soc_component *component, int shift) { unsigned int reg = ARIZONA_IN1L_CONTROL + ((shift / 2) * 8); - unsigned int val = snd_soc_read(codec, reg); + unsigned int val = snd_soc_component_read32(component, reg); return !(val & ARIZONA_IN1_MODE_MASK); } @@ -911,8 +909,8 @@ EXPORT_SYMBOL_GPL(arizona_input_analog); int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); unsigned int reg; if (w->shift % 2) @@ -925,25 +923,26 @@ int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, priv->in_pending++; break; case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, reg, ARIZONA_IN1L_MUTE, 0); + snd_soc_component_update_bits(component, reg, + ARIZONA_IN1L_MUTE, 0); /* If this is the last input pending then allow VU */ priv->in_pending--; if (priv->in_pending == 0) { msleep(1); - arizona_in_set_vu(codec, 1); + arizona_in_set_vu(component, 1); } break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, ARIZONA_IN1L_MUTE | ARIZONA_IN_VU, ARIZONA_IN1L_MUTE | ARIZONA_IN_VU); break; case SND_SOC_DAPM_POST_PMD: /* Disable volume updates if no inputs are enabled */ - reg = snd_soc_read(codec, ARIZONA_INPUT_ENABLES); + reg = snd_soc_component_read32(component, ARIZONA_INPUT_ENABLES); if (reg == 0) - arizona_in_set_vu(codec, 0); + arizona_in_set_vu(component, 0); break; default: break; @@ -957,8 +956,8 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; switch (event) { @@ -1001,7 +1000,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, case ARIZONA_OUT4R_ENA_SHIFT: priv->out_up_pending--; if (!priv->out_up_pending && priv->out_up_delay) { - dev_dbg(codec->dev, "Power up delay: %d\n", + dev_dbg(component->dev, "Power up delay: %d\n", priv->out_up_delay); msleep(priv->out_up_delay); priv->out_up_delay = 0; @@ -1054,7 +1053,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, case ARIZONA_OUT4R_ENA_SHIFT: priv->out_down_pending--; if (!priv->out_down_pending && priv->out_down_delay) { - dev_dbg(codec->dev, "Power down delay: %d\n", + dev_dbg(component->dev, "Power down delay: %d\n", priv->out_down_delay); msleep(priv->out_down_delay); priv->out_down_delay = 0; @@ -1072,12 +1071,11 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, } EXPORT_SYMBOL_GPL(arizona_out_ev); -int arizona_hp_ev(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, - int event) +int arizona_hp_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, + int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; unsigned int mask = 1 << w->shift; unsigned int val; @@ -1111,15 +1109,15 @@ int arizona_hp_ev(struct snd_soc_dapm_widget *w, } EXPORT_SYMBOL_GPL(arizona_hp_ev); -static int arizona_dvfs_enable(struct snd_soc_codec *codec) +static int arizona_dvfs_enable(struct snd_soc_component *component) { - const struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + const struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int ret; ret = regulator_set_voltage(arizona->dcvdd, 1800000, 1800000); if (ret) { - dev_err(codec->dev, "Failed to boost DCVDD: %d\n", ret); + dev_err(component->dev, "Failed to boost DCVDD: %d\n", ret); return ret; } @@ -1128,7 +1126,7 @@ static int arizona_dvfs_enable(struct snd_soc_codec *codec) ARIZONA_SUBSYS_MAX_FREQ, ARIZONA_SUBSYS_MAX_FREQ); if (ret) { - dev_err(codec->dev, "Failed to enable subsys max: %d\n", ret); + dev_err(component->dev, "Failed to enable subsys max: %d\n", ret); regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); return ret; } @@ -1136,9 +1134,9 @@ static int arizona_dvfs_enable(struct snd_soc_codec *codec) return 0; } -static int arizona_dvfs_disable(struct snd_soc_codec *codec) +static int arizona_dvfs_disable(struct snd_soc_component *component) { - const struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + const struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int ret; @@ -1146,28 +1144,28 @@ static int arizona_dvfs_disable(struct snd_soc_codec *codec) ARIZONA_DYNAMIC_FREQUENCY_SCALING_1, ARIZONA_SUBSYS_MAX_FREQ, 0); if (ret) { - dev_err(codec->dev, "Failed to disable subsys max: %d\n", ret); + dev_err(component->dev, "Failed to disable subsys max: %d\n", ret); return ret; } ret = regulator_set_voltage(arizona->dcvdd, 1200000, 1800000); if (ret) { - dev_err(codec->dev, "Failed to unboost DCVDD: %d\n", ret); + dev_err(component->dev, "Failed to unboost DCVDD: %d\n", ret); return ret; } return 0; } -int arizona_dvfs_up(struct snd_soc_codec *codec, unsigned int flags) +int arizona_dvfs_up(struct snd_soc_component *component, unsigned int flags) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); int ret = 0; mutex_lock(&priv->dvfs_lock); if (!priv->dvfs_cached && !priv->dvfs_reqs) { - ret = arizona_dvfs_enable(codec); + ret = arizona_dvfs_enable(component); if (ret) goto err; } @@ -1179,9 +1177,9 @@ err: } EXPORT_SYMBOL_GPL(arizona_dvfs_up); -int arizona_dvfs_down(struct snd_soc_codec *codec, unsigned int flags) +int arizona_dvfs_down(struct snd_soc_component *component, unsigned int flags) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); unsigned int old_reqs; int ret = 0; @@ -1191,7 +1189,7 @@ int arizona_dvfs_down(struct snd_soc_codec *codec, unsigned int flags) priv->dvfs_reqs &= ~flags; if (!priv->dvfs_cached && old_reqs && !priv->dvfs_reqs) - ret = arizona_dvfs_disable(codec); + ret = arizona_dvfs_disable(component); mutex_unlock(&priv->dvfs_lock); return ret; @@ -1201,8 +1199,8 @@ EXPORT_SYMBOL_GPL(arizona_dvfs_down); int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); int ret = 0; mutex_lock(&priv->dvfs_lock); @@ -1210,7 +1208,7 @@ int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: if (priv->dvfs_reqs) - ret = arizona_dvfs_enable(codec); + ret = arizona_dvfs_enable(component); priv->dvfs_cached = false; break; @@ -1222,7 +1220,7 @@ int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w, priv->dvfs_cached = true; if (priv->dvfs_reqs) - ret = arizona_dvfs_disable(codec); + ret = arizona_dvfs_disable(component); break; default: break; @@ -1243,7 +1241,7 @@ int arizona_anc_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int val; switch (event) { @@ -1257,7 +1255,7 @@ int arizona_anc_ev(struct snd_soc_dapm_widget *w, return 0; } - snd_soc_write(codec, ARIZONA_CLOCK_CONTROL, val); + snd_soc_component_write(component, ARIZONA_CLOCK_CONTROL, val); return 0; } @@ -1277,10 +1275,10 @@ static unsigned int arizona_opclk_ref_44k1_rates[] = { 45158400, }; -static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk, - unsigned int freq) +static int arizona_set_opclk(struct snd_soc_component *component, + unsigned int clk, unsigned int freq) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); unsigned int reg; unsigned int *rates; int ref, div, refclk; @@ -1304,13 +1302,13 @@ static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk, rates = arizona_opclk_ref_48k_rates; for (ref = 0; ref < ARRAY_SIZE(arizona_opclk_ref_48k_rates) && - rates[ref] <= refclk; ref++) { + rates[ref] <= refclk; ref++) { div = 1; while (rates[ref] / div >= freq && div < 32) { if (rates[ref] / div == freq) { - dev_dbg(codec->dev, "Configured %dHz OPCLK\n", + dev_dbg(component->dev, "Configured %dHz OPCLK\n", freq); - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, ARIZONA_OPCLK_DIV_MASK | ARIZONA_OPCLK_SEL_MASK, (div << @@ -1322,22 +1320,22 @@ static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk, } } - dev_err(codec->dev, "Unable to generate %dHz OPCLK\n", freq); + dev_err(component->dev, "Unable to generate %dHz OPCLK\n", freq); return -EINVAL; } int arizona_clk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); unsigned int val; int clk_idx; int ret; ret = regmap_read(arizona->regmap, w->reg, &val); if (ret) { - dev_err(codec->dev, "Failed to check clock source: %d\n", ret); + dev_err(component->dev, "Failed to check clock source: %d\n", ret); return ret; } @@ -1366,10 +1364,10 @@ int arizona_clk_ev(struct snd_soc_dapm_widget *w, } EXPORT_SYMBOL_GPL(arizona_clk_ev); -int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, +int arizona_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; char *name; unsigned int reg; @@ -1391,7 +1389,7 @@ int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, break; case ARIZONA_CLK_OPCLK: case ARIZONA_CLK_ASYNC_OPCLK: - return arizona_set_opclk(codec, clk_id, freq); + return arizona_set_opclk(component, clk_id, freq); default: return -EINVAL; } @@ -1445,8 +1443,8 @@ EXPORT_SYMBOL_GPL(arizona_set_sysclk); static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int lrclk, bclk, mode, base; @@ -1620,8 +1618,8 @@ static const struct snd_pcm_hw_constraint_list arizona_constraint = { static int arizona_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; unsigned int base_rate; @@ -1651,10 +1649,10 @@ static int arizona_startup(struct snd_pcm_substream *substream, &dai_priv->constraint); } -static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec, +static void arizona_wm5102_set_dac_comp(struct snd_soc_component *component, unsigned int rate) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; struct reg_sequence dac_comp[] = { { 0x80, 0x3 }, @@ -1680,8 +1678,8 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; int base = dai->driver->base; int i, sr_val, ret; @@ -1704,9 +1702,9 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream, case WM5102: case WM8997: if (arizona_sr_vals[sr_val] >= 88200) - ret = arizona_dvfs_up(codec, ARIZONA_DVFS_SR1_RQ); + ret = arizona_dvfs_up(component, ARIZONA_DVFS_SR1_RQ); else - ret = arizona_dvfs_down(codec, ARIZONA_DVFS_SR1_RQ); + ret = arizona_dvfs_down(component, ARIZONA_DVFS_SR1_RQ); if (ret) { arizona_aif_err(dai, "Failed to change DVFS %d\n", ret); @@ -1721,26 +1719,31 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream, case ARIZONA_CLK_SYSCLK: switch (priv->arizona->type) { case WM5102: - arizona_wm5102_set_dac_comp(codec, + arizona_wm5102_set_dac_comp(component, params_rate(params)); break; default: break; } - snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1, - ARIZONA_SAMPLE_RATE_1_MASK, sr_val); + snd_soc_component_update_bits(component, ARIZONA_SAMPLE_RATE_1, + ARIZONA_SAMPLE_RATE_1_MASK, + sr_val); if (base) - snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, - ARIZONA_AIF1_RATE_MASK, 0); + snd_soc_component_update_bits(component, + base + ARIZONA_AIF_RATE_CTRL, + ARIZONA_AIF1_RATE_MASK, 0); break; case ARIZONA_CLK_ASYNCCLK: - snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, - ARIZONA_ASYNC_SAMPLE_RATE_1_MASK, sr_val); + snd_soc_component_update_bits(component, + ARIZONA_ASYNC_SAMPLE_RATE_1, + ARIZONA_ASYNC_SAMPLE_RATE_1_MASK, + sr_val); if (base) - snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, - ARIZONA_AIF1_RATE_MASK, - 8 << ARIZONA_AIF1_RATE_SHIFT); + snd_soc_component_update_bits(component, + base + ARIZONA_AIF_RATE_CTRL, + ARIZONA_AIF1_RATE_MASK, + 8 << ARIZONA_AIF1_RATE_SHIFT); break; default: arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); @@ -1750,20 +1753,20 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream, return 0; } -static bool arizona_aif_cfg_changed(struct snd_soc_codec *codec, +static bool arizona_aif_cfg_changed(struct snd_soc_component *component, int base, int bclk, int lrclk, int frame) { int val; - val = snd_soc_read(codec, base + ARIZONA_AIF_BCLK_CTRL); + val = snd_soc_component_read32(component, base + ARIZONA_AIF_BCLK_CTRL); if (bclk != (val & ARIZONA_AIF1_BCLK_FREQ_MASK)) return true; - val = snd_soc_read(codec, base + ARIZONA_AIF_TX_BCLK_RATE); + val = snd_soc_component_read32(component, base + ARIZONA_AIF_TX_BCLK_RATE); if (lrclk != (val & ARIZONA_AIF1TX_BCPF_MASK)) return true; - val = snd_soc_read(codec, base + ARIZONA_AIF_FRAME_CTRL_1); + val = snd_soc_component_read32(component, base + ARIZONA_AIF_FRAME_CTRL_1); if (frame != (val & (ARIZONA_AIF1TX_WL_MASK | ARIZONA_AIF1TX_SLOT_LEN_MASK))) return true; @@ -1775,8 +1778,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int base = dai->driver->base; const int *rates; @@ -1813,7 +1816,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, } /* Force multiple of 2 channels for I2S mode */ - val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT); + val = snd_soc_component_read32(component, base + ARIZONA_AIF_FORMAT); val &= ARIZONA_AIF1_FMT_MASK; if ((channels & 1) && (val == ARIZONA_FMT_I2S_MODE)) { arizona_aif_dbg(dai, "Forcing stereo mode\n"); @@ -1841,19 +1844,20 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, frame = wl << ARIZONA_AIF1TX_WL_SHIFT | tdm_width; - reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame); + reconfig = arizona_aif_cfg_changed(component, base, bclk, lrclk, frame); if (reconfig) { /* Save AIF TX/RX state */ - aif_tx_state = snd_soc_read(codec, + aif_tx_state = snd_soc_component_read32(component, base + ARIZONA_AIF_TX_ENABLES); - aif_rx_state = snd_soc_read(codec, + aif_rx_state = snd_soc_component_read32(component, base + ARIZONA_AIF_RX_ENABLES); /* Disable AIF TX/RX before reconfiguring it */ regmap_update_bits_async(arizona->regmap, - base + ARIZONA_AIF_TX_ENABLES, 0xff, 0x0); + base + ARIZONA_AIF_TX_ENABLES, + 0xff, 0x0); regmap_update_bits(arizona->regmap, - base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0); + base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0); } ret = arizona_hw_params_rate(substream, params, dai); @@ -1908,9 +1912,9 @@ static const char *arizona_dai_clk_str(int clk_id) static int arizona_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona_dai_priv *dai_priv = &priv->dai[dai->id - 1]; struct snd_soc_dapm_route routes[2]; @@ -1926,12 +1930,12 @@ static int arizona_dai_set_sysclk(struct snd_soc_dai *dai, return 0; if (dai->active) { - dev_err(codec->dev, "Can't change clock on active DAI %d\n", + dev_err(component->dev, "Can't change clock on active DAI %d\n", dai->id); return -EBUSY; } - dev_dbg(codec->dev, "Setting AIF%d to %s\n", dai->id + 1, + dev_dbg(component->dev, "Setting AIF%d to %s\n", dai->id + 1, arizona_dai_clk_str(clk_id)); memset(&routes, 0, sizeof(routes)); @@ -1953,7 +1957,7 @@ static int arizona_dai_set_sysclk(struct snd_soc_dai *dai, static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int base = dai->driver->base; unsigned int reg; @@ -1962,16 +1966,17 @@ static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate) else reg = 0; - return snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, - ARIZONA_AIF1_TRI, reg); + return snd_soc_component_update_bits(component, + base + ARIZONA_AIF_RATE_CTRL, + ARIZONA_AIF1_TRI, reg); } static void arizona_set_channels_to_mask(struct snd_soc_dai *dai, unsigned int base, int channels, unsigned int mask) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int slot, i; @@ -1992,8 +1997,8 @@ static void arizona_set_channels_to_mask(struct snd_soc_dai *dai, static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; int base = dai->driver->base; int rx_max_chan = dai->driver->playback.channels_max; @@ -2321,7 +2326,6 @@ static int arizona_calc_fll(struct arizona_fll *fll, arizona_fll_dbg(fll, "GAIN=0x%x(%d)\n", cfg->gain, 1 << cfg->gain); return 0; - } static void arizona_apply_fll(struct arizona *arizona, unsigned int base, @@ -2567,9 +2571,8 @@ int arizona_set_fll_refclk(struct arizona_fll *fll, int source, fll->ref_src = source; fll->ref_freq = Fref; - if (fll->fout && Fref > 0) { + if (fll->fout && Fref > 0) ret = arizona_enable_fll(fll); - } return ret; } @@ -2645,7 +2648,7 @@ EXPORT_SYMBOL_GPL(arizona_init_fll); /** * arizona_set_output_mode - Set the mode of the specified output * - * @codec: Device to configure + * @component: Device to configure * @output: Output number * @diff: True to set the output to differential mode * @@ -2658,7 +2661,8 @@ EXPORT_SYMBOL_GPL(arizona_init_fll); * Most systems have a single static configuration and should use * platform data instead. */ -int arizona_set_output_mode(struct snd_soc_codec *codec, int output, bool diff) +int arizona_set_output_mode(struct snd_soc_component *component, int output, + bool diff) { unsigned int reg, val; @@ -2672,7 +2676,8 @@ int arizona_set_output_mode(struct snd_soc_codec *codec, int output, bool diff) else val = 0; - return snd_soc_update_bits(codec, reg, ARIZONA_OUT1_MONO, val); + return snd_soc_component_update_bits(component, reg, + ARIZONA_OUT1_MONO, val); } EXPORT_SYMBOL_GPL(arizona_set_output_mode); @@ -2721,8 +2726,8 @@ static bool arizona_eq_filter_unstable(bool mode, __be16 _a, __be16 _b) int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); struct soc_bytes *params = (void *)kcontrol->private_value; unsigned int val; __be16 *data; @@ -2765,8 +2770,8 @@ EXPORT_SYMBOL_GPL(arizona_eq_coeff_put); int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); __be16 *data = (__be16 *)ucontrol->value.bytes.data; s16 val = be16_to_cpu(*data); diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h index dfdf6d8c9687..e3ccee5627c6 100644 --- a/sound/soc/codecs/arizona.h +++ b/sound/soc/codecs/arizona.h @@ -273,7 +273,7 @@ int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol, int arizona_clk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); -int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, int source, +int arizona_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir); extern const struct snd_soc_dai_ops arizona_dai_ops; @@ -297,8 +297,8 @@ struct arizona_fll { char clock_ok_name[ARIZONA_FLL_NAME_LEN]; }; -int arizona_dvfs_up(struct snd_soc_codec *codec, unsigned int flags); -int arizona_dvfs_down(struct snd_soc_codec *codec, unsigned int flags); +int arizona_dvfs_up(struct snd_soc_component *component, unsigned int flags); +int arizona_dvfs_down(struct snd_soc_component *component, unsigned int flags); int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); void arizona_init_dvfs(struct arizona_priv *priv); @@ -310,9 +310,9 @@ int arizona_set_fll_refclk(struct arizona_fll *fll, int source, int arizona_set_fll(struct arizona_fll *fll, int source, unsigned int Fref, unsigned int Fout); -int arizona_init_spk(struct snd_soc_codec *codec); -int arizona_init_gpio(struct snd_soc_codec *codec); -int arizona_init_mono(struct snd_soc_codec *codec); +int arizona_init_spk(struct snd_soc_component *component); +int arizona_init_gpio(struct snd_soc_component *component); +int arizona_init_mono(struct snd_soc_component *component); int arizona_init_common(struct arizona *arizona); int arizona_init_vol_limit(struct arizona *arizona); @@ -322,20 +322,20 @@ int arizona_free_spk_irqs(struct arizona *arizona); int arizona_init_dai(struct arizona_priv *priv, int dai); -int arizona_set_output_mode(struct snd_soc_codec *codec, int output, +int arizona_set_output_mode(struct snd_soc_component *component, int output, bool diff); -bool arizona_input_analog(struct snd_soc_codec *codec, int shift); +bool arizona_input_analog(struct snd_soc_component *component, int shift); const char *arizona_sample_rate_val_to_name(unsigned int rate_val); -static inline int arizona_register_notifier(struct snd_soc_codec *codec, +static inline int arizona_register_notifier(struct snd_soc_component *component, struct notifier_block *nb, int (*notify) (struct notifier_block *nb, unsigned long action, void *data)) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; nb->notifier_call = notify; @@ -343,10 +343,10 @@ static inline int arizona_register_notifier(struct snd_soc_codec *codec, return blocking_notifier_chain_register(&arizona->notifier, nb); } -static inline int arizona_unregister_notifier(struct snd_soc_codec *codec, +static inline int arizona_unregister_notifier(struct snd_soc_component *component, struct notifier_block *nb) { - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; return blocking_notifier_chain_unregister(&arizona->notifier, nb); diff --git a/sound/soc/codecs/bd28623.c b/sound/soc/codecs/bd28623.c new file mode 100644 index 000000000000..31904ef5c88b --- /dev/null +++ b/sound/soc/codecs/bd28623.c @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// ROHM BD28623MUV class D speaker amplifier codec driver. +// +// Copyright (c) 2018 Socionext Inc. + +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> +#include <sound/pcm.h> +#include <sound/soc.h> + +#define BD28623_NUM_SUPPLIES 3 + +static const char *const bd28623_supply_names[BD28623_NUM_SUPPLIES] = { + "VCCA", + "VCCP1", + "VCCP2", +}; + +struct bd28623_priv { + struct device *dev; + struct regulator_bulk_data supplies[BD28623_NUM_SUPPLIES]; + struct gpio_desc *reset_gpio; + struct gpio_desc *mute_gpio; + + int switch_spk; +}; + +static const struct snd_soc_dapm_widget bd28623_widgets[] = { + SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_OUTPUT("OUT1P"), + SND_SOC_DAPM_OUTPUT("OUT1N"), + SND_SOC_DAPM_OUTPUT("OUT2P"), + SND_SOC_DAPM_OUTPUT("OUT2N"), +}; + +static const struct snd_soc_dapm_route bd28623_routes[] = { + { "OUT1P", NULL, "DAC" }, + { "OUT1N", NULL, "DAC" }, + { "OUT2P", NULL, "DAC" }, + { "OUT2N", NULL, "DAC" }, +}; + +static int bd28623_power_on(struct bd28623_priv *bd) +{ + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(bd->supplies), bd->supplies); + if (ret) { + dev_err(bd->dev, "Failed to enable supplies: %d\n", ret); + return ret; + } + + gpiod_set_value_cansleep(bd->reset_gpio, 0); + usleep_range(300000, 400000); + + return 0; +} + +static void bd28623_power_off(struct bd28623_priv *bd) +{ + gpiod_set_value_cansleep(bd->reset_gpio, 1); + + regulator_bulk_disable(ARRAY_SIZE(bd->supplies), bd->supplies); +} + +static int bd28623_get_switch_spk(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + + ucontrol->value.integer.value[0] = bd->switch_spk; + + return 0; +} + +static int bd28623_set_switch_spk(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + + if (bd->switch_spk == ucontrol->value.integer.value[0]) + return 0; + + bd->switch_spk = ucontrol->value.integer.value[0]; + + gpiod_set_value_cansleep(bd->mute_gpio, bd->switch_spk ? 0 : 1); + + return 0; +} + +static const struct snd_kcontrol_new bd28623_controls[] = { + SOC_SINGLE_BOOL_EXT("Speaker Switch", 0, + bd28623_get_switch_spk, bd28623_set_switch_spk), +}; + +static int bd28623_codec_probe(struct snd_soc_component *component) +{ + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + int ret; + + bd->switch_spk = 1; + + ret = bd28623_power_on(bd); + if (ret) + return ret; + + gpiod_set_value_cansleep(bd->mute_gpio, bd->switch_spk ? 0 : 1); + + return 0; +} + +static void bd28623_codec_remove(struct snd_soc_component *component) +{ + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + + bd28623_power_off(bd); +} + +static int bd28623_codec_suspend(struct snd_soc_component *component) +{ + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + + bd28623_power_off(bd); + + return 0; +} + +static int bd28623_codec_resume(struct snd_soc_component *component) +{ + struct bd28623_priv *bd = snd_soc_component_get_drvdata(component); + int ret; + + ret = bd28623_power_on(bd); + if (ret) + return ret; + + gpiod_set_value_cansleep(bd->mute_gpio, bd->switch_spk ? 0 : 1); + + return 0; +} + +static const struct snd_soc_component_driver soc_codec_bd = { + .probe = bd28623_codec_probe, + .remove = bd28623_codec_remove, + .suspend = bd28623_codec_suspend, + .resume = bd28623_codec_resume, + .dapm_widgets = bd28623_widgets, + .num_dapm_widgets = ARRAY_SIZE(bd28623_widgets), + .dapm_routes = bd28623_routes, + .num_dapm_routes = ARRAY_SIZE(bd28623_routes), + .controls = bd28623_controls, + .num_controls = ARRAY_SIZE(bd28623_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; + +static struct snd_soc_dai_driver soc_dai_bd = { + .name = "bd28623-speaker", + .playback = { + .stream_name = "Playback", + .formats = SNDRV_PCM_FMTBIT_S32_LE | + SNDRV_PCM_FMTBIT_S24_LE | + SNDRV_PCM_FMTBIT_S16_LE, + .rates = SNDRV_PCM_RATE_48000 | + SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_32000, + .channels_min = 2, + .channels_max = 2, + }, +}; + +static int bd28623_probe(struct platform_device *pdev) +{ + struct bd28623_priv *bd; + struct device *dev = &pdev->dev; + int i, ret; + + bd = devm_kzalloc(&pdev->dev, sizeof(struct bd28623_priv), GFP_KERNEL); + if (!bd) + return -ENOMEM; + + for (i = 0; i < ARRAY_SIZE(bd->supplies); i++) + bd->supplies[i].supply = bd28623_supply_names[i]; + + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(bd->supplies), + bd->supplies); + if (ret) { + dev_err(dev, "Failed to get supplies: %d\n", ret); + return ret; + } + + bd->reset_gpio = devm_gpiod_get_optional(dev, "reset", + GPIOD_OUT_HIGH); + if (IS_ERR(bd->reset_gpio)) { + dev_err(dev, "Failed to request reset_gpio: %ld\n", + PTR_ERR(bd->reset_gpio)); + return PTR_ERR(bd->reset_gpio); + } + + bd->mute_gpio = devm_gpiod_get_optional(dev, "mute", + GPIOD_OUT_HIGH); + if (IS_ERR(bd->mute_gpio)) { + dev_err(dev, "Failed to request mute_gpio: %ld\n", + PTR_ERR(bd->mute_gpio)); + return PTR_ERR(bd->mute_gpio); + } + + platform_set_drvdata(pdev, bd); + bd->dev = dev; + + return devm_snd_soc_register_component(dev, &soc_codec_bd, + &soc_dai_bd, 1); +} + +static const struct of_device_id bd28623_of_match[] = { + { .compatible = "rohm,bd28623", }, + {} +}; +MODULE_DEVICE_TABLE(of, bd28623_of_match); + +static struct platform_driver bd28623_codec_driver = { + .driver = { + .name = "bd28623", + .of_match_table = of_match_ptr(bd28623_of_match), + }, + .probe = bd28623_probe, +}; +module_platform_driver(bd28623_codec_driver); + +MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); +MODULE_DESCRIPTION("ROHM BD28623 speaker amplifier driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/codecs/bt-sco.c b/sound/soc/codecs/bt-sco.c index 806191addb44..842204203eb3 100644 --- a/sound/soc/codecs/bt-sco.c +++ b/sound/soc/codecs/bt-sco.c @@ -62,25 +62,26 @@ static struct snd_soc_dai_driver bt_sco_dai[] = { } }; -static const struct snd_soc_codec_driver soc_codec_dev_bt_sco = { - .component_driver = { - .dapm_widgets = bt_sco_widgets, - .num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets), - .dapm_routes = bt_sco_routes, - .num_dapm_routes = ARRAY_SIZE(bt_sco_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_bt_sco = { + .dapm_widgets = bt_sco_widgets, + .num_dapm_widgets = ARRAY_SIZE(bt_sco_widgets), + .dapm_routes = bt_sco_routes, + .num_dapm_routes = ARRAY_SIZE(bt_sco_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int bt_sco_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_bt_sco, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_bt_sco, bt_sco_dai, ARRAY_SIZE(bt_sco_dai)); } static int bt_sco_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); - return 0; } diff --git a/sound/soc/codecs/cpcap.c b/sound/soc/codecs/cpcap.c new file mode 100644 index 000000000000..d7f05b384f1f --- /dev/null +++ b/sound/soc/codecs/cpcap.c @@ -0,0 +1,1562 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * ALSA SoC CPCAP codec driver + * + * Copyright (C) 2017 - 2018 Sebastian Reichel <sre@kernel.org> + * + * Very loosely based on original driver from Motorola: + * Copyright (C) 2007 - 2009 Motorola, Inc. + */ + +#include <linux/module.h> +#include <linux/regmap.h> +#include <linux/platform_device.h> +#include <linux/mfd/motorola-cpcap.h> +#include <sound/core.h> +#include <sound/soc.h> +#include <sound/tlv.h> + +/* Register 513 CPCAP_REG_CC --- CODEC */ +#define CPCAP_BIT_CDC_CLK2 15 +#define CPCAP_BIT_CDC_CLK1 14 +#define CPCAP_BIT_CDC_CLK0 13 +#define CPCAP_BIT_CDC_SR3 12 +#define CPCAP_BIT_CDC_SR2 11 +#define CPCAP_BIT_CDC_SR1 10 +#define CPCAP_BIT_CDC_SR0 9 +#define CPCAP_BIT_CDC_CLOCK_TREE_RESET 8 +#define CPCAP_BIT_MIC2_CDC_EN 7 +#define CPCAP_BIT_CDC_EN_RX 6 +#define CPCAP_BIT_DF_RESET 5 +#define CPCAP_BIT_MIC1_CDC_EN 4 +#define CPCAP_BIT_AUDOHPF_1 3 +#define CPCAP_BIT_AUDOHPF_0 2 +#define CPCAP_BIT_AUDIHPF_1 1 +#define CPCAP_BIT_AUDIHPF_0 0 + +/* Register 514 CPCAP_REG_CDI --- CODEC Digital Audio Interface */ +#define CPCAP_BIT_CDC_PLL_SEL 15 +#define CPCAP_BIT_CLK_IN_SEL 13 +#define CPCAP_BIT_DIG_AUD_IN 12 +#define CPCAP_BIT_CDC_CLK_EN 11 +#define CPCAP_BIT_CDC_DIG_AUD_FS1 10 +#define CPCAP_BIT_CDC_DIG_AUD_FS0 9 +#define CPCAP_BIT_MIC2_TIMESLOT2 8 +#define CPCAP_BIT_MIC2_TIMESLOT1 7 +#define CPCAP_BIT_MIC2_TIMESLOT0 6 +#define CPCAP_BIT_MIC1_RX_TIMESLOT2 5 +#define CPCAP_BIT_MIC1_RX_TIMESLOT1 4 +#define CPCAP_BIT_MIC1_RX_TIMESLOT0 3 +#define CPCAP_BIT_FS_INV 2 +#define CPCAP_BIT_CLK_INV 1 +#define CPCAP_BIT_SMB_CDC 0 + +/* Register 515 CPCAP_REG_SDAC --- Stereo DAC */ +#define CPCAP_BIT_FSYNC_CLK_IN_COMMON 11 +#define CPCAP_BIT_SLAVE_PLL_CLK_INPUT 10 +#define CPCAP_BIT_ST_CLOCK_TREE_RESET 9 +#define CPCAP_BIT_DF_RESET_ST_DAC 8 +#define CPCAP_BIT_ST_SR3 7 +#define CPCAP_BIT_ST_SR2 6 +#define CPCAP_BIT_ST_SR1 5 +#define CPCAP_BIT_ST_SR0 4 +#define CPCAP_BIT_ST_DAC_CLK2 3 +#define CPCAP_BIT_ST_DAC_CLK1 2 +#define CPCAP_BIT_ST_DAC_CLK0 1 +#define CPCAP_BIT_ST_DAC_EN 0 + +/* Register 516 CPCAP_REG_SDACDI --- Stereo DAC Digital Audio Interface */ +#define CPCAP_BIT_ST_L_TIMESLOT2 13 +#define CPCAP_BIT_ST_L_TIMESLOT1 12 +#define CPCAP_BIT_ST_L_TIMESLOT0 11 +#define CPCAP_BIT_ST_R_TIMESLOT2 10 +#define CPCAP_BIT_ST_R_TIMESLOT1 9 +#define CPCAP_BIT_ST_R_TIMESLOT0 8 +#define CPCAP_BIT_ST_DAC_CLK_IN_SEL 7 +#define CPCAP_BIT_ST_FS_INV 6 +#define CPCAP_BIT_ST_CLK_INV 5 +#define CPCAP_BIT_ST_DIG_AUD_FS1 4 +#define CPCAP_BIT_ST_DIG_AUD_FS0 3 +#define CPCAP_BIT_DIG_AUD_IN_ST_DAC 2 +#define CPCAP_BIT_ST_CLK_EN 1 +#define CPCAP_BIT_SMB_ST_DAC 0 + +/* Register 517 CPCAP_REG_TXI --- TX Interface */ +#define CPCAP_BIT_PTT_TH 15 +#define CPCAP_BIT_PTT_CMP_EN 14 +#define CPCAP_BIT_HS_ID_TX 13 +#define CPCAP_BIT_MB_ON2 12 +#define CPCAP_BIT_MB_ON1L 11 +#define CPCAP_BIT_MB_ON1R 10 +#define CPCAP_BIT_RX_L_ENCODE 9 +#define CPCAP_BIT_RX_R_ENCODE 8 +#define CPCAP_BIT_MIC2_MUX 7 +#define CPCAP_BIT_MIC2_PGA_EN 6 +#define CPCAP_BIT_CDET_DIS 5 +#define CPCAP_BIT_EMU_MIC_MUX 4 +#define CPCAP_BIT_HS_MIC_MUX 3 +#define CPCAP_BIT_MIC1_MUX 2 +#define CPCAP_BIT_MIC1_PGA_EN 1 +#define CPCAP_BIT_DLM 0 + +/* Register 518 CPCAP_REG_TXMP --- Mic Gain */ +#define CPCAP_BIT_MB_BIAS_R1 11 +#define CPCAP_BIT_MB_BIAS_R0 10 +#define CPCAP_BIT_MIC2_GAIN_4 9 +#define CPCAP_BIT_MIC2_GAIN_3 8 +#define CPCAP_BIT_MIC2_GAIN_2 7 +#define CPCAP_BIT_MIC2_GAIN_1 6 +#define CPCAP_BIT_MIC2_GAIN_0 5 +#define CPCAP_BIT_MIC1_GAIN_4 4 +#define CPCAP_BIT_MIC1_GAIN_3 3 +#define CPCAP_BIT_MIC1_GAIN_2 2 +#define CPCAP_BIT_MIC1_GAIN_1 1 +#define CPCAP_BIT_MIC1_GAIN_0 0 + +/* Register 519 CPCAP_REG_RXOA --- RX Output Amplifier */ +#define CPCAP_BIT_UNUSED_519_15 15 +#define CPCAP_BIT_UNUSED_519_14 14 +#define CPCAP_BIT_UNUSED_519_13 13 +#define CPCAP_BIT_STDAC_LOW_PWR_DISABLE 12 +#define CPCAP_BIT_HS_LOW_PWR 11 +#define CPCAP_BIT_HS_ID_RX 10 +#define CPCAP_BIT_ST_HS_CP_EN 9 +#define CPCAP_BIT_EMU_SPKR_R_EN 8 +#define CPCAP_BIT_EMU_SPKR_L_EN 7 +#define CPCAP_BIT_HS_L_EN 6 +#define CPCAP_BIT_HS_R_EN 5 +#define CPCAP_BIT_A4_LINEOUT_L_EN 4 +#define CPCAP_BIT_A4_LINEOUT_R_EN 3 +#define CPCAP_BIT_A2_LDSP_L_EN 2 +#define CPCAP_BIT_A2_LDSP_R_EN 1 +#define CPCAP_BIT_A1_EAR_EN 0 + +/* Register 520 CPCAP_REG_RXVC --- RX Volume Control */ +#define CPCAP_BIT_VOL_EXT3 15 +#define CPCAP_BIT_VOL_EXT2 14 +#define CPCAP_BIT_VOL_EXT1 13 +#define CPCAP_BIT_VOL_EXT0 12 +#define CPCAP_BIT_VOL_DAC3 11 +#define CPCAP_BIT_VOL_DAC2 10 +#define CPCAP_BIT_VOL_DAC1 9 +#define CPCAP_BIT_VOL_DAC0 8 +#define CPCAP_BIT_VOL_DAC_LSB_1dB1 7 +#define CPCAP_BIT_VOL_DAC_LSB_1dB0 6 +#define CPCAP_BIT_VOL_CDC3 5 +#define CPCAP_BIT_VOL_CDC2 4 +#define CPCAP_BIT_VOL_CDC1 3 +#define CPCAP_BIT_VOL_CDC0 2 +#define CPCAP_BIT_VOL_CDC_LSB_1dB1 1 +#define CPCAP_BIT_VOL_CDC_LSB_1dB0 0 + +/* Register 521 CPCAP_REG_RXCOA --- Codec to Output Amp Switches */ +#define CPCAP_BIT_PGA_CDC_EN 10 +#define CPCAP_BIT_CDC_SW 9 +#define CPCAP_BIT_PGA_OUTR_USBDP_CDC_SW 8 +#define CPCAP_BIT_PGA_OUTL_USBDN_CDC_SW 7 +#define CPCAP_BIT_ALEFT_HS_CDC_SW 6 +#define CPCAP_BIT_ARIGHT_HS_CDC_SW 5 +#define CPCAP_BIT_A4_LINEOUT_L_CDC_SW 4 +#define CPCAP_BIT_A4_LINEOUT_R_CDC_SW 3 +#define CPCAP_BIT_A2_LDSP_L_CDC_SW 2 +#define CPCAP_BIT_A2_LDSP_R_CDC_SW 1 +#define CPCAP_BIT_A1_EAR_CDC_SW 0 + +/* Register 522 CPCAP_REG_RXSDOA --- RX Stereo DAC to Output Amp Switches */ +#define CPCAP_BIT_PGA_DAC_EN 12 +#define CPCAP_BIT_ST_DAC_SW 11 +#define CPCAP_BIT_MONO_DAC1 10 +#define CPCAP_BIT_MONO_DAC0 9 +#define CPCAP_BIT_PGA_OUTR_USBDP_DAC_SW 8 +#define CPCAP_BIT_PGA_OUTL_USBDN_DAC_SW 7 +#define CPCAP_BIT_ALEFT_HS_DAC_SW 6 +#define CPCAP_BIT_ARIGHT_HS_DAC_SW 5 +#define CPCAP_BIT_A4_LINEOUT_L_DAC_SW 4 +#define CPCAP_BIT_A4_LINEOUT_R_DAC_SW 3 +#define CPCAP_BIT_A2_LDSP_L_DAC_SW 2 +#define CPCAP_BIT_A2_LDSP_R_DAC_SW 1 +#define CPCAP_BIT_A1_EAR_DAC_SW 0 + +/* Register 523 CPCAP_REG_RXEPOA --- RX External PGA to Output Amp Switches */ +#define CPCAP_BIT_PGA_EXT_L_EN 14 +#define CPCAP_BIT_PGA_EXT_R_EN 13 +#define CPCAP_BIT_PGA_IN_L_SW 12 +#define CPCAP_BIT_PGA_IN_R_SW 11 +#define CPCAP_BIT_MONO_EXT1 10 +#define CPCAP_BIT_MONO_EXT0 9 +#define CPCAP_BIT_PGA_OUTR_USBDP_EXT_SW 8 +#define CPCAP_BIT_PGA_OUTL_USBDN_EXT_SW 7 +#define CPCAP_BIT_ALEFT_HS_EXT_SW 6 +#define CPCAP_BIT_ARIGHT_HS_EXT_SW 5 +#define CPCAP_BIT_A4_LINEOUT_L_EXT_SW 4 +#define CPCAP_BIT_A4_LINEOUT_R_EXT_SW 3 +#define CPCAP_BIT_A2_LDSP_L_EXT_SW 2 +#define CPCAP_BIT_A2_LDSP_R_EXT_SW 1 +#define CPCAP_BIT_A1_EAR_EXT_SW 0 + +/* Register 525 CPCAP_REG_A2LA --- SPK Amplifier and Clock Config for Headset */ +#define CPCAP_BIT_NCP_CLK_SYNC 7 +#define CPCAP_BIT_A2_CLK_SYNC 6 +#define CPCAP_BIT_A2_FREE_RUN 5 +#define CPCAP_BIT_A2_CLK2 4 +#define CPCAP_BIT_A2_CLK1 3 +#define CPCAP_BIT_A2_CLK0 2 +#define CPCAP_BIT_A2_CLK_IN 1 +#define CPCAP_BIT_A2_CONFIG 0 + +#define SLEEP_ACTIVATE_POWER 2 +#define CLOCK_TREE_RESET_TIME 1 + +/* constants for ST delay workaround */ +#define STM_STDAC_ACTIVATE_RAMP_TIME 1 +#define STM_STDAC_EN_TEST_PRE 0x090C +#define STM_STDAC_EN_TEST_POST 0x0000 +#define STM_STDAC_EN_ST_TEST1_PRE 0x2400 +#define STM_STDAC_EN_ST_TEST1_POST 0x0400 + +struct cpcap_reg_info { + u16 reg; + u16 mask; + u16 val; +}; + +static const struct cpcap_reg_info cpcap_default_regs[] = { + { CPCAP_REG_CC, 0xFFFF, 0x0000 }, + { CPCAP_REG_CC, 0xFFFF, 0x0000 }, + { CPCAP_REG_CDI, 0xBFFF, 0x0000 }, + { CPCAP_REG_SDAC, 0x0FFF, 0x0000 }, + { CPCAP_REG_SDACDI, 0x3FFF, 0x0000 }, + { CPCAP_REG_TXI, 0x0FDF, 0x0000 }, + { CPCAP_REG_TXMP, 0x0FFF, 0x0400 }, + { CPCAP_REG_RXOA, 0x01FF, 0x0000 }, + { CPCAP_REG_RXVC, 0xFF3C, 0x0000 }, + { CPCAP_REG_RXCOA, 0x07FF, 0x0000 }, + { CPCAP_REG_RXSDOA, 0x1FFF, 0x0000 }, + { CPCAP_REG_RXEPOA, 0x7FFF, 0x0000 }, + { CPCAP_REG_A2LA, BIT(CPCAP_BIT_A2_FREE_RUN), + BIT(CPCAP_BIT_A2_FREE_RUN) }, +}; + +enum cpcap_dai { + CPCAP_DAI_HIFI, + CPCAP_DAI_VOICE, +}; + +struct cpcap_audio { + struct snd_soc_component *component; + struct regmap *regmap; + + u16 vendor; + + int codec_clk_id; + int codec_freq; + int codec_format; +}; + +static int cpcap_st_workaround(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + int err = 0; + + /* Only CPCAP from ST requires workaround */ + if (cpcap->vendor != CPCAP_VENDOR_ST) + return 0; + + switch (event) { + case SND_SOC_DAPM_PRE_PMU: + err = regmap_write(cpcap->regmap, CPCAP_REG_TEST, + STM_STDAC_EN_TEST_PRE); + if (err) + return err; + err = regmap_write(cpcap->regmap, CPCAP_REG_ST_TEST1, + STM_STDAC_EN_ST_TEST1_PRE); + break; + case SND_SOC_DAPM_POST_PMU: + msleep(STM_STDAC_ACTIVATE_RAMP_TIME); + + err = regmap_write(cpcap->regmap, CPCAP_REG_ST_TEST1, + STM_STDAC_EN_ST_TEST1_POST); + if (err) + return err; + err = regmap_write(cpcap->regmap, CPCAP_REG_TEST, + STM_STDAC_EN_TEST_POST); + break; + default: + break; + } + + return err; +} + +/* Capture Gain Control: 0dB to 31dB in 1dB steps */ +static const DECLARE_TLV_DB_SCALE(mic_gain_tlv, 0, 100, 0); + +/* Playback Gain Control: -33dB to 12dB in 3dB steps */ +static const DECLARE_TLV_DB_SCALE(vol_tlv, -3300, 300, 0); + +static const struct snd_kcontrol_new cpcap_snd_controls[] = { + /* Playback Gain */ + SOC_SINGLE_TLV("HiFi Playback Volume", + CPCAP_REG_RXVC, CPCAP_BIT_VOL_DAC0, 0xF, 0, vol_tlv), + SOC_SINGLE_TLV("Voice Playback Volume", + CPCAP_REG_RXVC, CPCAP_BIT_VOL_CDC0, 0xF, 0, vol_tlv), + SOC_SINGLE_TLV("Ext Playback Volume", + CPCAP_REG_RXVC, CPCAP_BIT_VOL_EXT0, 0xF, 0, vol_tlv), + + /* Capture Gain */ + SOC_SINGLE_TLV("Mic1 Capture Volume", + CPCAP_REG_TXMP, CPCAP_BIT_MIC1_GAIN_0, 0x1F, 0, mic_gain_tlv), + SOC_SINGLE_TLV("Mic2 Capture Volume", + CPCAP_REG_TXMP, CPCAP_BIT_MIC2_GAIN_0, 0x1F, 0, mic_gain_tlv), + + /* Phase Invert */ + SOC_SINGLE("Hifi Left Phase Invert Switch", + CPCAP_REG_RXSDOA, CPCAP_BIT_MONO_DAC0, 1, 0), + SOC_SINGLE("Ext Left Phase Invert Switch", + CPCAP_REG_RXEPOA, CPCAP_BIT_MONO_EXT0, 1, 0), +}; + +static const char * const cpcap_out_mux_texts[] = { + "Off", "Voice", "HiFi", "Ext" +}; + +static const char * const cpcap_in_right_mux_texts[] = { + "Off", "Mic 1", "Headset Mic", "EMU Mic", "Ext Right" +}; + +static const char * const cpcap_in_left_mux_texts[] = { + "Off", "Mic 2", "Ext Left" +}; + +/* + * input muxes use unusual register layout, so that we need to use custom + * getter/setter methods + */ +static SOC_ENUM_SINGLE_EXT_DECL(cpcap_input_left_mux_enum, + cpcap_in_left_mux_texts); +static SOC_ENUM_SINGLE_EXT_DECL(cpcap_input_right_mux_enum, + cpcap_in_right_mux_texts); + +/* + * mux uses same bit in CPCAP_REG_RXCOA, CPCAP_REG_RXSDOA & CPCAP_REG_RXEPOA; + * even though the register layout makes it look like a mixer, this is a mux. + * Enabling multiple inputs will result in no audio being forwarded. + */ +static SOC_ENUM_SINGLE_DECL(cpcap_earpiece_mux_enum, 0, 0, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_spkr_r_mux_enum, 0, 1, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_spkr_l_mux_enum, 0, 2, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_line_r_mux_enum, 0, 3, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_line_l_mux_enum, 0, 4, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_hs_r_mux_enum, 0, 5, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_hs_l_mux_enum, 0, 6, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_emu_l_mux_enum, 0, 7, cpcap_out_mux_texts); +static SOC_ENUM_SINGLE_DECL(cpcap_emu_r_mux_enum, 0, 8, cpcap_out_mux_texts); + +static int cpcap_output_mux_get_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned int shift = e->shift_l; + int reg_voice, reg_hifi, reg_ext, status; + int err; + + err = regmap_read(cpcap->regmap, CPCAP_REG_RXCOA, ®_voice); + if (err) + return err; + err = regmap_read(cpcap->regmap, CPCAP_REG_RXSDOA, ®_hifi); + if (err) + return err; + err = regmap_read(cpcap->regmap, CPCAP_REG_RXEPOA, ®_ext); + if (err) + return err; + + reg_voice = (reg_voice >> shift) & 1; + reg_hifi = (reg_hifi >> shift) & 1; + reg_ext = (reg_ext >> shift) & 1; + status = reg_ext << 2 | reg_hifi << 1 | reg_voice; + + switch (status) { + case 0x04: + ucontrol->value.enumerated.item[0] = 3; + break; + case 0x02: + ucontrol->value.enumerated.item[0] = 2; + break; + case 0x01: + ucontrol->value.enumerated.item[0] = 1; + break; + default: + ucontrol->value.enumerated.item[0] = 0; + break; + } + + return 0; +} + +static int cpcap_output_mux_put_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = + snd_soc_dapm_kcontrol_dapm(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned int muxval = ucontrol->value.enumerated.item[0]; + unsigned int mask = BIT(e->shift_l); + u16 reg_voice = 0x00, reg_hifi = 0x00, reg_ext = 0x00; + int err; + + switch (muxval) { + case 1: + reg_voice = mask; + break; + case 2: + reg_hifi = mask; + break; + case 3: + reg_ext = mask; + break; + default: + break; + } + + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXCOA, + mask, reg_voice); + if (err) + return err; + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXSDOA, + mask, reg_hifi); + if (err) + return err; + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXEPOA, + mask, reg_ext); + if (err) + return err; + + snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL); + + return 0; +} + +static int cpcap_input_right_mux_get_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + int regval, mask; + int err; + + err = regmap_read(cpcap->regmap, CPCAP_REG_TXI, ®val); + if (err) + return err; + + mask = 0; + mask |= BIT(CPCAP_BIT_MIC1_MUX); + mask |= BIT(CPCAP_BIT_HS_MIC_MUX); + mask |= BIT(CPCAP_BIT_EMU_MIC_MUX); + mask |= BIT(CPCAP_BIT_RX_R_ENCODE); + + switch (regval & mask) { + case BIT(CPCAP_BIT_RX_R_ENCODE): + ucontrol->value.enumerated.item[0] = 4; + break; + case BIT(CPCAP_BIT_EMU_MIC_MUX): + ucontrol->value.enumerated.item[0] = 3; + break; + case BIT(CPCAP_BIT_HS_MIC_MUX): + ucontrol->value.enumerated.item[0] = 2; + break; + case BIT(CPCAP_BIT_MIC1_MUX): + ucontrol->value.enumerated.item[0] = 1; + break; + default: + ucontrol->value.enumerated.item[0] = 0; + break; + } + + return 0; +} + +static int cpcap_input_right_mux_put_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = + snd_soc_dapm_kcontrol_dapm(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned int muxval = ucontrol->value.enumerated.item[0]; + int regval = 0, mask; + int err; + + mask = 0; + mask |= BIT(CPCAP_BIT_MIC1_MUX); + mask |= BIT(CPCAP_BIT_HS_MIC_MUX); + mask |= BIT(CPCAP_BIT_EMU_MIC_MUX); + mask |= BIT(CPCAP_BIT_RX_R_ENCODE); + + switch (muxval) { + case 1: + regval = BIT(CPCAP_BIT_MIC1_MUX); + break; + case 2: + regval = BIT(CPCAP_BIT_HS_MIC_MUX); + break; + case 3: + regval = BIT(CPCAP_BIT_EMU_MIC_MUX); + break; + case 4: + regval = BIT(CPCAP_BIT_RX_R_ENCODE); + break; + default: + break; + } + + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_TXI, + mask, regval); + if (err) + return err; + + snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL); + + return 0; +} + +static int cpcap_input_left_mux_get_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + int regval, mask; + int err; + + err = regmap_read(cpcap->regmap, CPCAP_REG_TXI, ®val); + if (err) + return err; + + mask = 0; + mask |= BIT(CPCAP_BIT_MIC2_MUX); + mask |= BIT(CPCAP_BIT_RX_L_ENCODE); + + switch (regval & mask) { + case BIT(CPCAP_BIT_RX_L_ENCODE): + ucontrol->value.enumerated.item[0] = 2; + break; + case BIT(CPCAP_BIT_MIC2_MUX): + ucontrol->value.enumerated.item[0] = 1; + break; + default: + ucontrol->value.enumerated.item[0] = 0; + break; + } + + return 0; +} + +static int cpcap_input_left_mux_put_enum(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = + snd_soc_dapm_kcontrol_dapm(kcontrol); + struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; + unsigned int muxval = ucontrol->value.enumerated.item[0]; + int regval = 0, mask; + int err; + + mask = 0; + mask |= BIT(CPCAP_BIT_MIC2_MUX); + mask |= BIT(CPCAP_BIT_RX_L_ENCODE); + + switch (muxval) { + case 1: + regval = BIT(CPCAP_BIT_MIC2_MUX); + break; + case 2: + regval = BIT(CPCAP_BIT_RX_L_ENCODE); + break; + default: + break; + } + + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_TXI, + mask, regval); + if (err) + return err; + + snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL); + + return 0; +} + +static const struct snd_kcontrol_new cpcap_input_left_mux = + SOC_DAPM_ENUM_EXT("Input Left", cpcap_input_left_mux_enum, + cpcap_input_left_mux_get_enum, + cpcap_input_left_mux_put_enum); +static const struct snd_kcontrol_new cpcap_input_right_mux = + SOC_DAPM_ENUM_EXT("Input Right", cpcap_input_right_mux_enum, + cpcap_input_right_mux_get_enum, + cpcap_input_right_mux_put_enum); +static const struct snd_kcontrol_new cpcap_emu_left_mux = + SOC_DAPM_ENUM_EXT("EMU Left", cpcap_emu_l_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_emu_right_mux = + SOC_DAPM_ENUM_EXT("EMU Right", cpcap_emu_r_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_hs_left_mux = + SOC_DAPM_ENUM_EXT("Headset Left", cpcap_hs_l_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_hs_right_mux = + SOC_DAPM_ENUM_EXT("Headset Right", cpcap_hs_r_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_line_left_mux = + SOC_DAPM_ENUM_EXT("Line Left", cpcap_line_l_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_line_right_mux = + SOC_DAPM_ENUM_EXT("Line Right", cpcap_line_r_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_speaker_left_mux = + SOC_DAPM_ENUM_EXT("Speaker Left", cpcap_spkr_l_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_speaker_right_mux = + SOC_DAPM_ENUM_EXT("Speaker Right", cpcap_spkr_r_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); +static const struct snd_kcontrol_new cpcap_earpiece_mux = + SOC_DAPM_ENUM_EXT("Earpiece", cpcap_earpiece_mux_enum, + cpcap_output_mux_get_enum, cpcap_output_mux_put_enum); + +static const struct snd_kcontrol_new cpcap_hifi_mono_mixer_controls[] = { + SOC_DAPM_SINGLE("HiFi Mono Playback Switch", + CPCAP_REG_RXSDOA, CPCAP_BIT_MONO_DAC1, 1, 0), +}; +static const struct snd_kcontrol_new cpcap_ext_mono_mixer_controls[] = { + SOC_DAPM_SINGLE("Ext Mono Playback Switch", + CPCAP_REG_RXEPOA, CPCAP_BIT_MONO_EXT0, 1, 0), +}; + +static const struct snd_kcontrol_new cpcap_extr_mute_control = + SOC_DAPM_SINGLE("Switch", + CPCAP_REG_RXEPOA, CPCAP_BIT_PGA_IN_R_SW, 1, 0); +static const struct snd_kcontrol_new cpcap_extl_mute_control = + SOC_DAPM_SINGLE("Switch", + CPCAP_REG_RXEPOA, CPCAP_BIT_PGA_IN_L_SW, 1, 0); + +static const struct snd_kcontrol_new cpcap_voice_loopback = + SOC_DAPM_SINGLE("Switch", + CPCAP_REG_TXI, CPCAP_BIT_DLM, 1, 0); + +static const struct snd_soc_dapm_widget cpcap_dapm_widgets[] = { + /* DAIs */ + SND_SOC_DAPM_AIF_IN("HiFi RX", NULL, 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("Voice RX", NULL, 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT("Voice TX", NULL, 0, SND_SOC_NOPM, 0, 0), + + /* Power Supply */ + SND_SOC_DAPM_REGULATOR_SUPPLY("VAUDIO", SLEEP_ACTIVATE_POWER, 0), + + /* Highpass Filters */ + SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Highpass Filter RX", + CPCAP_REG_CC, CPCAP_BIT_AUDIHPF_0, 0x3, 0x3, 0x0), + SND_SOC_DAPM_REG(snd_soc_dapm_pga, "Highpass Filter TX", + CPCAP_REG_CC, CPCAP_BIT_AUDOHPF_0, 0x3, 0x3, 0x0), + + /* Clocks */ + SND_SOC_DAPM_SUPPLY("HiFi DAI Clock", + CPCAP_REG_SDACDI, CPCAP_BIT_ST_CLK_EN, 0, NULL, 0), + SND_SOC_DAPM_SUPPLY("Voice DAI Clock", + CPCAP_REG_CDI, CPCAP_BIT_CDC_CLK_EN, 0, NULL, 0), + + /* Microphone Bias */ + SND_SOC_DAPM_SUPPLY("MIC1R Bias", + CPCAP_REG_TXI, CPCAP_BIT_MB_ON1R, 0, NULL, 0), + SND_SOC_DAPM_SUPPLY("MIC1L Bias", + CPCAP_REG_TXI, CPCAP_BIT_MB_ON1L, 0, NULL, 0), + SND_SOC_DAPM_SUPPLY("MIC2 Bias", + CPCAP_REG_TXI, CPCAP_BIT_MB_ON2, 0, NULL, 0), + + /* Inputs */ + SND_SOC_DAPM_INPUT("MICR"), + SND_SOC_DAPM_INPUT("HSMIC"), + SND_SOC_DAPM_INPUT("EMUMIC"), + SND_SOC_DAPM_INPUT("MICL"), + SND_SOC_DAPM_INPUT("EXTR"), + SND_SOC_DAPM_INPUT("EXTL"), + + /* Capture Route */ + SND_SOC_DAPM_MUX("Right Capture Route", + SND_SOC_NOPM, 0, 0, &cpcap_input_right_mux), + SND_SOC_DAPM_MUX("Left Capture Route", + SND_SOC_NOPM, 0, 0, &cpcap_input_left_mux), + + /* Capture PGAs */ + SND_SOC_DAPM_PGA("Microphone 1 PGA", + CPCAP_REG_TXI, CPCAP_BIT_MIC1_PGA_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Microphone 2 PGA", + CPCAP_REG_TXI, CPCAP_BIT_MIC2_PGA_EN, 0, NULL, 0), + + /* ADC */ + SND_SOC_DAPM_ADC("ADC Right", NULL, + CPCAP_REG_CC, CPCAP_BIT_MIC1_CDC_EN, 0), + SND_SOC_DAPM_ADC("ADC Left", NULL, + CPCAP_REG_CC, CPCAP_BIT_MIC2_CDC_EN, 0), + + /* DAC */ + SND_SOC_DAPM_DAC_E("DAC HiFi", NULL, + CPCAP_REG_SDAC, CPCAP_BIT_ST_DAC_EN, 0, + cpcap_st_workaround, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_DAC_E("DAC Voice", NULL, + CPCAP_REG_CC, CPCAP_BIT_CDC_EN_RX, 0, + cpcap_st_workaround, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), + + /* Playback PGA */ + SND_SOC_DAPM_PGA("HiFi PGA", + CPCAP_REG_RXSDOA, CPCAP_BIT_PGA_DAC_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Voice PGA", + CPCAP_REG_RXCOA, CPCAP_BIT_PGA_CDC_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA_E("Ext Right PGA", + CPCAP_REG_RXEPOA, CPCAP_BIT_PGA_EXT_R_EN, 0, + NULL, 0, + cpcap_st_workaround, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), + SND_SOC_DAPM_PGA_E("Ext Left PGA", + CPCAP_REG_RXEPOA, CPCAP_BIT_PGA_EXT_L_EN, 0, + NULL, 0, + cpcap_st_workaround, + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), + + /* Playback Switch */ + SND_SOC_DAPM_SWITCH("Ext Right Enable", SND_SOC_NOPM, 0, 0, + &cpcap_extr_mute_control), + SND_SOC_DAPM_SWITCH("Ext Left Enable", SND_SOC_NOPM, 0, 0, + &cpcap_extl_mute_control), + + /* Loopback Switch */ + SND_SOC_DAPM_SWITCH("Voice Loopback", SND_SOC_NOPM, 0, 0, + &cpcap_voice_loopback), + + /* Mono Mixer */ + SOC_MIXER_ARRAY("HiFi Mono Left Mixer", SND_SOC_NOPM, 0, 0, + cpcap_hifi_mono_mixer_controls), + SOC_MIXER_ARRAY("HiFi Mono Right Mixer", SND_SOC_NOPM, 0, 0, + cpcap_hifi_mono_mixer_controls), + SOC_MIXER_ARRAY("Ext Mono Left Mixer", SND_SOC_NOPM, 0, 0, + cpcap_ext_mono_mixer_controls), + SOC_MIXER_ARRAY("Ext Mono Right Mixer", SND_SOC_NOPM, 0, 0, + cpcap_ext_mono_mixer_controls), + + /* Output Routes */ + SND_SOC_DAPM_MUX("Earpiece Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_earpiece_mux), + SND_SOC_DAPM_MUX("Speaker Right Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_speaker_right_mux), + SND_SOC_DAPM_MUX("Speaker Left Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_speaker_left_mux), + SND_SOC_DAPM_MUX("Lineout Right Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_line_right_mux), + SND_SOC_DAPM_MUX("Lineout Left Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_line_left_mux), + SND_SOC_DAPM_MUX("Headset Right Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_hs_right_mux), + SND_SOC_DAPM_MUX("Headset Left Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_hs_left_mux), + SND_SOC_DAPM_MUX("EMU Right Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_emu_right_mux), + SND_SOC_DAPM_MUX("EMU Left Playback Route", SND_SOC_NOPM, 0, 0, + &cpcap_emu_left_mux), + + /* Output Amplifier */ + SND_SOC_DAPM_PGA("Earpiece PGA", + CPCAP_REG_RXOA, CPCAP_BIT_A1_EAR_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Speaker Right PGA", + CPCAP_REG_RXOA, CPCAP_BIT_A2_LDSP_R_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Speaker Left PGA", + CPCAP_REG_RXOA, CPCAP_BIT_A2_LDSP_L_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Lineout Right PGA", + CPCAP_REG_RXOA, CPCAP_BIT_A4_LINEOUT_R_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Lineout Left PGA", + CPCAP_REG_RXOA, CPCAP_BIT_A4_LINEOUT_L_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Headset Right PGA", + CPCAP_REG_RXOA, CPCAP_BIT_HS_R_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("Headset Left PGA", + CPCAP_REG_RXOA, CPCAP_BIT_HS_L_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("EMU Right PGA", + CPCAP_REG_RXOA, CPCAP_BIT_EMU_SPKR_R_EN, 0, NULL, 0), + SND_SOC_DAPM_PGA("EMU Left PGA", + CPCAP_REG_RXOA, CPCAP_BIT_EMU_SPKR_L_EN, 0, NULL, 0), + + /* Headet Charge Pump */ + SND_SOC_DAPM_SUPPLY("Headset Charge Pump", + CPCAP_REG_RXOA, CPCAP_BIT_ST_HS_CP_EN, 0, NULL, 0), + + /* Outputs */ + SND_SOC_DAPM_OUTPUT("EP"), + SND_SOC_DAPM_OUTPUT("SPKR"), + SND_SOC_DAPM_OUTPUT("SPKL"), + SND_SOC_DAPM_OUTPUT("LINER"), + SND_SOC_DAPM_OUTPUT("LINEL"), + SND_SOC_DAPM_OUTPUT("HSR"), + SND_SOC_DAPM_OUTPUT("HSL"), + SND_SOC_DAPM_OUTPUT("EMUR"), + SND_SOC_DAPM_OUTPUT("EMUL"), +}; + +static const struct snd_soc_dapm_route intercon[] = { + /* Power Supply */ + {"HiFi PGA", NULL, "VAUDIO"}, + {"Voice PGA", NULL, "VAUDIO"}, + {"Ext Right PGA", NULL, "VAUDIO"}, + {"Ext Left PGA", NULL, "VAUDIO"}, + {"Microphone 1 PGA", NULL, "VAUDIO"}, + {"Microphone 2 PGA", NULL, "VAUDIO"}, + + /* Stream -> AIF */ + {"HiFi RX", NULL, "HiFi Playback"}, + {"Voice RX", NULL, "Voice Playback"}, + {"Voice Capture", NULL, "Voice TX"}, + + /* AIF clocks */ + {"HiFi RX", NULL, "HiFi DAI Clock"}, + {"Voice RX", NULL, "Voice DAI Clock"}, + {"Voice TX", NULL, "Voice DAI Clock"}, + + /* Digital Loopback */ + {"Voice Loopback", "Switch", "Voice TX"}, + {"Voice RX", NULL, "Voice Loopback"}, + + /* Highpass Filters */ + {"Highpass Filter RX", NULL, "Voice RX"}, + {"Voice TX", NULL, "Highpass Filter TX"}, + + /* AIF -> DAC mapping */ + {"DAC HiFi", NULL, "HiFi RX"}, + {"DAC Voice", NULL, "Highpass Filter RX"}, + + /* DAC -> PGA */ + {"HiFi PGA", NULL, "DAC HiFi"}, + {"Voice PGA", NULL, "DAC Voice"}, + + /* Ext Input -> PGA */ + {"Ext Right PGA", NULL, "EXTR"}, + {"Ext Left PGA", NULL, "EXTL"}, + + /* Ext PGA -> Ext Playback Switch */ + {"Ext Right Enable", "Switch", "Ext Right PGA"}, + {"Ext Left Enable", "Switch", "Ext Left PGA"}, + + /* HiFi PGA -> Mono Mixer */ + {"HiFi Mono Left Mixer", NULL, "HiFi PGA"}, + {"HiFi Mono Left Mixer", "HiFi Mono Playback Switch", "HiFi PGA"}, + {"HiFi Mono Right Mixer", NULL, "HiFi PGA"}, + {"HiFi Mono Right Mixer", "HiFi Mono Playback Switch", "HiFi PGA"}, + + /* Ext Playback Switch -> Ext Mono Mixer */ + {"Ext Mono Right Mixer", NULL, "Ext Right Enable"}, + {"Ext Mono Right Mixer", "Ext Mono Playback Switch", "Ext Left Enable"}, + {"Ext Mono Left Mixer", NULL, "Ext Left Enable"}, + {"Ext Mono Left Mixer", "Ext Mono Playback Switch", "Ext Right Enable"}, + + /* HiFi Mono Mixer -> Output Route */ + {"Earpiece Playback Route", "HiFi", "HiFi Mono Right Mixer"}, + {"Speaker Right Playback Route", "HiFi", "HiFi Mono Right Mixer"}, + {"Speaker Left Playback Route", "HiFi", "HiFi Mono Left Mixer"}, + {"Lineout Right Playback Route", "HiFi", "HiFi Mono Right Mixer"}, + {"Lineout Left Playback Route", "HiFi", "HiFi Mono Left Mixer"}, + {"Headset Right Playback Route", "HiFi", "HiFi Mono Right Mixer"}, + {"Headset Left Playback Route", "HiFi", "HiFi Mono Left Mixer"}, + {"EMU Right Playback Route", "HiFi", "HiFi Mono Right Mixer"}, + {"EMU Left Playback Route", "HiFi", "HiFi Mono Left Mixer"}, + + /* Voice PGA -> Output Route */ + {"Earpiece Playback Route", "Voice", "Voice PGA"}, + {"Speaker Right Playback Route", "Voice", "Voice PGA"}, + {"Speaker Left Playback Route", "Voice", "Voice PGA"}, + {"Lineout Right Playback Route", "Voice", "Voice PGA"}, + {"Lineout Left Playback Route", "Voice", "Voice PGA"}, + {"Headset Right Playback Route", "Voice", "Voice PGA"}, + {"Headset Left Playback Route", "Voice", "Voice PGA"}, + {"EMU Right Playback Route", "Voice", "Voice PGA"}, + {"EMU Left Playback Route", "Voice", "Voice PGA"}, + + /* Ext Mono Mixer -> Output Route */ + {"Earpiece Playback Route", "Ext", "Ext Mono Right Mixer"}, + {"Speaker Right Playback Route", "Ext", "Ext Mono Right Mixer"}, + {"Speaker Left Playback Route", "Ext", "Ext Mono Left Mixer"}, + {"Lineout Right Playback Route", "Ext", "Ext Mono Right Mixer"}, + {"Lineout Left Playback Route", "Ext", "Ext Mono Left Mixer"}, + {"Headset Right Playback Route", "Ext", "Ext Mono Right Mixer"}, + {"Headset Left Playback Route", "Ext", "Ext Mono Left Mixer"}, + {"EMU Right Playback Route", "Ext", "Ext Mono Right Mixer"}, + {"EMU Left Playback Route", "Ext", "Ext Mono Left Mixer"}, + + /* Output Route -> Output Amplifier */ + {"Earpiece PGA", NULL, "Earpiece Playback Route"}, + {"Speaker Right PGA", NULL, "Speaker Right Playback Route"}, + {"Speaker Left PGA", NULL, "Speaker Left Playback Route"}, + {"Lineout Right PGA", NULL, "Lineout Right Playback Route"}, + {"Lineout Left PGA", NULL, "Lineout Left Playback Route"}, + {"Headset Right PGA", NULL, "Headset Right Playback Route"}, + {"Headset Left PGA", NULL, "Headset Left Playback Route"}, + {"EMU Right PGA", NULL, "EMU Right Playback Route"}, + {"EMU Left PGA", NULL, "EMU Left Playback Route"}, + + /* Output Amplifier -> Output */ + {"EP", NULL, "Earpiece PGA"}, + {"SPKR", NULL, "Speaker Right PGA"}, + {"SPKL", NULL, "Speaker Left PGA"}, + {"LINER", NULL, "Lineout Right PGA"}, + {"LINEL", NULL, "Lineout Left PGA"}, + {"HSR", NULL, "Headset Right PGA"}, + {"HSL", NULL, "Headset Left PGA"}, + {"EMUR", NULL, "EMU Right PGA"}, + {"EMUL", NULL, "EMU Left PGA"}, + + /* Headset Charge Pump -> Headset */ + {"HSR", NULL, "Headset Charge Pump"}, + {"HSL", NULL, "Headset Charge Pump"}, + + /* Mic -> Mic Route */ + {"Right Capture Route", "Mic 1", "MICR"}, + {"Right Capture Route", "Headset Mic", "HSMIC"}, + {"Right Capture Route", "EMU Mic", "EMUMIC"}, + {"Right Capture Route", "Ext Right", "EXTR"}, + {"Left Capture Route", "Mic 2", "MICL"}, + {"Left Capture Route", "Ext Left", "EXTL"}, + + /* Input Route -> Microphone PGA */ + {"Microphone 1 PGA", NULL, "Right Capture Route"}, + {"Microphone 2 PGA", NULL, "Left Capture Route"}, + + /* Microphone PGA -> ADC */ + {"ADC Right", NULL, "Microphone 1 PGA"}, + {"ADC Left", NULL, "Microphone 2 PGA"}, + + /* ADC -> Stream */ + {"Highpass Filter TX", NULL, "ADC Right"}, + {"Highpass Filter TX", NULL, "ADC Left"}, + + /* Mic Bias */ + {"MICL", NULL, "MIC1L Bias"}, + {"MICR", NULL, "MIC1R Bias"}, +}; + +static int cpcap_set_sysclk(struct cpcap_audio *cpcap, enum cpcap_dai dai, + int clk_id, int freq) +{ + u16 clkfreqreg, clkfreqshift; + u16 clkfreqmask, clkfreqval; + u16 clkidreg, clkidshift; + u16 mask, val; + int err; + + switch (dai) { + case CPCAP_DAI_HIFI: + clkfreqreg = CPCAP_REG_SDAC; + clkfreqshift = CPCAP_BIT_ST_DAC_CLK0; + clkidreg = CPCAP_REG_SDACDI; + clkidshift = CPCAP_BIT_ST_DAC_CLK_IN_SEL; + break; + case CPCAP_DAI_VOICE: + clkfreqreg = CPCAP_REG_CC; + clkfreqshift = CPCAP_BIT_CDC_CLK0; + clkidreg = CPCAP_REG_CDI; + clkidshift = CPCAP_BIT_CLK_IN_SEL; + break; + default: + dev_err(cpcap->component->dev, "invalid DAI: %d", dai); + return -EINVAL; + } + + /* setup clk id */ + if (clk_id < 0 || clk_id > 1) { + dev_err(cpcap->component->dev, "invalid clk id %d", clk_id); + return -EINVAL; + } + err = regmap_update_bits(cpcap->regmap, clkidreg, BIT(clkidshift), + clk_id ? BIT(clkidshift) : 0); + if (err) + return err; + + /* enable PLL for Voice DAI */ + if (dai == CPCAP_DAI_VOICE) { + mask = BIT(CPCAP_BIT_CDC_PLL_SEL); + val = BIT(CPCAP_BIT_CDC_PLL_SEL); + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CDI, + mask, val); + if (err) + return err; + } + + /* setup frequency */ + clkfreqmask = 0x7 << clkfreqshift; + switch (freq) { + case 15360000: + clkfreqval = 0x01 << clkfreqshift; + break; + case 16800000: + clkfreqval = 0x02 << clkfreqshift; + break; + case 19200000: + clkfreqval = 0x03 << clkfreqshift; + break; + case 26000000: + clkfreqval = 0x04 << clkfreqshift; + break; + case 33600000: + clkfreqval = 0x05 << clkfreqshift; + break; + case 38400000: + clkfreqval = 0x06 << clkfreqshift; + break; + default: + dev_err(cpcap->component->dev, "unsupported freq %u", freq); + return -EINVAL; + } + + err = regmap_update_bits(cpcap->regmap, clkfreqreg, + clkfreqmask, clkfreqval); + if (err) + return err; + + if (dai == CPCAP_DAI_VOICE) { + cpcap->codec_clk_id = clk_id; + cpcap->codec_freq = freq; + } + + return 0; +} + +static int cpcap_set_samprate(struct cpcap_audio *cpcap, enum cpcap_dai dai, + int samplerate) +{ + struct snd_soc_component *component = cpcap->component; + u16 sampreg, sampmask, sampshift, sampval, sampreset; + int err, sampreadval; + + switch (dai) { + case CPCAP_DAI_HIFI: + sampreg = CPCAP_REG_SDAC; + sampshift = CPCAP_BIT_ST_SR0; + sampreset = BIT(CPCAP_BIT_DF_RESET_ST_DAC) | + BIT(CPCAP_BIT_ST_CLOCK_TREE_RESET); + break; + case CPCAP_DAI_VOICE: + sampreg = CPCAP_REG_CC; + sampshift = CPCAP_BIT_CDC_SR0; + sampreset = BIT(CPCAP_BIT_DF_RESET) | + BIT(CPCAP_BIT_CDC_CLOCK_TREE_RESET); + break; + default: + dev_err(component->dev, "invalid DAI: %d", dai); + return -EINVAL; + } + + sampmask = 0xF << sampshift | sampreset; + switch (samplerate) { + case 48000: + sampval = 0x8 << sampshift; + break; + case 44100: + sampval = 0x7 << sampshift; + break; + case 32000: + sampval = 0x6 << sampshift; + break; + case 24000: + sampval = 0x5 << sampshift; + break; + case 22050: + sampval = 0x4 << sampshift; + break; + case 16000: + sampval = 0x3 << sampshift; + break; + case 12000: + sampval = 0x2 << sampshift; + break; + case 11025: + sampval = 0x1 << sampshift; + break; + case 8000: + sampval = 0x0 << sampshift; + break; + default: + dev_err(component->dev, "unsupported samplerate %d", samplerate); + return -EINVAL; + } + err = regmap_update_bits(cpcap->regmap, sampreg, + sampmask, sampval | sampreset); + if (err) + return err; + + /* Wait for clock tree reset to complete */ + mdelay(CLOCK_TREE_RESET_TIME); + + err = regmap_read(cpcap->regmap, sampreg, &sampreadval); + if (err) + return err; + + if (sampreadval & sampreset) { + dev_err(component->dev, "reset self-clear failed: %04x", + sampreadval); + return -EIO; + } + + return 0; +} + +static int cpcap_hifi_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + int rate = params_rate(params); + + dev_dbg(component->dev, "HiFi setup HW params: rate=%d", rate); + return cpcap_set_samprate(cpcap, CPCAP_DAI_HIFI, rate); +} + +static int cpcap_hifi_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_component *component = codec_dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct device *dev = component->dev; + + dev_dbg(dev, "HiFi setup sysclk: clk_id=%u, freq=%u", clk_id, freq); + return cpcap_set_sysclk(cpcap, CPCAP_DAI_HIFI, clk_id, freq); +} + +static int cpcap_hifi_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_component *component = codec_dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + struct device *dev = component->dev; + static const u16 reg = CPCAP_REG_SDACDI; + static const u16 mask = + BIT(CPCAP_BIT_SMB_ST_DAC) | + BIT(CPCAP_BIT_ST_CLK_INV) | + BIT(CPCAP_BIT_ST_FS_INV) | + BIT(CPCAP_BIT_ST_DIG_AUD_FS0) | + BIT(CPCAP_BIT_ST_DIG_AUD_FS1) | + BIT(CPCAP_BIT_ST_L_TIMESLOT0) | + BIT(CPCAP_BIT_ST_L_TIMESLOT1) | + BIT(CPCAP_BIT_ST_L_TIMESLOT2) | + BIT(CPCAP_BIT_ST_R_TIMESLOT0) | + BIT(CPCAP_BIT_ST_R_TIMESLOT1) | + BIT(CPCAP_BIT_ST_R_TIMESLOT2); + u16 val = 0x0000; + + dev_dbg(dev, "HiFi setup dai format (%08x)", fmt); + + /* + * "HiFi Playback" should always be configured as + * SND_SOC_DAIFMT_CBM_CFM - codec clk & frm master + * SND_SOC_DAIFMT_I2S - I2S mode + */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + val &= ~BIT(CPCAP_BIT_SMB_ST_DAC); + break; + default: + dev_err(dev, "HiFi dai fmt failed: CPCAP should be master"); + return -EINVAL; + } + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_IB_IF: + val |= BIT(CPCAP_BIT_ST_FS_INV); + val |= BIT(CPCAP_BIT_ST_CLK_INV); + break; + case SND_SOC_DAIFMT_IB_NF: + val &= ~BIT(CPCAP_BIT_ST_FS_INV); + val |= BIT(CPCAP_BIT_ST_CLK_INV); + break; + case SND_SOC_DAIFMT_NB_IF: + val |= BIT(CPCAP_BIT_ST_FS_INV); + val &= ~BIT(CPCAP_BIT_ST_CLK_INV); + break; + case SND_SOC_DAIFMT_NB_NF: + val &= ~BIT(CPCAP_BIT_ST_FS_INV); + val &= ~BIT(CPCAP_BIT_ST_CLK_INV); + break; + default: + dev_err(dev, "HiFi dai fmt failed: unsupported clock invert mode"); + return -EINVAL; + } + + if (val & BIT(CPCAP_BIT_ST_CLK_INV)) + val &= ~BIT(CPCAP_BIT_ST_CLK_INV); + else + val |= BIT(CPCAP_BIT_ST_CLK_INV); + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + val |= BIT(CPCAP_BIT_ST_DIG_AUD_FS0); + val |= BIT(CPCAP_BIT_ST_DIG_AUD_FS1); + break; + default: + /* 01 - 4 slots network mode */ + val |= BIT(CPCAP_BIT_ST_DIG_AUD_FS0); + val &= ~BIT(CPCAP_BIT_ST_DIG_AUD_FS1); + /* L on slot 1 */ + val |= BIT(CPCAP_BIT_ST_L_TIMESLOT0); + break; + } + + dev_dbg(dev, "HiFi dai format: val=%04x", val); + return regmap_update_bits(cpcap->regmap, reg, mask, val); +} + +static int cpcap_hifi_set_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_component *component = dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + static const u16 reg = CPCAP_REG_RXSDOA; + static const u16 mask = BIT(CPCAP_BIT_ST_DAC_SW); + u16 val; + + if (mute) + val = 0; + else + val = BIT(CPCAP_BIT_ST_DAC_SW); + + dev_dbg(component->dev, "HiFi mute: %d", mute); + return regmap_update_bits(cpcap->regmap, reg, mask, val); +} + +static const struct snd_soc_dai_ops cpcap_dai_hifi_ops = { + .hw_params = cpcap_hifi_hw_params, + .set_sysclk = cpcap_hifi_set_dai_sysclk, + .set_fmt = cpcap_hifi_set_dai_fmt, + .digital_mute = cpcap_hifi_set_mute, +}; + +static int cpcap_voice_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct device *dev = component->dev; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + static const u16 reg_cdi = CPCAP_REG_CDI; + int rate = params_rate(params); + int channels = params_channels(params); + int direction = substream->stream; + u16 val, mask; + int err; + + dev_dbg(dev, "Voice setup HW params: rate=%d, direction=%d, chan=%d", + rate, direction, channels); + + err = cpcap_set_samprate(cpcap, CPCAP_DAI_VOICE, rate); + if (err) + return err; + + if (direction == SNDRV_PCM_STREAM_CAPTURE) { + mask = 0x0000; + mask |= CPCAP_BIT_MIC1_RX_TIMESLOT0; + mask |= CPCAP_BIT_MIC1_RX_TIMESLOT1; + mask |= CPCAP_BIT_MIC1_RX_TIMESLOT2; + mask |= CPCAP_BIT_MIC2_TIMESLOT0; + mask |= CPCAP_BIT_MIC2_TIMESLOT1; + mask |= CPCAP_BIT_MIC2_TIMESLOT2; + val = 0x0000; + if (channels >= 2) + val = BIT(CPCAP_BIT_MIC1_RX_TIMESLOT0); + err = regmap_update_bits(cpcap->regmap, reg_cdi, mask, val); + if (err) + return err; + } + + return 0; +} + +static int cpcap_voice_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, + unsigned int freq, int dir) +{ + struct snd_soc_component *component = codec_dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + + dev_dbg(component->dev, "Voice setup sysclk: clk_id=%u, freq=%u", + clk_id, freq); + return cpcap_set_sysclk(cpcap, CPCAP_DAI_VOICE, clk_id, freq); +} + +static int cpcap_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int fmt) +{ + struct snd_soc_component *component = codec_dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + static const u16 mask = BIT(CPCAP_BIT_SMB_CDC) | + BIT(CPCAP_BIT_CLK_INV) | + BIT(CPCAP_BIT_FS_INV) | + BIT(CPCAP_BIT_CDC_DIG_AUD_FS0) | + BIT(CPCAP_BIT_CDC_DIG_AUD_FS1); + u16 val = 0x0000; + int err; + + dev_dbg(component->dev, "Voice setup dai format (%08x)", fmt); + + /* + * "Voice Playback" and "Voice Capture" should always be + * configured as SND_SOC_DAIFMT_CBM_CFM - codec clk & frm + * master + */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBM_CFM: + val &= ~BIT(CPCAP_BIT_SMB_CDC); + break; + default: + dev_err(component->dev, "Voice dai fmt failed: CPCAP should be the master"); + val &= ~BIT(CPCAP_BIT_SMB_CDC); + break; + } + + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_IB_IF: + val |= BIT(CPCAP_BIT_CLK_INV); + val |= BIT(CPCAP_BIT_FS_INV); + break; + case SND_SOC_DAIFMT_IB_NF: + val |= BIT(CPCAP_BIT_CLK_INV); + val &= ~BIT(CPCAP_BIT_FS_INV); + break; + case SND_SOC_DAIFMT_NB_IF: + val &= ~BIT(CPCAP_BIT_CLK_INV); + val |= BIT(CPCAP_BIT_FS_INV); + break; + case SND_SOC_DAIFMT_NB_NF: + val &= ~BIT(CPCAP_BIT_CLK_INV); + val &= ~BIT(CPCAP_BIT_FS_INV); + break; + default: + dev_err(component->dev, "Voice dai fmt failed: unsupported clock invert mode"); + break; + } + + if (val & BIT(CPCAP_BIT_CLK_INV)) + val &= ~BIT(CPCAP_BIT_CLK_INV); + else + val |= BIT(CPCAP_BIT_CLK_INV); + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + /* 11 - true I2S mode */ + val |= BIT(CPCAP_BIT_CDC_DIG_AUD_FS0); + val |= BIT(CPCAP_BIT_CDC_DIG_AUD_FS1); + break; + default: + /* 4 timeslots network mode */ + val |= BIT(CPCAP_BIT_CDC_DIG_AUD_FS0); + val &= ~BIT(CPCAP_BIT_CDC_DIG_AUD_FS1); + break; + } + + dev_dbg(component->dev, "Voice dai format: val=%04x", val); + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CDI, mask, val); + if (err) + return err; + + cpcap->codec_format = val; + return 0; +} + +static int cpcap_voice_set_mute(struct snd_soc_dai *dai, int mute) +{ + struct snd_soc_component *component = dai->component; + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + static const u16 reg = CPCAP_REG_RXCOA; + static const u16 mask = BIT(CPCAP_BIT_CDC_SW); + u16 val; + + if (mute) + val = 0; + else + val = BIT(CPCAP_BIT_CDC_SW); + + dev_dbg(component->dev, "Voice mute: %d", mute); + return regmap_update_bits(cpcap->regmap, reg, mask, val); +}; + +static const struct snd_soc_dai_ops cpcap_dai_voice_ops = { + .hw_params = cpcap_voice_hw_params, + .set_sysclk = cpcap_voice_set_dai_sysclk, + .set_fmt = cpcap_voice_set_dai_fmt, + .digital_mute = cpcap_voice_set_mute, +}; + +static struct snd_soc_dai_driver cpcap_dai[] = { +{ + .id = 0, + .name = "cpcap-hifi", + .playback = { + .stream_name = "HiFi Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE, + }, + .ops = &cpcap_dai_hifi_ops, +}, +{ + .id = 1, + .name = "cpcap-voice", + .playback = { + .stream_name = "Voice Playback", + .channels_min = 1, + .channels_max = 1, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .capture = { + .stream_name = "Voice Capture", + .channels_min = 1, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .ops = &cpcap_dai_voice_ops, +}, +}; + +static int cpcap_dai_mux(struct cpcap_audio *cpcap, bool swap_dai_configuration) +{ + u16 hifi_val, voice_val; + u16 hifi_mask = BIT(CPCAP_BIT_DIG_AUD_IN_ST_DAC); + u16 voice_mask = BIT(CPCAP_BIT_DIG_AUD_IN); + int err; + + + + if (!swap_dai_configuration) { + /* Codec on DAI0, HiFi on DAI1 */ + voice_val = 0; + hifi_val = hifi_mask; + } else { + /* Codec on DAI1, HiFi on DAI0 */ + voice_val = voice_mask; + hifi_val = 0; + } + + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CDI, + voice_mask, voice_val); + if (err) + return err; + + err = regmap_update_bits(cpcap->regmap, CPCAP_REG_SDACDI, + hifi_mask, hifi_val); + if (err) + return err; + + return 0; +} + +static int cpcap_audio_reset(struct snd_soc_component *component, + bool swap_dai_configuration) +{ + struct cpcap_audio *cpcap = snd_soc_component_get_drvdata(component); + int i, err = 0; + + dev_dbg(component->dev, "init audio codec"); + + for (i = 0; i < ARRAY_SIZE(cpcap_default_regs); i++) { + err = regmap_update_bits(cpcap->regmap, + cpcap_default_regs[i].reg, + cpcap_default_regs[i].mask, + cpcap_default_regs[i].val); + if (err) + return err; + } + + /* setup default settings */ + err = cpcap_dai_mux(cpcap, swap_dai_configuration); + if (err) + return err; + + err = cpcap_set_sysclk(cpcap, CPCAP_DAI_HIFI, 0, 26000000); + if (err) + return err; + err = cpcap_set_sysclk(cpcap, CPCAP_DAI_VOICE, 0, 26000000); + if (err) + return err; + + err = cpcap_set_samprate(cpcap, CPCAP_DAI_HIFI, 48000); + if (err) + return err; + + err = cpcap_set_samprate(cpcap, CPCAP_DAI_VOICE, 48000); + if (err) + return err; + + return 0; +} + +static int cpcap_soc_probe(struct snd_soc_component *component) +{ + struct cpcap_audio *cpcap; + int err; + + cpcap = devm_kzalloc(component->dev, sizeof(*cpcap), GFP_KERNEL); + if (!cpcap) + return -ENOMEM; + snd_soc_component_set_drvdata(component, cpcap); + cpcap->component = component; + + cpcap->regmap = dev_get_regmap(component->dev->parent, NULL); + if (!cpcap->regmap) + return -ENODEV; + snd_soc_component_init_regmap(component, cpcap->regmap); + + err = cpcap_get_vendor(component->dev, cpcap->regmap, &cpcap->vendor); + if (err) + return err; + + return cpcap_audio_reset(component, false); +} + +static struct snd_soc_component_driver soc_codec_dev_cpcap = { + .probe = cpcap_soc_probe, + .controls = cpcap_snd_controls, + .num_controls = ARRAY_SIZE(cpcap_snd_controls), + .dapm_widgets = cpcap_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cpcap_dapm_widgets), + .dapm_routes = intercon, + .num_dapm_routes = ARRAY_SIZE(intercon), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; + +static int cpcap_codec_probe(struct platform_device *pdev) +{ + struct device_node *codec_node = + of_get_child_by_name(pdev->dev.parent->of_node, "audio-codec"); + + pdev->dev.of_node = codec_node; + + return devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_cpcap, + cpcap_dai, ARRAY_SIZE(cpcap_dai)); +} + +static struct platform_driver cpcap_codec_driver = { + .probe = cpcap_codec_probe, + .driver = { + .name = "cpcap-codec", + }, +}; +module_platform_driver(cpcap_codec_driver); + +MODULE_ALIAS("platform:cpcap-codec"); +MODULE_DESCRIPTION("ASoC CPCAP codec driver"); +MODULE_AUTHOR("Sebastian Reichel"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/codecs/cq93vc.c b/sound/soc/codecs/cq93vc.c index 3bf93652bb31..3301861d3502 100644 --- a/sound/soc/codecs/cq93vc.c +++ b/sound/soc/codecs/cq93vc.c @@ -45,7 +45,7 @@ static const struct snd_kcontrol_new cq93vc_snd_controls[] = { static int cq93vc_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 reg; if (mute) @@ -53,7 +53,7 @@ static int cq93vc_mute(struct snd_soc_dai *dai, int mute) else reg = 0; - snd_soc_update_bits(codec, DAVINCI_VC_REG09, DAVINCI_VC_REG09_MUTE, + snd_soc_component_update_bits(component, DAVINCI_VC_REG09, DAVINCI_VC_REG09_MUTE, reg); return 0; @@ -72,23 +72,23 @@ static int cq93vc_set_dai_sysclk(struct snd_soc_dai *codec_dai, return -EINVAL; } -static int cq93vc_set_bias_level(struct snd_soc_codec *codec, +static int cq93vc_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: - snd_soc_write(codec, DAVINCI_VC_REG12, + snd_soc_component_write(component, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_ON); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, DAVINCI_VC_REG12, + snd_soc_component_write(component, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_OFF); break; case SND_SOC_BIAS_OFF: /* force all power off */ - snd_soc_write(codec, DAVINCI_VC_REG12, + snd_soc_component_write(component, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_OFF); break; } @@ -130,24 +130,25 @@ static int cq93vc_probe(struct snd_soc_component *component) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_cq93vc = { - .set_bias_level = cq93vc_set_bias_level, - .component_driver = { - .probe = cq93vc_probe, - .controls = cq93vc_snd_controls, - .num_controls = ARRAY_SIZE(cq93vc_snd_controls), - }, +static const struct snd_soc_component_driver soc_component_dev_cq93vc = { + .set_bias_level = cq93vc_set_bias_level, + .probe = cq93vc_probe, + .controls = cq93vc_snd_controls, + .num_controls = ARRAY_SIZE(cq93vc_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int cq93vc_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_cq93vc, &cq93vc_dai, 1); + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_cq93vc, &cq93vc_dai, 1); } static int cq93vc_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/codecs/cs35l32.c b/sound/soc/codecs/cs35l32.c index bc3a72e4c4ed..4297058b6938 100644 --- a/sound/soc/codecs/cs35l32.c +++ b/sound/soc/codecs/cs35l32.c @@ -43,7 +43,7 @@ static const char *const cs35l32_supply_names[CS35L32_NUM_SUPPLIES] = { struct cs35l32_private { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regulator_bulk_data supplies[CS35L32_NUM_SUPPLIES]; struct cs35l32_platform_data pdata; struct gpio_desc *reset_gpio; @@ -154,16 +154,16 @@ static const struct snd_soc_dapm_route cs35l32_audio_map[] = { static int cs35l32_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - snd_soc_update_bits(codec, CS35L32_ADSP_CTL, + snd_soc_component_update_bits(component, CS35L32_ADSP_CTL, CS35L32_ADSP_MASTER_MASK, CS35L32_ADSP_MASTER_MASK); break; case SND_SOC_DAIFMT_CBS_CFS: - snd_soc_update_bits(codec, CS35L32_ADSP_CTL, + snd_soc_component_update_bits(component, CS35L32_ADSP_CTL, CS35L32_ADSP_MASTER_MASK, 0); break; default: @@ -175,9 +175,9 @@ static int cs35l32_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int cs35l32_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - return snd_soc_update_bits(codec, CS35L32_PWRCTL2, + return snd_soc_component_update_bits(component, CS35L32_PWRCTL2, CS35L32_SDOUT_3ST, tristate << 3); } @@ -202,7 +202,7 @@ static struct snd_soc_dai_driver cs35l32_dai[] = { } }; -static int cs35l32_codec_set_sysclk(struct snd_soc_codec *codec, +static int cs35l32_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { unsigned int val; @@ -224,21 +224,22 @@ static int cs35l32_codec_set_sysclk(struct snd_soc_codec *codec, return -EINVAL; } - return snd_soc_update_bits(codec, CS35L32_CLK_CTL, + return snd_soc_component_update_bits(component, CS35L32_CLK_CTL, CS35L32_MCLK_DIV2_MASK | CS35L32_MCLK_RATIO_MASK, val); } -static const struct snd_soc_codec_driver soc_codec_dev_cs35l32 = { - .set_sysclk = cs35l32_codec_set_sysclk, - - .component_driver = { - .controls = cs35l32_snd_controls, - .num_controls = ARRAY_SIZE(cs35l32_snd_controls), - .dapm_widgets = cs35l32_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs35l32_dapm_widgets), - .dapm_routes = cs35l32_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs35l32_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_cs35l32 = { + .set_sysclk = cs35l32_component_set_sysclk, + .controls = cs35l32_snd_controls, + .num_controls = ARRAY_SIZE(cs35l32_snd_controls), + .dapm_widgets = cs35l32_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs35l32_dapm_widgets), + .dapm_routes = cs35l32_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs35l32_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* Current and threshold powerup sequence Pg37 in datasheet */ @@ -483,8 +484,8 @@ static int cs35l32_i2c_probe(struct i2c_client *i2c_client, /* Clear MCLK Error Bit since we don't have the clock yet */ ret = regmap_read(cs35l32->regmap, CS35L32_INT_STATUS_1, ®); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs35l32, cs35l32_dai, + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs35l32, cs35l32_dai, ARRAY_SIZE(cs35l32_dai)); if (ret < 0) goto err_disable; @@ -501,8 +502,6 @@ static int cs35l32_i2c_remove(struct i2c_client *i2c_client) { struct cs35l32_private *cs35l32 = i2c_get_clientdata(i2c_client); - snd_soc_unregister_codec(&i2c_client->dev); - /* Hold down reset */ gpiod_set_value_cansleep(cs35l32->reset_gpio, 0); diff --git a/sound/soc/codecs/cs35l33.c b/sound/soc/codecs/cs35l33.c index 854cf8f27605..668cd3754209 100644 --- a/sound/soc/codecs/cs35l33.c +++ b/sound/soc/codecs/cs35l33.c @@ -42,7 +42,7 @@ #define CS35L33_BOOT_DELAY 50 struct cs35l33_private { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct cs35l33_pdata pdata; struct regmap *regmap; struct gpio_desc *reset_gpio; @@ -201,8 +201,8 @@ static const struct snd_kcontrol_new cs35l33_snd_controls[] = { static int cs35l33_spkrdrv_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -211,15 +211,15 @@ static int cs35l33_spkrdrv_event(struct snd_soc_dapm_widget *w, priv->amp_cal = true; regmap_update_bits(priv->regmap, CS35L33_CLASSD_CTL, CS35L33_AMP_CAL, 0); - dev_dbg(codec->dev, "Amp calibration done\n"); + dev_dbg(component->dev, "Amp calibration done\n"); } - dev_dbg(codec->dev, "Amp turned on\n"); + dev_dbg(component->dev, "Amp turned on\n"); break; case SND_SOC_DAPM_POST_PMD: - dev_dbg(codec->dev, "Amp turned off\n"); + dev_dbg(component->dev, "Amp turned off\n"); break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); break; } @@ -229,8 +229,8 @@ static int cs35l33_spkrdrv_event(struct snd_soc_dapm_widget *w, static int cs35l33_sdin_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); unsigned int val; switch (event) { @@ -240,14 +240,14 @@ static int cs35l33_sdin_event(struct snd_soc_dapm_widget *w, val = priv->is_tdm_mode ? 0 : CS35L33_PDN_TDM; regmap_update_bits(priv->regmap, CS35L33_PWRCTL2, CS35L33_PDN_TDM, val); - dev_dbg(codec->dev, "BST turned on\n"); + dev_dbg(component->dev, "BST turned on\n"); break; case SND_SOC_DAPM_POST_PMU: - dev_dbg(codec->dev, "SDIN turned on\n"); + dev_dbg(component->dev, "SDIN turned on\n"); if (!priv->amp_cal) { regmap_update_bits(priv->regmap, CS35L33_CLASSD_CTL, CS35L33_AMP_CAL, CS35L33_AMP_CAL); - dev_dbg(codec->dev, "Amp calibration started\n"); + dev_dbg(component->dev, "Amp calibration started\n"); usleep_range(10000, 11000); } break; @@ -257,10 +257,10 @@ static int cs35l33_sdin_event(struct snd_soc_dapm_widget *w, usleep_range(4000, 4100); regmap_update_bits(priv->regmap, CS35L33_PWRCTL1, CS35L33_PDN_BST, CS35L33_PDN_BST); - dev_dbg(codec->dev, "BST and SDIN turned off\n"); + dev_dbg(component->dev, "BST and SDIN turned off\n"); break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); } @@ -270,8 +270,8 @@ static int cs35l33_sdin_event(struct snd_soc_dapm_widget *w, static int cs35l33_sdout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); unsigned int mask = CS35L33_SDOUT_3ST_I2S | CS35L33_PDN_TDM; unsigned int mask2 = CS35L33_SDOUT_3ST_TDM; unsigned int val, val2; @@ -289,15 +289,15 @@ static int cs35l33_sdout_event(struct snd_soc_dapm_widget *w, /* set sdout_3st_tdm */ val2 = CS35L33_SDOUT_3ST_TDM; } - dev_dbg(codec->dev, "SDOUT turned on\n"); + dev_dbg(component->dev, "SDOUT turned on\n"); break; case SND_SOC_DAPM_PRE_PMD: val = CS35L33_SDOUT_3ST_I2S | CS35L33_PDN_TDM; val2 = CS35L33_SDOUT_3ST_TDM; - dev_dbg(codec->dev, "SDOUT turned off\n"); + dev_dbg(component->dev, "SDOUT turned off\n"); break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); return 0; } @@ -360,11 +360,11 @@ static const struct snd_soc_dapm_route cs35l33_vp_vbst_mon_route[] = { {"VBSTMON", NULL, "MON"}, }; -static int cs35l33_set_bias_level(struct snd_soc_codec *codec, +static int cs35l33_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { unsigned int val; - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -441,19 +441,19 @@ static int cs35l33_get_mclk_coeff(int mclk, int srate) static int cs35l33_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: regmap_update_bits(priv->regmap, CS35L33_ADSP_CTL, CS35L33_MS_MASK, CS35L33_MS_MASK); - dev_dbg(codec->dev, "Audio port in master mode\n"); + dev_dbg(component->dev, "Audio port in master mode\n"); break; case SND_SOC_DAIFMT_CBS_CFS: regmap_update_bits(priv->regmap, CS35L33_ADSP_CTL, CS35L33_MS_MASK, 0); - dev_dbg(codec->dev, "Audio port in slave mode\n"); + dev_dbg(component->dev, "Audio port in slave mode\n"); break; default: return -EINVAL; @@ -466,11 +466,11 @@ static int cs35l33_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) * closely, it is dsp-a with fsync shifted left by half bclk */ priv->is_tdm_mode = true; - dev_dbg(codec->dev, "Audio port in TDM mode\n"); + dev_dbg(component->dev, "Audio port in TDM mode\n"); break; case SND_SOC_DAIFMT_I2S: priv->is_tdm_mode = false; - dev_dbg(codec->dev, "Audio port in I2S mode\n"); + dev_dbg(component->dev, "Audio port in I2S mode\n"); break; default: return -EINVAL; @@ -483,8 +483,8 @@ static int cs35l33_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); int sample_size = params_width(params); int coeff = cs35l33_get_mclk_coeff(priv->mclk_int, params_rate(params)); @@ -505,7 +505,7 @@ static int cs35l33_pcm_hw_params(struct snd_pcm_substream *substream, sample_size << CS35L33_AUDIN_RX_DEPTH_SHIFT); } - dev_dbg(codec->dev, "sample rate=%d, bits per sample=%d\n", + dev_dbg(component->dev, "sample rate=%d, bits per sample=%d\n", params_rate(params), params_width(params)); return 0; @@ -532,8 +532,8 @@ static int cs35l33_pcm_startup(struct snd_pcm_substream *substream, static int cs35l33_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); if (tristate) { regmap_update_bits(priv->regmap, CS35L33_PWRCTL2, @@ -553,9 +553,9 @@ static int cs35l33_set_tristate(struct snd_soc_dai *dai, int tristate) static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); unsigned int reg, bit_pos, i; int slot, slot_num; @@ -567,7 +567,7 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, if (slot >= 0) { regmap_update_bits(priv->regmap, CS35L33_RX_AUD, CS35L33_X_LOC, slot); - dev_dbg(codec->dev, "Audio starts from slots %d", slot); + dev_dbg(component->dev, "Audio starts from slots %d", slot); } /* @@ -593,7 +593,7 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, if (slot_num == 0) { regmap_update_bits(priv->regmap, CS35L33_TX_VMON, CS35L33_X_STATE | CS35L33_X_LOC, slot); - dev_dbg(codec->dev, "VMON enabled in slots %d-%d", + dev_dbg(component->dev, "VMON enabled in slots %d-%d", slot, slot + 1); } @@ -601,7 +601,7 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, if (slot_num == 3) { regmap_update_bits(priv->regmap, CS35L33_TX_IMON, CS35L33_X_STATE | CS35L33_X_LOC, slot); - dev_dbg(codec->dev, "IMON enabled in slots %d-%d", + dev_dbg(component->dev, "IMON enabled in slots %d-%d", slot, slot + 1); } @@ -611,7 +611,7 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, CS35L33_X_STATE | CS35L33_X_LOC, slot); snd_soc_dapm_add_routes(dapm, &cs35l33_vp_vbst_mon_route[0], 2); - dev_dbg(codec->dev, "VPMON enabled in slots %d", slot); + dev_dbg(component->dev, "VPMON enabled in slots %d", slot); } /* configure VBSTMON_TX_LOC */ @@ -620,7 +620,7 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, CS35L33_X_STATE | CS35L33_X_LOC, slot); snd_soc_dapm_add_routes(dapm, &cs35l33_vp_vbst_mon_route[2], 2); - dev_dbg(codec->dev, + dev_dbg(component->dev, "VBSTMON enabled in slots %d", slot); } @@ -638,10 +638,10 @@ static int cs35l33_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return 0; } -static int cs35l33_codec_set_sysclk(struct snd_soc_codec *codec, +static int cs35l33_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct cs35l33_private *cs35l33 = snd_soc_codec_get_drvdata(codec); + struct cs35l33_private *cs35l33 = snd_soc_component_get_drvdata(component); switch (freq) { case CS35L33_MCLK_5644: @@ -663,7 +663,7 @@ static int cs35l33_codec_set_sysclk(struct snd_soc_codec *codec, return -EINVAL; } - dev_dbg(codec->dev, "external mclk freq=%d, internal mclk freq=%d\n", + dev_dbg(component->dev, "external mclk freq=%d, internal mclk freq=%d\n", freq, cs35l33->mclk_int); return 0; @@ -698,12 +698,12 @@ static struct snd_soc_dai_driver cs35l33_dai = { .symmetric_rates = 1, }; -static int cs35l33_set_hg_data(struct snd_soc_codec *codec, +static int cs35l33_set_hg_data(struct snd_soc_component *component, struct cs35l33_pdata *pdata) { struct cs35l33_hg *hg_config = &pdata->hg_config; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct cs35l33_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct cs35l33_private *priv = snd_soc_component_get_drvdata(component); if (hg_config->enable_hg_algo) { regmap_update_bits(priv->regmap, CS35L33_HG_MEMLDO_CTL, @@ -747,20 +747,20 @@ static int cs35l33_set_hg_data(struct snd_soc_codec *codec, return 0; } -static int cs35l33_set_bst_ipk(struct snd_soc_codec *codec, unsigned int bst) +static int cs35l33_set_bst_ipk(struct snd_soc_component *component, unsigned int bst) { - struct cs35l33_private *cs35l33 = snd_soc_codec_get_drvdata(codec); + struct cs35l33_private *cs35l33 = snd_soc_component_get_drvdata(component); int ret = 0, steps = 0; /* Boost current in uA */ if (bst > 3600000 || bst < 1850000) { - dev_err(codec->dev, "Invalid boost current %d\n", bst); + dev_err(component->dev, "Invalid boost current %d\n", bst); ret = -EINVAL; goto err; } if (bst % 15625) { - dev_err(codec->dev, "Current not a multiple of 15625uA (%d)\n", + dev_err(component->dev, "Current not a multiple of 15625uA (%d)\n", bst); ret = -EINVAL; goto err; @@ -778,12 +778,12 @@ err: return ret; } -static int cs35l33_probe(struct snd_soc_codec *codec) +static int cs35l33_probe(struct snd_soc_component *component) { - struct cs35l33_private *cs35l33 = snd_soc_codec_get_drvdata(codec); + struct cs35l33_private *cs35l33 = snd_soc_component_get_drvdata(component); - cs35l33->codec = codec; - pm_runtime_get_sync(codec->dev); + cs35l33->component = component; + pm_runtime_get_sync(component->dev); regmap_update_bits(cs35l33->regmap, CS35L33_PROTECT_CTL, CS35L33_ALIVE_WD_DIS, 0x8); @@ -799,24 +799,24 @@ static int cs35l33_probe(struct snd_soc_codec *codec) cs35l33->pdata.amp_drv_sel << CS35L33_AMP_DRV_SEL_SHIFT); if (cs35l33->pdata.boost_ipk) - cs35l33_set_bst_ipk(codec, cs35l33->pdata.boost_ipk); + cs35l33_set_bst_ipk(component, cs35l33->pdata.boost_ipk); if (cs35l33->enable_soft_ramp) { - snd_soc_update_bits(codec, CS35L33_DAC_CTL, + snd_soc_component_update_bits(component, CS35L33_DAC_CTL, CS35L33_DIGSFT, CS35L33_DIGSFT); - snd_soc_update_bits(codec, CS35L33_DAC_CTL, + snd_soc_component_update_bits(component, CS35L33_DAC_CTL, CS35L33_DSR_RATE, cs35l33->pdata.ramp_rate); } else { - snd_soc_update_bits(codec, CS35L33_DAC_CTL, + snd_soc_component_update_bits(component, CS35L33_DAC_CTL, CS35L33_DIGSFT, 0); } /* update IMON scaling rate if different from default of 0x8 */ if (cs35l33->pdata.imon_adc_scale != 0x8) - snd_soc_update_bits(codec, CS35L33_ADC_CTL, + snd_soc_component_update_bits(component, CS35L33_ADC_CTL, CS35L33_IMON_SCALE, cs35l33->pdata.imon_adc_scale); - cs35l33_set_hg_data(codec, &(cs35l33->pdata)); + cs35l33_set_hg_data(component, &(cs35l33->pdata)); /* * unmask important interrupts that causes the chip to enter @@ -826,26 +826,24 @@ static int cs35l33_probe(struct snd_soc_codec *codec) CS35L33_M_OTE | CS35L33_M_OTW | CS35L33_M_AMP_SHORT | CS35L33_M_CAL_ERR, 0); - pm_runtime_put_sync(codec->dev); + pm_runtime_put_sync(component->dev); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_cs35l33 = { - .probe = cs35l33_probe, - - .set_bias_level = cs35l33_set_bias_level, - .set_sysclk = cs35l33_codec_set_sysclk, - - .component_driver = { - .controls = cs35l33_snd_controls, - .num_controls = ARRAY_SIZE(cs35l33_snd_controls), - .dapm_widgets = cs35l33_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs35l33_dapm_widgets), - .dapm_routes = cs35l33_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs35l33_audio_map), - }, - .idle_bias_off = true, +static const struct snd_soc_component_driver soc_component_dev_cs35l33 = { + .probe = cs35l33_probe, + .set_bias_level = cs35l33_set_bias_level, + .set_sysclk = cs35l33_component_set_sysclk, + .controls = cs35l33_snd_controls, + .num_controls = ARRAY_SIZE(cs35l33_snd_controls), + .dapm_widgets = cs35l33_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs35l33_dapm_widgets), + .dapm_routes = cs35l33_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs35l33_audio_map), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs35l33_regmap = { @@ -967,7 +965,7 @@ static int cs35l33_get_hg_data(const struct device_node *np, static irqreturn_t cs35l33_irq_thread(int irq, void *data) { struct cs35l33_private *cs35l33 = data; - struct snd_soc_codec *codec = cs35l33->codec; + struct snd_soc_component *component = cs35l33->component; unsigned int sticky_val1, sticky_val2, current_val, mask1, mask2; regmap_read(cs35l33->regmap, CS35L33_INT_STATUS_2, @@ -989,9 +987,9 @@ static irqreturn_t cs35l33_irq_thread(int irq, void *data) /* handle the interrupts */ if (sticky_val1 & CS35L33_AMP_SHORT) { - dev_crit(codec->dev, "Amp short error\n"); + dev_crit(component->dev, "Amp short error\n"); if (!(current_val & CS35L33_AMP_SHORT)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Amp short error release\n"); regmap_update_bits(cs35l33->regmap, CS35L33_AMP_CTL, @@ -1007,13 +1005,13 @@ static irqreturn_t cs35l33_irq_thread(int irq, void *data) } if (sticky_val1 & CS35L33_CAL_ERR) { - dev_err(codec->dev, "Cal error\n"); + dev_err(component->dev, "Cal error\n"); /* redo the calibration in next power up */ cs35l33->amp_cal = false; if (!(current_val & CS35L33_CAL_ERR)) { - dev_dbg(codec->dev, "Cal error release\n"); + dev_dbg(component->dev, "Cal error release\n"); regmap_update_bits(cs35l33->regmap, CS35L33_AMP_CTL, CS35L33_CAL_ERR_RLS, 0); @@ -1027,9 +1025,9 @@ static irqreturn_t cs35l33_irq_thread(int irq, void *data) } if (sticky_val1 & CS35L33_OTE) { - dev_crit(codec->dev, "Over temperature error\n"); + dev_crit(component->dev, "Over temperature error\n"); if (!(current_val & CS35L33_OTE)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Over temperature error release\n"); regmap_update_bits(cs35l33->regmap, CS35L33_AMP_CTL, CS35L33_OTE_RLS, 0); @@ -1042,9 +1040,9 @@ static irqreturn_t cs35l33_irq_thread(int irq, void *data) } if (sticky_val1 & CS35L33_OTW) { - dev_err(codec->dev, "Over temperature warning\n"); + dev_err(component->dev, "Over temperature warning\n"); if (!(current_val & CS35L33_OTW)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Over temperature warning release\n"); regmap_update_bits(cs35l33->regmap, CS35L33_AMP_CTL, CS35L33_OTW_RLS, 0); @@ -1056,21 +1054,21 @@ static irqreturn_t cs35l33_irq_thread(int irq, void *data) } } if (CS35L33_ALIVE_ERR & sticky_val1) - dev_err(codec->dev, "ERROR: ADSPCLK Interrupt\n"); + dev_err(component->dev, "ERROR: ADSPCLK Interrupt\n"); if (CS35L33_MCLK_ERR & sticky_val1) - dev_err(codec->dev, "ERROR: MCLK Interrupt\n"); + dev_err(component->dev, "ERROR: MCLK Interrupt\n"); if (CS35L33_VMON_OVFL & sticky_val2) - dev_err(codec->dev, + dev_err(component->dev, "ERROR: VMON Overflow Interrupt\n"); if (CS35L33_IMON_OVFL & sticky_val2) - dev_err(codec->dev, + dev_err(component->dev, "ERROR: IMON Overflow Interrupt\n"); if (CS35L33_VPMON_OVFL & sticky_val2) - dev_err(codec->dev, + dev_err(component->dev, "ERROR: VPMON Overflow Interrupt\n"); return IRQ_HANDLED; @@ -1236,10 +1234,10 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client, pm_runtime_set_active(&i2c_client->dev); pm_runtime_enable(&i2c_client->dev); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs35l33, &cs35l33_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs35l33, &cs35l33_dai, 1); if (ret < 0) { - dev_err(&i2c_client->dev, "%s: Register codec failed\n", + dev_err(&i2c_client->dev, "%s: Register component failed\n", __func__); goto err_enable; } @@ -1257,8 +1255,6 @@ static int cs35l33_i2c_remove(struct i2c_client *client) { struct cs35l33_private *cs35l33 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); - gpiod_set_value_cansleep(cs35l33->reset_gpio, 0); pm_runtime_disable(&client->dev); diff --git a/sound/soc/codecs/cs35l34.c b/sound/soc/codecs/cs35l34.c index 0600d5264c4c..5063c05afa27 100644 --- a/sound/soc/codecs/cs35l34.c +++ b/sound/soc/codecs/cs35l34.c @@ -43,7 +43,7 @@ #define CS35L34_START_DELAY 50 struct cs35l34_private { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct cs35l34_platform_data pdata; struct regmap *regmap; struct regulator_bulk_data core_supplies[2]; @@ -237,8 +237,8 @@ static bool cs35l34_precious_register(struct device *dev, unsigned int reg) static int cs35l34_sdin_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); int ret; switch (event) { @@ -250,7 +250,7 @@ static int cs35l34_sdin_event(struct snd_soc_dapm_widget *w, ret = regmap_update_bits(priv->regmap, CS35L34_PWRCTL1, CS35L34_PDN_ALL, 0); if (ret < 0) { - dev_err(codec->dev, "Cannot set Power bits %d\n", ret); + dev_err(component->dev, "Cannot set Power bits %d\n", ret); return ret; } usleep_range(5000, 5100); @@ -272,8 +272,8 @@ static int cs35l34_sdin_event(struct snd_soc_dapm_widget *w, static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); unsigned int reg, bit_pos; int slot, slot_num; @@ -284,7 +284,7 @@ static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, /* scan rx_mask for aud slot */ slot = ffs(rx_mask) - 1; if (slot >= 0) - snd_soc_update_bits(codec, CS35L34_TDM_RX_CTL_1_AUDIN, + snd_soc_component_update_bits(component, CS35L34_TDM_RX_CTL_1_AUDIN, CS35L34_X_LOC, slot); /* scan tx_mask: vmon(2 slots); imon (2 slots); vpmon (1 slot) @@ -294,10 +294,10 @@ static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, slot_num = 0; /* disable vpmon/vbstmon: enable later if set in tx_mask */ - snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_3_VPMON, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_3_VPMON, CS35L34_X_STATE | CS35L34_X_LOC, CS35L34_X_STATE | CS35L34_X_LOC); - snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_4_VBSTMON, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_4_VBSTMON, CS35L34_X_STATE | CS35L34_X_LOC, CS35L34_X_STATE | CS35L34_X_LOC); @@ -305,22 +305,22 @@ static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, while (slot >= 0) { /* configure VMON_TX_LOC */ if (slot_num == 0) - snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_1_VMON, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_1_VMON, CS35L34_X_STATE | CS35L34_X_LOC, slot); /* configure IMON_TX_LOC */ if (slot_num == 4) { - snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_2_IMON, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_2_IMON, CS35L34_X_STATE | CS35L34_X_LOC, slot); } /* configure VPMON_TX_LOC */ if (slot_num == 3) { - snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_3_VPMON, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_3_VPMON, CS35L34_X_STATE | CS35L34_X_LOC, slot); } /* configure VBSTMON_TX_LOC */ if (slot_num == 7) { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS35L34_TDM_TX_CTL_4_VBSTMON, CS35L34_X_STATE | CS35L34_X_LOC, slot); } @@ -328,7 +328,7 @@ static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, /* Enable the relevant tx slot */ reg = CS35L34_TDM_TX_SLOT_EN_4 - (slot/8); bit_pos = slot - ((slot / 8) * (8)); - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, 1 << bit_pos, 1 << bit_pos); tx_mask &= ~(1 << slot); @@ -342,8 +342,8 @@ static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int cs35l34_main_amp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -382,8 +382,8 @@ static const struct snd_kcontrol_new cs35l34_snd_controls[] = { static int cs35l34_mclk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); int ret, i; unsigned int reg; @@ -524,8 +524,8 @@ static int cs35l34_get_mclk_coeff(int mclk, int srate) static int cs35l34_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -546,15 +546,15 @@ static int cs35l34_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l34_private *priv = snd_soc_component_get_drvdata(component); int srate = params_rate(params); int ret; int coeff = cs35l34_get_mclk_coeff(priv->mclk_int, srate); if (coeff < 0) { - dev_err(codec->dev, "ERROR: Invalid mclk %d and/or srate %d\n", + dev_err(component->dev, "ERROR: Invalid mclk %d and/or srate %d\n", priv->mclk_int, srate); return coeff; } @@ -562,7 +562,7 @@ static int cs35l34_pcm_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL, CS35L34_ADSP_RATE, cs35l34_mclk_coeffs[coeff].adsp_rate); if (ret != 0) - dev_err(codec->dev, "Failed to set clock state %d\n", ret); + dev_err(component->dev, "Failed to set clock state %d\n", ret); return ret; } @@ -590,13 +590,13 @@ static int cs35l34_pcm_startup(struct snd_pcm_substream *substream, static int cs35l34_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (tristate) - snd_soc_update_bits(codec, CS35L34_PWRCTL3, + snd_soc_component_update_bits(component, CS35L34_PWRCTL3, CS35L34_PDN_SDOUT, CS35L34_PDN_SDOUT); else - snd_soc_update_bits(codec, CS35L34_PWRCTL3, + snd_soc_component_update_bits(component, CS35L34_PWRCTL3, CS35L34_PDN_SDOUT, 0); return 0; } @@ -604,8 +604,8 @@ static int cs35l34_set_tristate(struct snd_soc_dai *dai, int tristate) static int cs35l34_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l34_private *cs35l34 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l34_private *cs35l34 = snd_soc_component_get_drvdata(component); unsigned int value; switch (freq) { @@ -634,7 +634,7 @@ static int cs35l34_dai_set_sysclk(struct snd_soc_dai *dai, cs35l34->mclk_int = freq / 2; break; default: - dev_err(codec->dev, "ERROR: Invalid Frequency %d\n", freq); + dev_err(component->dev, "ERROR: Invalid Frequency %d\n", freq); cs35l34->mclk_int = 0; return -EINVAL; } @@ -676,7 +676,7 @@ static struct snd_soc_dai_driver cs35l34_dai = { static int cs35l34_boost_inductor(struct cs35l34_private *cs35l34, unsigned int inductor) { - struct snd_soc_codec *codec = cs35l34->codec; + struct snd_soc_component *component = cs35l34->component; switch (inductor) { case 1000: /* 1 uH */ @@ -708,19 +708,19 @@ static int cs35l34_boost_inductor(struct cs35l34_private *cs35l34, regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 3); break; default: - dev_err(codec->dev, "%s Invalid Inductor Value %d uH\n", + dev_err(component->dev, "%s Invalid Inductor Value %d uH\n", __func__, inductor); return -EINVAL; } return 0; } -static int cs35l34_probe(struct snd_soc_codec *codec) +static int cs35l34_probe(struct snd_soc_component *component) { int ret = 0; - struct cs35l34_private *cs35l34 = snd_soc_codec_get_drvdata(codec); + struct cs35l34_private *cs35l34 = snd_soc_component_get_drvdata(component); - pm_runtime_get_sync(codec->dev); + pm_runtime_get_sync(component->dev); /* Set over temperature warning attenuation to 6 dB */ regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL, @@ -773,23 +773,24 @@ static int cs35l34_probe(struct snd_soc_codec *codec) regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_TDM_CTL, 1, 1); - pm_runtime_put_sync(codec->dev); + pm_runtime_put_sync(component->dev); return ret; } -static const struct snd_soc_codec_driver soc_codec_dev_cs35l34 = { - .probe = cs35l34_probe, - - .component_driver = { - .dapm_widgets = cs35l34_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs35l34_dapm_widgets), - .dapm_routes = cs35l34_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs35l34_audio_map), - .controls = cs35l34_snd_controls, - .num_controls = ARRAY_SIZE(cs35l34_snd_controls), - }, +static const struct snd_soc_component_driver soc_component_dev_cs35l34 = { + .probe = cs35l34_probe, + .dapm_widgets = cs35l34_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs35l34_dapm_widgets), + .dapm_routes = cs35l34_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs35l34_audio_map), + .controls = cs35l34_snd_controls, + .num_controls = ARRAY_SIZE(cs35l34_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct regmap_config cs35l34_regmap = { @@ -864,7 +865,7 @@ static int cs35l34_handle_of_data(struct i2c_client *i2c_client, static irqreturn_t cs35l34_irq_thread(int irq, void *data) { struct cs35l34_private *cs35l34 = data; - struct snd_soc_codec *codec = cs35l34->codec; + struct snd_soc_component *component = cs35l34->component; unsigned int sticky1, sticky2, sticky3, sticky4; unsigned int mask1, mask2, mask3, mask4, current1; @@ -887,11 +888,11 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_1, ¤t1); if (sticky1 & CS35L34_CAL_ERR) { - dev_err(codec->dev, "Cal error\n"); + dev_err(component->dev, "Cal error\n"); /* error is no longer asserted; safe to reset */ if (!(current1 & CS35L34_CAL_ERR)) { - dev_dbg(codec->dev, "Cal error release\n"); + dev_dbg(component->dev, "Cal error release\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PROT_RELEASE_CTL, CS35L34_CAL_ERR_RLS, 0); @@ -907,14 +908,14 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) } if (sticky1 & CS35L34_ALIVE_ERR) - dev_err(codec->dev, "Alive error\n"); + dev_err(component->dev, "Alive error\n"); if (sticky1 & CS35L34_AMP_SHORT) { - dev_crit(codec->dev, "Amp short error\n"); + dev_crit(component->dev, "Amp short error\n"); /* error is no longer asserted; safe to reset */ if (!(current1 & CS35L34_AMP_SHORT)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Amp short error release\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PROT_RELEASE_CTL, @@ -930,11 +931,11 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) } if (sticky1 & CS35L34_OTW) { - dev_crit(codec->dev, "Over temperature warning\n"); + dev_crit(component->dev, "Over temperature warning\n"); /* error is no longer asserted; safe to reset */ if (!(current1 & CS35L34_OTW)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Over temperature warning release\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PROT_RELEASE_CTL, @@ -950,11 +951,11 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) } if (sticky1 & CS35L34_OTE) { - dev_crit(codec->dev, "Over temperature error\n"); + dev_crit(component->dev, "Over temperature error\n"); /* error is no longer asserted; safe to reset */ if (!(current1 & CS35L34_OTE)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Over temperature error release\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PROT_RELEASE_CTL, @@ -970,7 +971,7 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) } if (sticky3 & CS35L34_BST_HIGH) { - dev_crit(codec->dev, "VBST too high error; powering off!\n"); + dev_crit(component->dev, "VBST too high error; powering off!\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2, CS35L34_PDN_AMP, CS35L34_PDN_AMP); regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1, @@ -978,7 +979,7 @@ static irqreturn_t cs35l34_irq_thread(int irq, void *data) } if (sticky3 & CS35L34_LBST_SHORT) { - dev_crit(codec->dev, "LBST short error; powering off!\n"); + dev_crit(component->dev, "LBST short error; powering off!\n"); regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2, CS35L34_PDN_AMP, CS35L34_PDN_AMP); regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1, @@ -1108,11 +1109,11 @@ static int cs35l34_i2c_probe(struct i2c_client *i2c_client, pm_runtime_set_active(&i2c_client->dev); pm_runtime_enable(&i2c_client->dev); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs35l34, &cs35l34_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs35l34, &cs35l34_dai, 1); if (ret < 0) { dev_err(&i2c_client->dev, - "%s: Register codec failed\n", __func__); + "%s: Register component failed\n", __func__); goto err_regulator; } @@ -1129,8 +1130,6 @@ static int cs35l34_i2c_remove(struct i2c_client *client) { struct cs35l34_private *cs35l34 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); - gpiod_set_value_cansleep(cs35l34->reset_gpio, 0); pm_runtime_disable(&client->dev); diff --git a/sound/soc/codecs/cs35l35.c b/sound/soc/codecs/cs35l35.c index 129978d1243e..a4a2cb171bdf 100644 --- a/sound/soc/codecs/cs35l35.c +++ b/sound/soc/codecs/cs35l35.c @@ -194,8 +194,8 @@ static int cs35l35_wait_for_pdn(struct cs35l35_private *cs35l35) static int cs35l35_sdin_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); int ret = 0; switch (event) { @@ -231,7 +231,7 @@ static int cs35l35_sdin_event(struct snd_soc_dapm_widget *w, 1 << CS35L35_AMP_DIGSFT_SHIFT); break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); ret = -EINVAL; } return ret; @@ -240,8 +240,8 @@ static int cs35l35_sdin_event(struct snd_soc_dapm_widget *w, static int cs35l35_main_amp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); unsigned int reg[4]; int i; @@ -301,7 +301,7 @@ static int cs35l35_main_amp_event(struct snd_soc_dapm_widget *w, break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); } return 0; } @@ -369,8 +369,8 @@ static const struct snd_soc_dapm_route cs35l35_audio_map[] = { static int cs35l35_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -470,8 +470,8 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); struct classh_cfg *classh = &cs35l35->pdata.classh_algo; int srate = params_rate(params); int ret = 0; @@ -482,7 +482,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, int clk_ctl = cs35l35_get_clk_config(cs35l35->sysclk, srate); if (clk_ctl < 0) { - dev_err(codec->dev, "Invalid CLK:Rate %d:%d\n", + dev_err(component->dev, "Invalid CLK:Rate %d:%d\n", cs35l35->sysclk, srate); return -EINVAL; } @@ -490,7 +490,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL2, CS35L35_CLK_CTL2_MASK, clk_ctl); if (ret != 0) { - dev_err(codec->dev, "Failed to set port config %d\n", ret); + dev_err(component->dev, "Failed to set port config %d\n", ret); return ret; } @@ -509,7 +509,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, CS35L35_CH_WKFET_DEL_MASK, 0 << CS35L35_CH_WKFET_DEL_SHIFT); if (ret != 0) { - dev_err(codec->dev, "Failed to set fet config %d\n", + dev_err(component->dev, "Failed to set fet config %d\n", ret); return ret; } @@ -531,7 +531,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, audin_format = CS35L35_SDIN_DEPTH_24; break; default: - dev_err(codec->dev, "Unsupported Width %d\n", + dev_err(component->dev, "Unsupported Width %d\n", params_width(params)); return -EINVAL; } @@ -554,7 +554,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, * to configure the CLOCK_CTL3 register correctly */ if ((cs35l35->sclk / srate) % 4) { - dev_err(codec->dev, "Unsupported sclk/fs ratio %d:%d\n", + dev_err(component->dev, "Unsupported sclk/fs ratio %d:%d\n", cs35l35->sclk, srate); return -EINVAL; } @@ -568,7 +568,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, case CS35L35_SP_SCLKS_64FS: break; default: - dev_err(codec->dev, "ratio not supported\n"); + dev_err(component->dev, "ratio not supported\n"); return -EINVAL; } } else { @@ -578,7 +578,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, case CS35L35_SP_SCLKS_64FS: break; default: - dev_err(codec->dev, "ratio not supported\n"); + dev_err(component->dev, "ratio not supported\n"); return -EINVAL; } } @@ -587,7 +587,7 @@ static int cs35l35_hw_params(struct snd_pcm_substream *substream, CS35L35_SP_SCLKS_MASK, sp_sclks << CS35L35_SP_SCLKS_SHIFT); if (ret != 0) { - dev_err(codec->dev, "Failed to set fsclk %d\n", ret); + dev_err(component->dev, "Failed to set fsclk %d\n", ret); return ret; } } @@ -607,8 +607,8 @@ static const struct snd_pcm_hw_constraint_list cs35l35_constraints = { static int cs35l35_pcm_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); if (!substream->runtime) return 0; @@ -635,8 +635,8 @@ static const struct snd_pcm_hw_constraint_list cs35l35_pdm_constraints = { static int cs35l35_pdm_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); if (!substream->runtime) return 0; @@ -655,8 +655,8 @@ static int cs35l35_pdm_startup(struct snd_pcm_substream *substream, static int cs35l35_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); /* Need the SCLK Frequency regardless of sysclk source for I2S */ cs35l35->sclk = freq; @@ -712,11 +712,11 @@ static struct snd_soc_dai_driver cs35l35_dai[] = { }, }; -static int cs35l35_codec_set_sysclk(struct snd_soc_codec *codec, +static int cs35l35_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); int clksrc; int ret = 0; @@ -731,7 +731,7 @@ static int cs35l35_codec_set_sysclk(struct snd_soc_codec *codec, clksrc = CS35L35_CLK_SOURCE_PDM; break; default: - dev_err(codec->dev, "Invalid CLK Source\n"); + dev_err(component->dev, "Invalid CLK Source\n"); return -EINVAL; } @@ -749,7 +749,7 @@ static int cs35l35_codec_set_sysclk(struct snd_soc_codec *codec, cs35l35->sysclk = freq; break; default: - dev_err(codec->dev, "Invalid CLK Frequency Input : %d\n", freq); + dev_err(component->dev, "Invalid CLK Frequency Input : %d\n", freq); return -EINVAL; } @@ -757,7 +757,7 @@ static int cs35l35_codec_set_sysclk(struct snd_soc_codec *codec, CS35L35_CLK_SOURCE_MASK, clksrc << CS35L35_CLK_SOURCE_SHIFT); if (ret != 0) { - dev_err(codec->dev, "Failed to set sysclk %d\n", ret); + dev_err(component->dev, "Failed to set sysclk %d\n", ret); return ret; } @@ -834,9 +834,9 @@ static int cs35l35_boost_inductor(struct cs35l35_private *cs35l35, return 0; } -static int cs35l35_codec_probe(struct snd_soc_codec *codec) +static int cs35l35_component_probe(struct snd_soc_component *component) { - struct cs35l35_private *cs35l35 = snd_soc_codec_get_drvdata(codec); + struct cs35l35_private *cs35l35 = snd_soc_component_get_drvdata(component); struct classh_cfg *classh = &cs35l35->pdata.classh_algo; struct monitor_cfg *monitor_config = &cs35l35->pdata.mon_cfg; int ret; @@ -880,7 +880,7 @@ static int cs35l35_codec_probe(struct snd_soc_codec *codec) regmap_update_bits(cs35l35->regmap, CS35L35_CLASS_H_CTL, CS35L35_CH_STEREO_MASK, 1 << CS35L35_CH_STEREO_SHIFT); - ret = snd_soc_add_codec_controls(codec, cs35l35_adv_controls, + ret = snd_soc_add_component_controls(component, cs35l35_adv_controls, ARRAY_SIZE(cs35l35_adv_controls)); if (ret) return ret; @@ -1079,20 +1079,19 @@ static int cs35l35_codec_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_cs35l35 = { - .probe = cs35l35_codec_probe, - .set_sysclk = cs35l35_codec_set_sysclk, - .component_driver = { - .dapm_widgets = cs35l35_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs35l35_dapm_widgets), - - .dapm_routes = cs35l35_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs35l35_audio_map), - - .controls = cs35l35_aud_controls, - .num_controls = ARRAY_SIZE(cs35l35_aud_controls), - }, - +static const struct snd_soc_component_driver soc_component_dev_cs35l35 = { + .probe = cs35l35_component_probe, + .set_sysclk = cs35l35_component_set_sysclk, + .dapm_widgets = cs35l35_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs35l35_dapm_widgets), + .dapm_routes = cs35l35_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs35l35_audio_map), + .controls = cs35l35_aud_controls, + .num_controls = ARRAY_SIZE(cs35l35_aud_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct regmap_config cs35l35_regmap = { @@ -1617,10 +1616,10 @@ static int cs35l35_i2c_probe(struct i2c_client *i2c_client, regmap_update_bits(cs35l35->regmap, CS35L35_PROTECT_CTL, CS35L35_AMP_MUTE_MASK, 1 << CS35L35_AMP_MUTE_SHIFT); - ret = snd_soc_register_codec(dev, &soc_codec_dev_cs35l35, cs35l35_dai, - ARRAY_SIZE(cs35l35_dai)); + ret = devm_snd_soc_register_component(dev, &soc_component_dev_cs35l35, + cs35l35_dai, ARRAY_SIZE(cs35l35_dai)); if (ret < 0) { - dev_err(dev, "Failed to register codec: %d\n", ret); + dev_err(dev, "Failed to register component: %d\n", ret); goto err; } @@ -1634,12 +1633,6 @@ err: return ret; } -static int cs35l35_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct of_device_id cs35l35_of_match[] = { {.compatible = "cirrus,cs35l35"}, {}, @@ -1660,7 +1653,6 @@ static struct i2c_driver cs35l35_i2c_driver = { }, .id_table = cs35l35_id, .probe = cs35l35_i2c_probe, - .remove = cs35l35_i2c_remove, }; module_i2c_driver(cs35l35_i2c_driver); diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c index fd966bb851cb..275677de669f 100644 --- a/sound/soc/codecs/cs4265.c +++ b/sound/soc/codecs/cs4265.c @@ -322,12 +322,12 @@ static int cs4265_get_clk_index(int mclk, int rate) static int cs4265_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4265_private *cs4265 = snd_soc_component_get_drvdata(component); int i; if (clk_id != 0) { - dev_err(codec->dev, "Invalid clk_id %d\n", clk_id); + dev_err(component->dev, "Invalid clk_id %d\n", clk_id); return -EINVAL; } for (i = 0; i < ARRAY_SIZE(clk_map_table); i++) { @@ -337,24 +337,24 @@ static int cs4265_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, } } cs4265->sysclk = 0; - dev_err(codec->dev, "Invalid freq parameter %d\n", freq); + dev_err(component->dev, "Invalid freq parameter %d\n", freq); return -EINVAL; } static int cs4265_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4265_private *cs4265 = snd_soc_component_get_drvdata(component); u8 iface = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - snd_soc_update_bits(codec, CS4265_ADC_CTL, + snd_soc_component_update_bits(component, CS4265_ADC_CTL, CS4265_ADC_MASTER, CS4265_ADC_MASTER); break; case SND_SOC_DAIFMT_CBS_CFS: - snd_soc_update_bits(codec, CS4265_ADC_CTL, + snd_soc_component_update_bits(component, CS4265_ADC_CTL, CS4265_ADC_MASTER, 0); break; @@ -383,20 +383,20 @@ static int cs4265_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int cs4265_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) { - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_MUTE, CS4265_DAC_CTL_MUTE); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_MUTE, CS4265_SPDIF_CTL2_MUTE); } else { - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_MUTE, 0); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_MUTE, 0); } @@ -407,8 +407,8 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4265_private *cs4265 = snd_soc_component_get_drvdata(component); int index; if (substream->stream == SNDRV_PCM_STREAM_CAPTURE && @@ -418,45 +418,45 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream, index = cs4265_get_clk_index(cs4265->sysclk, params_rate(params)); if (index >= 0) { - snd_soc_update_bits(codec, CS4265_ADC_CTL, + snd_soc_component_update_bits(component, CS4265_ADC_CTL, CS4265_ADC_FM, clk_map_table[index].fm_mode << 6); - snd_soc_update_bits(codec, CS4265_MCLK_FREQ, + snd_soc_component_update_bits(component, CS4265_MCLK_FREQ, CS4265_MCLK_FREQ_MASK, clk_map_table[index].mclkdiv << 4); } else { - dev_err(codec->dev, "can't get correct mclk\n"); + dev_err(component->dev, "can't get correct mclk\n"); return -EINVAL; } switch (cs4265->format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_DIF, (1 << 4)); - snd_soc_update_bits(codec, CS4265_ADC_CTL, + snd_soc_component_update_bits(component, CS4265_ADC_CTL, CS4265_ADC_DIF, (1 << 4)); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_DIF, (1 << 6)); break; case SND_SOC_DAIFMT_RIGHT_J: if (params_width(params) == 16) { - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_DIF, (2 << 4)); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_DIF, (2 << 6)); } else { - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_DIF, (3 << 4)); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_DIF, (3 << 6)); } break; case SND_SOC_DAIFMT_LEFT_J: - snd_soc_update_bits(codec, CS4265_DAC_CTL, + snd_soc_component_update_bits(component, CS4265_DAC_CTL, CS4265_DAC_CTL_DIF, 0); - snd_soc_update_bits(codec, CS4265_ADC_CTL, + snd_soc_component_update_bits(component, CS4265_ADC_CTL, CS4265_ADC_DIF, 0); - snd_soc_update_bits(codec, CS4265_SPDIF_CTL2, + snd_soc_component_update_bits(component, CS4265_SPDIF_CTL2, CS4265_SPDIF_CTL2_DIF, 0); break; @@ -466,23 +466,23 @@ static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream, return 0; } -static int cs4265_set_bias_level(struct snd_soc_codec *codec, +static int cs4265_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, CS4265_PWRCTL, + snd_soc_component_update_bits(component, CS4265_PWRCTL, CS4265_PWRCTL_PDN, 0); break; case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, CS4265_PWRCTL, + snd_soc_component_update_bits(component, CS4265_PWRCTL, CS4265_PWRCTL_PDN, CS4265_PWRCTL_PDN); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, CS4265_PWRCTL, + snd_soc_component_update_bits(component, CS4265_PWRCTL, CS4265_PWRCTL_PDN, CS4265_PWRCTL_PDN); break; @@ -544,17 +544,18 @@ static struct snd_soc_dai_driver cs4265_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_cs4265 = { - .set_bias_level = cs4265_set_bias_level, - - .component_driver = { - .controls = cs4265_snd_controls, - .num_controls = ARRAY_SIZE(cs4265_snd_controls), - .dapm_widgets = cs4265_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs4265_dapm_widgets), - .dapm_routes = cs4265_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs4265_audio_map), - }, +static const struct snd_soc_component_driver soc_component_cs4265 = { + .set_bias_level = cs4265_set_bias_level, + .controls = cs4265_snd_controls, + .num_controls = ARRAY_SIZE(cs4265_snd_controls), + .dapm_widgets = cs4265_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs4265_dapm_widgets), + .dapm_routes = cs4265_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs4265_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs4265_regmap = { @@ -616,18 +617,12 @@ static int cs4265_i2c_probe(struct i2c_client *i2c_client, regmap_write(cs4265->regmap, CS4265_PWRCTL, 0x0F); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_cs4265, cs4265_dai, + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_cs4265, cs4265_dai, ARRAY_SIZE(cs4265_dai)); return ret; } -static int cs4265_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct of_device_id cs4265_of_match[] = { { .compatible = "cirrus,cs4265", }, { } @@ -647,7 +642,6 @@ static struct i2c_driver cs4265_i2c_driver = { }, .id_table = cs4265_id, .probe = cs4265_i2c_probe, - .remove = cs4265_i2c_remove, }; module_i2c_driver(cs4265_i2c_driver); diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index 84f86745c30e..2a7a4168c072 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c @@ -254,8 +254,8 @@ static bool cs4270_reg_is_volatile(struct device *dev, unsigned int reg) static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); cs4270->mclk = freq; return 0; @@ -277,8 +277,8 @@ static int cs4270_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); /* set DAI format */ switch (format & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -287,7 +287,7 @@ static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai, cs4270->mode = format & SND_SOC_DAIFMT_FORMAT_MASK; break; default: - dev_err(codec->dev, "invalid dai format\n"); + dev_err(component->dev, "invalid dai format\n"); return -EINVAL; } @@ -301,7 +301,7 @@ static int cs4270_set_dai_fmt(struct snd_soc_dai *codec_dai, break; default: /* all other modes are unsupported by the hardware */ - dev_err(codec->dev, "Unknown master/slave configuration\n"); + dev_err(component->dev, "Unknown master/slave configuration\n"); return -EINVAL; } @@ -326,8 +326,8 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int ret; unsigned int i; unsigned int rate; @@ -346,13 +346,13 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, if (i == NUM_MCLK_RATIOS) { /* We did not find a matching ratio */ - dev_err(codec->dev, "could not find matching ratio\n"); + dev_err(component->dev, "could not find matching ratio\n"); return -EINVAL; } /* Set the sample rate */ - reg = snd_soc_read(codec, CS4270_MODE); + reg = snd_soc_component_read32(component, CS4270_MODE); reg &= ~(CS4270_MODE_SPEED_MASK | CS4270_MODE_DIV_MASK); reg |= cs4270_mode_ratios[i].mclk; @@ -361,15 +361,15 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, else reg |= cs4270_mode_ratios[i].speed_mode; - ret = snd_soc_write(codec, CS4270_MODE, reg); + ret = snd_soc_component_write(component, CS4270_MODE, reg); if (ret < 0) { - dev_err(codec->dev, "i2c write failed\n"); + dev_err(component->dev, "i2c write failed\n"); return ret; } /* Set the DAI format */ - reg = snd_soc_read(codec, CS4270_FORMAT); + reg = snd_soc_component_read32(component, CS4270_FORMAT); reg &= ~(CS4270_FORMAT_DAC_MASK | CS4270_FORMAT_ADC_MASK); switch (cs4270->mode) { @@ -380,13 +380,13 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, reg |= CS4270_FORMAT_DAC_LJ | CS4270_FORMAT_ADC_LJ; break; default: - dev_err(codec->dev, "unknown dai format\n"); + dev_err(component->dev, "unknown dai format\n"); return -EINVAL; } - ret = snd_soc_write(codec, CS4270_FORMAT, reg); + ret = snd_soc_component_write(component, CS4270_FORMAT, reg); if (ret < 0) { - dev_err(codec->dev, "i2c write failed\n"); + dev_err(component->dev, "i2c write failed\n"); return ret; } @@ -405,11 +405,11 @@ static int cs4270_hw_params(struct snd_pcm_substream *substream, */ static int cs4270_dai_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int reg6; - reg6 = snd_soc_read(codec, CS4270_MUTE); + reg6 = snd_soc_component_read32(component, CS4270_MUTE); if (mute) reg6 |= CS4270_MUTE_DAC_A | CS4270_MUTE_DAC_B; @@ -418,7 +418,7 @@ static int cs4270_dai_mute(struct snd_soc_dai *dai, int mute) reg6 |= cs4270->manual_mute; } - return snd_soc_write(codec, CS4270_MUTE, reg6); + return snd_soc_component_write(component, CS4270_MUTE, reg6); } /** @@ -438,8 +438,8 @@ static int cs4270_dai_mute(struct snd_soc_dai *dai, int mute) static int cs4270_soc_put_mute(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int left = !ucontrol->value.integer.value[0]; int right = !ucontrol->value.integer.value[1]; @@ -501,9 +501,9 @@ static struct snd_soc_dai_driver cs4270_dai = { * This function is called when ASoC has all the pieces it needs to * instantiate a sound driver. */ -static int cs4270_probe(struct snd_soc_codec *codec) +static int cs4270_probe(struct snd_soc_component *component) { - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int ret; /* Disable auto-mute. This feature appears to be buggy. In some @@ -511,9 +511,9 @@ static int cs4270_probe(struct snd_soc_codec *codec) * this feature disabled by default. An application (e.g. alsactl) can * re-enabled it by using the controls. */ - ret = snd_soc_update_bits(codec, CS4270_MUTE, CS4270_MUTE_AUTO, 0); + ret = snd_soc_component_update_bits(component, CS4270_MUTE, CS4270_MUTE_AUTO, 0); if (ret < 0) { - dev_err(codec->dev, "i2c write failed\n"); + dev_err(component->dev, "i2c write failed\n"); return ret; } @@ -522,10 +522,10 @@ static int cs4270_probe(struct snd_soc_codec *codec) * playback has started. An application (e.g. alsactl) can * re-enabled it by using the controls. */ - ret = snd_soc_update_bits(codec, CS4270_TRANS, + ret = snd_soc_component_update_bits(component, CS4270_TRANS, CS4270_TRANS_SOFT | CS4270_TRANS_ZERO, 0); if (ret < 0) { - dev_err(codec->dev, "i2c write failed\n"); + dev_err(component->dev, "i2c write failed\n"); return ret; } @@ -541,13 +541,11 @@ static int cs4270_probe(struct snd_soc_codec *codec) * * This function is the counterpart to cs4270_probe(). */ -static int cs4270_remove(struct snd_soc_codec *codec) +static void cs4270_remove(struct snd_soc_component *component) { - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); regulator_bulk_disable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); - - return 0; }; #ifdef CONFIG_PM @@ -561,16 +559,16 @@ static int cs4270_remove(struct snd_soc_codec *codec) * and all registers are written back to the hardware when resuming. */ -static int cs4270_soc_suspend(struct snd_soc_codec *codec) +static int cs4270_soc_suspend(struct snd_soc_component *component) { - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int reg, ret; - reg = snd_soc_read(codec, CS4270_PWRCTL) | CS4270_PWRCTL_PDN_ALL; + reg = snd_soc_component_read32(component, CS4270_PWRCTL) | CS4270_PWRCTL_PDN_ALL; if (reg < 0) return reg; - ret = snd_soc_write(codec, CS4270_PWRCTL, reg); + ret = snd_soc_component_write(component, CS4270_PWRCTL, reg); if (ret < 0) return ret; @@ -580,9 +578,9 @@ static int cs4270_soc_suspend(struct snd_soc_codec *codec) return 0; } -static int cs4270_soc_resume(struct snd_soc_codec *codec) +static int cs4270_soc_resume(struct snd_soc_component *component) { - struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); + struct cs4270_private *cs4270 = snd_soc_component_get_drvdata(component); int reg, ret; ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies), @@ -598,10 +596,10 @@ static int cs4270_soc_resume(struct snd_soc_codec *codec) regcache_sync(cs4270->regmap); /* ... then disable the power-down bits */ - reg = snd_soc_read(codec, CS4270_PWRCTL); + reg = snd_soc_component_read32(component, CS4270_PWRCTL); reg &= ~CS4270_PWRCTL_PDN_ALL; - return snd_soc_write(codec, CS4270_PWRCTL, reg); + return snd_soc_component_write(component, CS4270_PWRCTL, reg); } #else #define cs4270_soc_suspend NULL @@ -611,20 +609,21 @@ static int cs4270_soc_resume(struct snd_soc_codec *codec) /* * ASoC codec driver structure */ -static const struct snd_soc_codec_driver soc_codec_device_cs4270 = { - .probe = cs4270_probe, - .remove = cs4270_remove, - .suspend = cs4270_soc_suspend, - .resume = cs4270_soc_resume, - - .component_driver = { - .controls = cs4270_snd_controls, - .num_controls = ARRAY_SIZE(cs4270_snd_controls), - .dapm_widgets = cs4270_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs4270_dapm_widgets), - .dapm_routes = cs4270_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(cs4270_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_device_cs4270 = { + .probe = cs4270_probe, + .remove = cs4270_remove, + .suspend = cs4270_soc_suspend, + .resume = cs4270_soc_resume, + .controls = cs4270_snd_controls, + .num_controls = ARRAY_SIZE(cs4270_snd_controls), + .dapm_widgets = cs4270_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs4270_dapm_widgets), + .dapm_routes = cs4270_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(cs4270_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* @@ -718,23 +717,11 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client, i2c_set_clientdata(i2c_client, cs4270); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_device_cs4270, &cs4270_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_device_cs4270, &cs4270_dai, 1); return ret; } -/** - * cs4270_i2c_remove - remove an I2C device - * @i2c_client: the I2C client object - * - * This function is the counterpart to cs4270_i2c_probe(). - */ -static int cs4270_i2c_remove(struct i2c_client *i2c_client) -{ - snd_soc_unregister_codec(&i2c_client->dev); - return 0; -} - /* * cs4270_id - I2C device IDs supported by this driver */ @@ -757,7 +744,6 @@ static struct i2c_driver cs4270_i2c_driver = { }, .id_table = cs4270_id, .probe = cs4270_i2c_probe, - .remove = cs4270_i2c_remove, }; module_i2c_driver(cs4270_i2c_driver); diff --git a/sound/soc/codecs/cs4271-i2c.c b/sound/soc/codecs/cs4271-i2c.c index dcb3223d7d8f..ff737304d50b 100644 --- a/sound/soc/codecs/cs4271-i2c.c +++ b/sound/soc/codecs/cs4271-i2c.c @@ -33,12 +33,6 @@ static int cs4271_i2c_probe(struct i2c_client *client, devm_regmap_init_i2c(client, &config)); } -static int cs4271_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id cs4271_i2c_id[] = { { "cs4271", 0 }, { } @@ -51,7 +45,6 @@ static struct i2c_driver cs4271_i2c_driver = { .of_match_table = of_match_ptr(cs4271_dt_ids), }, .probe = cs4271_i2c_probe, - .remove = cs4271_i2c_remove, .id_table = cs4271_i2c_id, }; module_i2c_driver(cs4271_i2c_driver); diff --git a/sound/soc/codecs/cs4271-spi.c b/sound/soc/codecs/cs4271-spi.c index 1ff5f520196a..217f6dc869e5 100644 --- a/sound/soc/codecs/cs4271-spi.c +++ b/sound/soc/codecs/cs4271-spi.c @@ -33,19 +33,12 @@ static int cs4271_spi_probe(struct spi_device *spi) return cs4271_probe(&spi->dev, devm_regmap_init_spi(spi, &config)); } -static int cs4271_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver cs4271_spi_driver = { .driver = { .name = "cs4271", .of_match_table = of_match_ptr(cs4271_dt_ids), }, .probe = cs4271_spi_probe, - .remove = cs4271_spi_remove, }; module_spi_driver(cs4271_spi_driver); diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index 49a80627af12..849fdb2cb260 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c @@ -206,8 +206,8 @@ static const struct snd_soc_dapm_route cs4271_dapm_routes[] = { static int cs4271_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); cs4271->mclk = freq; return 0; @@ -216,8 +216,8 @@ static int cs4271_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int cs4271_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); unsigned int val = 0; int ret; @@ -230,7 +230,7 @@ static int cs4271_set_dai_fmt(struct snd_soc_dai *codec_dai, val |= CS4271_MODE1_MASTER; break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -250,7 +250,7 @@ static int cs4271_set_dai_fmt(struct snd_soc_dai *codec_dai, return ret; break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -263,9 +263,9 @@ static int cs4271_set_dai_fmt(struct snd_soc_dai *codec_dai, static int cs4271_deemph[] = {0, 44100, 48000, 32000}; -static int cs4271_set_deemph(struct snd_soc_codec *codec) +static int cs4271_set_deemph(struct snd_soc_component *component) { - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); int i, ret; int val = CS4271_DACCTL_DEM_DIS; @@ -289,8 +289,8 @@ static int cs4271_set_deemph(struct snd_soc_codec *codec) static int cs4271_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = cs4271->deemph; return 0; @@ -299,11 +299,11 @@ static int cs4271_get_deemph(struct snd_kcontrol *kcontrol, static int cs4271_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); cs4271->deemph = ucontrol->value.integer.value[0]; - return cs4271_set_deemph(codec); + return cs4271_set_deemph(component); } struct cs4271_clk_cfg { @@ -349,8 +349,8 @@ static int cs4271_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); int i, ret; unsigned int ratio, val; @@ -399,7 +399,7 @@ static int cs4271_hw_params(struct snd_pcm_substream *substream, break; if (i == CS4171_NR_RATIOS) { - dev_err(codec->dev, "Invalid sample rate\n"); + dev_err(component->dev, "Invalid sample rate\n"); return -EINVAL; } @@ -410,13 +410,13 @@ static int cs4271_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - return cs4271_set_deemph(codec); + return cs4271_set_deemph(component); } static int cs4271_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { - struct snd_soc_codec *codec = dai->codec; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); int ret; int val_a = 0; int val_b = 0; @@ -493,9 +493,9 @@ static struct snd_soc_dai_driver cs4271_dai = { .symmetric_rates = 1, }; -static int cs4271_reset(struct snd_soc_codec *codec) +static int cs4271_reset(struct snd_soc_component *component) { - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); if (gpio_is_valid(cs4271->gpio_nreset)) { gpio_direction_output(cs4271->gpio_nreset, 0); @@ -508,10 +508,10 @@ static int cs4271_reset(struct snd_soc_codec *codec) } #ifdef CONFIG_PM -static int cs4271_soc_suspend(struct snd_soc_codec *codec) +static int cs4271_soc_suspend(struct snd_soc_component *component) { int ret; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); /* Set power-down bit */ ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, @@ -525,20 +525,20 @@ static int cs4271_soc_suspend(struct snd_soc_codec *codec) return 0; } -static int cs4271_soc_resume(struct snd_soc_codec *codec) +static int cs4271_soc_resume(struct snd_soc_component *component) { int ret; - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); ret = regulator_bulk_enable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; } /* Do a proper reset after power up */ - cs4271_reset(codec); + cs4271_reset(component); /* Restore codec state */ ret = regcache_sync(cs4271->regmap); @@ -567,20 +567,20 @@ MODULE_DEVICE_TABLE(of, cs4271_dt_ids); EXPORT_SYMBOL_GPL(cs4271_dt_ids); #endif -static int cs4271_codec_probe(struct snd_soc_codec *codec) +static int cs4271_component_probe(struct snd_soc_component *component) { - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); - struct cs4271_platform_data *cs4271plat = codec->dev->platform_data; + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); + struct cs4271_platform_data *cs4271plat = component->dev->platform_data; int ret; bool amutec_eq_bmutec = false; #ifdef CONFIG_OF - if (of_match_device(cs4271_dt_ids, codec->dev)) { - if (of_get_property(codec->dev->of_node, + if (of_match_device(cs4271_dt_ids, component->dev)) { + if (of_get_property(component->dev->of_node, "cirrus,amutec-eq-bmutec", NULL)) amutec_eq_bmutec = true; - if (of_get_property(codec->dev->of_node, + if (of_get_property(component->dev->of_node, "cirrus,enable-soft-reset", NULL)) cs4271->enable_soft_reset = true; } @@ -589,7 +589,7 @@ static int cs4271_codec_probe(struct snd_soc_codec *codec) ret = regulator_bulk_enable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; } @@ -599,7 +599,7 @@ static int cs4271_codec_probe(struct snd_soc_codec *codec) } /* Reset codec */ - cs4271_reset(codec); + cs4271_reset(component); ret = regcache_sync(cs4271->regmap); if (ret < 0) @@ -625,9 +625,9 @@ static int cs4271_codec_probe(struct snd_soc_codec *codec) return 0; } -static int cs4271_codec_remove(struct snd_soc_codec *codec) +static void cs4271_component_remove(struct snd_soc_component *component) { - struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); + struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component); if (gpio_is_valid(cs4271->gpio_nreset)) /* Set codec to the reset state */ @@ -635,24 +635,23 @@ static int cs4271_codec_remove(struct snd_soc_codec *codec) regcache_mark_dirty(cs4271->regmap); regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); - - return 0; }; -static const struct snd_soc_codec_driver soc_codec_dev_cs4271 = { - .probe = cs4271_codec_probe, - .remove = cs4271_codec_remove, +static const struct snd_soc_component_driver soc_component_dev_cs4271 = { + .probe = cs4271_component_probe, + .remove = cs4271_component_remove, .suspend = cs4271_soc_suspend, .resume = cs4271_soc_resume, - - .component_driver = { - .controls = cs4271_snd_controls, - .num_controls = ARRAY_SIZE(cs4271_snd_controls), - .dapm_widgets = cs4271_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs4271_dapm_widgets), - .dapm_routes = cs4271_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(cs4271_dapm_routes), - }, + .controls = cs4271_snd_controls, + .num_controls = ARRAY_SIZE(cs4271_snd_controls), + .dapm_widgets = cs4271_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs4271_dapm_widgets), + .dapm_routes = cs4271_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(cs4271_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int cs4271_common_probe(struct device *dev, @@ -721,8 +720,8 @@ int cs4271_probe(struct device *dev, struct regmap *regmap) dev_set_drvdata(dev, cs4271); cs4271->regmap = regmap; - return snd_soc_register_codec(dev, &soc_codec_dev_cs4271, &cs4271_dai, - 1); + return devm_snd_soc_register_component(dev, &soc_component_dev_cs4271, + &cs4271_dai, 1); } EXPORT_SYMBOL_GPL(cs4271_probe); diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c index a2324a0e72ee..651329bf9743 100644 --- a/sound/soc/codecs/cs42l42.c +++ b/sound/soc/codecs/cs42l42.c @@ -468,33 +468,33 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = { static int cs42l42_hpdrv_evt(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); if (event & SND_SOC_DAPM_POST_PMU) { /* Enable the channels */ - snd_soc_update_bits(codec, CS42L42_ASP_RX_DAI0_EN, + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_EN, CS42L42_ASP_RX0_CH_EN_MASK, (CS42L42_ASP_RX0_CH1_EN | CS42L42_ASP_RX0_CH2_EN) << CS42L42_ASP_RX0_CH_EN_SHIFT); /* Power up */ - snd_soc_update_bits(codec, CS42L42_PWR_CTL1, + snd_soc_component_update_bits(component, CS42L42_PWR_CTL1, CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK | CS42L42_HP_PDN_MASK, 0); } else if (event & SND_SOC_DAPM_PRE_PMD) { /* Disable the channels */ - snd_soc_update_bits(codec, CS42L42_ASP_RX_DAI0_EN, + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_EN, CS42L42_ASP_RX0_CH_EN_MASK, 0); /* Power down */ - snd_soc_update_bits(codec, CS42L42_PWR_CTL1, + snd_soc_component_update_bits(component, CS42L42_PWR_CTL1, CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK | CS42L42_HP_PDN_MASK, CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK | CS42L42_HP_PDN_MASK); } else { - dev_err(codec->dev, "Invalid event 0x%x\n", event); + dev_err(component->dev, "Invalid event 0x%x\n", event); } return 0; } @@ -515,10 +515,10 @@ static const struct snd_soc_dapm_route cs42l42_audio_map[] = { {"HP", NULL, "HPDRV"} }; -static int cs42l42_set_bias_level(struct snd_soc_codec *codec, +static int cs42l42_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec); + struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -527,14 +527,14 @@ static int cs42l42_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { regcache_cache_only(cs42l42->regmap, false); regcache_sync(cs42l42->regmap); ret = regulator_bulk_enable( ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; @@ -552,30 +552,28 @@ static int cs42l42_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int cs42l42_codec_probe(struct snd_soc_codec *codec) +static int cs42l42_component_probe(struct snd_soc_component *component) { struct cs42l42_private *cs42l42 = - (struct cs42l42_private *)snd_soc_codec_get_drvdata(codec); + (struct cs42l42_private *)snd_soc_component_get_drvdata(component); - cs42l42->codec = codec; + cs42l42->component = component; return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_cs42l42 = { - .probe = cs42l42_codec_probe, - .set_bias_level = cs42l42_set_bias_level, - .ignore_pmdown_time = true, - - .component_driver = { - .dapm_widgets = cs42l42_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42l42_dapm_widgets), - .dapm_routes = cs42l42_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs42l42_audio_map), - - .controls = cs42l42_snd_controls, - .num_controls = ARRAY_SIZE(cs42l42_snd_controls), - }, +static const struct snd_soc_component_driver soc_component_dev_cs42l42 = { + .probe = cs42l42_component_probe, + .set_bias_level = cs42l42_set_bias_level, + .dapm_widgets = cs42l42_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42l42_dapm_widgets), + .dapm_routes = cs42l42_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs42l42_audio_map), + .controls = cs42l42_snd_controls, + .num_controls = ARRAY_SIZE(cs42l42_snd_controls), + .idle_bias_on = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; struct cs42l42_pll_params { @@ -613,16 +611,16 @@ static const struct cs42l42_pll_params pll_ratio_table[] = { { 24576000, 1, 0, 0, 0, 0, 0, 0, 24576000, 0 } }; -static int cs42l42_pll_config(struct snd_soc_codec *codec) +static int cs42l42_pll_config(struct snd_soc_component *component) { - struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec); + struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); int i; u32 fsync; for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) { if (pll_ratio_table[i].sclk == cs42l42->sclk) { /* Configure the internal sample rate */ - snd_soc_update_bits(codec, CS42L42_MCLK_CTL, + snd_soc_component_update_bits(component, CS42L42_MCLK_CTL, CS42L42_INTERNAL_FS_MASK, ((pll_ratio_table[i].mclk_int != 12000000) && @@ -632,7 +630,7 @@ static int cs42l42_pll_config(struct snd_soc_codec *codec) /* Set the MCLK src (PLL or SCLK) and the divide * ratio */ - snd_soc_update_bits(codec, CS42L42_MCLK_SRC_SEL, + snd_soc_component_update_bits(component, CS42L42_MCLK_SRC_SEL, CS42L42_MCLK_SRC_SEL_MASK | CS42L42_MCLKDIV_MASK, (pll_ratio_table[i].mclk_src_sel @@ -643,62 +641,62 @@ static int cs42l42_pll_config(struct snd_soc_codec *codec) fsync = cs42l42->sclk / cs42l42->srate; if (((fsync * cs42l42->srate) != cs42l42->sclk) || ((fsync % 2) != 0)) { - dev_err(codec->dev, + dev_err(component->dev, "Unsupported sclk %d/sample rate %d\n", cs42l42->sclk, cs42l42->srate); return -EINVAL; } /* Set the LRCLK period */ - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_FSYNC_P_LOWER, CS42L42_FSYNC_PERIOD_MASK, CS42L42_FRAC0_VAL(fsync - 1) << CS42L42_FSYNC_PERIOD_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_FSYNC_P_UPPER, CS42L42_FSYNC_PERIOD_MASK, CS42L42_FRAC1_VAL(fsync - 1) << CS42L42_FSYNC_PERIOD_SHIFT); /* Set the LRCLK to 50% duty cycle */ fsync = fsync / 2; - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_FSYNC_PW_LOWER, CS42L42_FSYNC_PULSE_WIDTH_MASK, CS42L42_FRAC0_VAL(fsync - 1) << CS42L42_FSYNC_PULSE_WIDTH_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_FSYNC_PW_UPPER, CS42L42_FSYNC_PULSE_WIDTH_MASK, CS42L42_FRAC1_VAL(fsync - 1) << CS42L42_FSYNC_PULSE_WIDTH_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_ASP_FRM_CFG, CS42L42_ASP_5050_MASK, CS42L42_ASP_5050_MASK); /* Set the frame delay to 1.0 SCLK clocks */ - snd_soc_update_bits(codec, CS42L42_ASP_FRM_CFG, + snd_soc_component_update_bits(component, CS42L42_ASP_FRM_CFG, CS42L42_ASP_FSD_MASK, CS42L42_ASP_FSD_1_0 << CS42L42_ASP_FSD_SHIFT); /* Set the sample rates (96k or lower) */ - snd_soc_update_bits(codec, CS42L42_FS_RATE_EN, + snd_soc_component_update_bits(component, CS42L42_FS_RATE_EN, CS42L42_FS_EN_MASK, (CS42L42_FS_EN_IASRC_96K | CS42L42_FS_EN_OASRC_96K) << CS42L42_FS_EN_SHIFT); /* Set the input/output internal MCLK clock ~12 MHz */ - snd_soc_update_bits(codec, CS42L42_IN_ASRC_CLK, + snd_soc_component_update_bits(component, CS42L42_IN_ASRC_CLK, CS42L42_CLK_IASRC_SEL_MASK, CS42L42_CLK_IASRC_SEL_12 << CS42L42_CLK_IASRC_SEL_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_OUT_ASRC_CLK, CS42L42_CLK_OASRC_SEL_MASK, CS42L42_CLK_OASRC_SEL_12 << CS42L42_CLK_OASRC_SEL_SHIFT); /* channel 1 on low LRCLK, 32 bit */ - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH1_AP_RES, CS42L42_ASP_RX_CH_AP_MASK | CS42L42_ASP_RX_CH_RES_MASK, @@ -707,7 +705,7 @@ static int cs42l42_pll_config(struct snd_soc_codec *codec) (CS42L42_ASP_RX_CH_RES_32 << CS42L42_ASP_RX_CH_RES_SHIFT)); /* Channel 2 on high LRCLK, 32 bit */ - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH2_AP_RES, CS42L42_ASP_RX_CH_AP_MASK | CS42L42_ASP_RX_CH_RES_MASK, @@ -717,50 +715,50 @@ static int cs42l42_pll_config(struct snd_soc_codec *codec) CS42L42_ASP_RX_CH_RES_SHIFT)); if (pll_ratio_table[i].mclk_src_sel == 0) { /* Pass the clock straight through */ - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_CTL1, CS42L42_PLL_START_MASK, 0); } else { /* Configure PLL per table 4-5 */ - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_DIV_CFG1, CS42L42_SCLK_PREDIV_MASK, pll_ratio_table[i].sclk_prediv << CS42L42_SCLK_PREDIV_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_DIV_INT, CS42L42_PLL_DIV_INT_MASK, pll_ratio_table[i].pll_div_int << CS42L42_PLL_DIV_INT_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_DIV_FRAC0, CS42L42_PLL_DIV_FRAC_MASK, CS42L42_FRAC0_VAL( pll_ratio_table[i].pll_div_frac) << CS42L42_PLL_DIV_FRAC_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_DIV_FRAC1, CS42L42_PLL_DIV_FRAC_MASK, CS42L42_FRAC1_VAL( pll_ratio_table[i].pll_div_frac) << CS42L42_PLL_DIV_FRAC_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_DIV_FRAC2, CS42L42_PLL_DIV_FRAC_MASK, CS42L42_FRAC2_VAL( pll_ratio_table[i].pll_div_frac) << CS42L42_PLL_DIV_FRAC_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_CTL4, CS42L42_PLL_MODE_MASK, pll_ratio_table[i].pll_mode << CS42L42_PLL_MODE_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_CTL3, CS42L42_PLL_DIVOUT_MASK, pll_ratio_table[i].pll_divout << CS42L42_PLL_DIVOUT_SHIFT); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, CS42L42_PLL_CAL_RATIO, CS42L42_PLL_CAL_RATIO_MASK, pll_ratio_table[i].pll_cal_ratio @@ -775,7 +773,7 @@ static int cs42l42_pll_config(struct snd_soc_codec *codec) static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u32 asp_cfg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -820,7 +818,7 @@ static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) break; } - snd_soc_update_bits(codec, CS42L42_ASP_CLK_CFG, + snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, CS42L42_ASP_MODE_MASK | CS42L42_ASP_SCPOL_IN_DAC_MASK | CS42L42_ASP_LCPOL_IN_MASK, asp_cfg_val); @@ -832,14 +830,14 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); int retval; cs42l42->srate = params_rate(params); cs42l42->swidth = params_width(params); - retval = cs42l42_pll_config(codec); + retval = cs42l42_pll_config(component); return retval; } @@ -847,8 +845,8 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream, static int cs42l42_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); cs42l42->sclk = freq; @@ -857,7 +855,7 @@ static int cs42l42_set_sysclk(struct snd_soc_dai *dai, static int cs42l42_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int regval; u8 fullScaleVol; @@ -865,25 +863,25 @@ static int cs42l42_digital_mute(struct snd_soc_dai *dai, int mute) /* Mark SCLK as not present to turn on the internal * oscillator. */ - snd_soc_update_bits(codec, CS42L42_OSC_SWITCH, + snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH, CS42L42_SCLK_PRESENT_MASK, 0); - snd_soc_update_bits(codec, CS42L42_PLL_CTL1, + snd_soc_component_update_bits(component, CS42L42_PLL_CTL1, CS42L42_PLL_START_MASK, 0 << CS42L42_PLL_START_SHIFT); /* Mute the headphone */ - snd_soc_update_bits(codec, CS42L42_HP_CTL, + snd_soc_component_update_bits(component, CS42L42_HP_CTL, CS42L42_HP_ANA_AMUTE_MASK | CS42L42_HP_ANA_BMUTE_MASK, CS42L42_HP_ANA_AMUTE_MASK | CS42L42_HP_ANA_BMUTE_MASK); } else { - snd_soc_update_bits(codec, CS42L42_PLL_CTL1, + snd_soc_component_update_bits(component, CS42L42_PLL_CTL1, CS42L42_PLL_START_MASK, 1 << CS42L42_PLL_START_SHIFT); /* Read the headphone load */ - regval = snd_soc_read(codec, CS42L42_LOAD_DET_RCSTAT); + regval = snd_soc_component_read32(component, CS42L42_LOAD_DET_RCSTAT); if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) == CS42L42_RLA_STAT_15_OHM) { fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK; @@ -892,13 +890,13 @@ static int cs42l42_digital_mute(struct snd_soc_dai *dai, int mute) } /* Un-mute the headphone, set the full scale volume flag */ - snd_soc_update_bits(codec, CS42L42_HP_CTL, + snd_soc_component_update_bits(component, CS42L42_HP_CTL, CS42L42_HP_ANA_AMUTE_MASK | CS42L42_HP_ANA_BMUTE_MASK | CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol); /* Mark SCLK as present, turn off internal oscillator */ - snd_soc_update_bits(codec, CS42L42_OSC_SWITCH, + snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH, CS42L42_SCLK_PRESENT_MASK, CS42L42_SCLK_PRESENT_MASK); } @@ -1262,16 +1260,16 @@ static void cs42l42_handle_button_press(struct cs42l42_private *cs42l42) switch (bias_level) { case 1: /* Function C button press */ - dev_dbg(cs42l42->codec->dev, "Function C button press\n"); + dev_dbg(cs42l42->component->dev, "Function C button press\n"); break; case 2: /* Function B button press */ - dev_dbg(cs42l42->codec->dev, "Function B button press\n"); + dev_dbg(cs42l42->component->dev, "Function B button press\n"); break; case 3: /* Function D button press */ - dev_dbg(cs42l42->codec->dev, "Function D button press\n"); + dev_dbg(cs42l42->component->dev, "Function D button press\n"); break; case 4: /* Function A button press */ - dev_dbg(cs42l42->codec->dev, "Function A button press\n"); + dev_dbg(cs42l42->component->dev, "Function A button press\n"); break; } @@ -1340,7 +1338,7 @@ static const struct cs42l42_irq_params irq_params_table[] = { static irqreturn_t cs42l42_irq_thread(int irq, void *data) { struct cs42l42_private *cs42l42 = (struct cs42l42_private *)data; - struct snd_soc_codec *codec = cs42l42->codec; + struct snd_soc_component *component = cs42l42->component; unsigned int stickies[12]; unsigned int masks[12]; unsigned int current_plug_status; @@ -1372,7 +1370,7 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data) if ((~masks[5]) & irq_params_table[5].mask) { if (stickies[5] & CS42L42_HSDET_AUTO_DONE_MASK) { cs42l42_process_hs_type_detect(cs42l42); - dev_dbg(codec->dev, + dev_dbg(component->dev, "Auto detect done (%d)\n", cs42l42->hs_type); } @@ -1392,7 +1390,7 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data) if (cs42l42->plug_state != CS42L42_TS_UNPLUG) { cs42l42->plug_state = CS42L42_TS_UNPLUG; cs42l42_cancel_hs_type_detect(cs42l42); - dev_dbg(codec->dev, + dev_dbg(component->dev, "Unplug event\n"); } break; @@ -1410,7 +1408,7 @@ static irqreturn_t cs42l42_irq_thread(int irq, void *data) if (current_button_status & CS42L42_M_DETECT_TF_MASK) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Button released\n"); } else if (current_button_status & CS42L42_M_DETECT_FT_MASK) { @@ -1879,8 +1877,8 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client, cs42l42_set_interrupt_masks(cs42l42); /* Register codec for machine driver */ - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs42l42, &cs42l42_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs42l42, &cs42l42_dai, 1); if (ret < 0) goto err_disable; return 0; @@ -1895,8 +1893,6 @@ static int cs42l42_i2c_remove(struct i2c_client *i2c_client) { struct cs42l42_private *cs42l42 = i2c_get_clientdata(i2c_client); - snd_soc_unregister_codec(&i2c_client->dev); - /* Hold down reset */ gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h index d87a0a5322d5..09b0a93203ef 100644 --- a/sound/soc/codecs/cs42l42.h +++ b/sound/soc/codecs/cs42l42.h @@ -754,7 +754,7 @@ static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = { struct cs42l42_private { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regulator_bulk_data supplies[CS42L42_NUM_SUPPLIES]; struct gpio_desc *reset_gpio; struct completion pdn_done; diff --git a/sound/soc/codecs/cs42l51-i2c.c b/sound/soc/codecs/cs42l51-i2c.c index 9bad478474fa..4b5731a41876 100644 --- a/sound/soc/codecs/cs42l51-i2c.c +++ b/sound/soc/codecs/cs42l51-i2c.c @@ -35,20 +35,12 @@ static int cs42l51_i2c_probe(struct i2c_client *i2c, return cs42l51_probe(&i2c->dev, devm_regmap_init_i2c(i2c, &config)); } -static int cs42l51_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static struct i2c_driver cs42l51_i2c_driver = { .driver = { .name = "cs42l51", .of_match_table = cs42l51_of_match, }, .probe = cs42l51_i2c_probe, - .remove = cs42l51_i2c_remove, .id_table = cs42l51_i2c_id, }; diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c index f8072f1897d4..5080d7a3c279 100644 --- a/sound/soc/codecs/cs42l51.c +++ b/sound/soc/codecs/cs42l51.c @@ -54,8 +54,8 @@ struct cs42l51_private { static int cs42l51_get_chan_mix(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - unsigned long value = snd_soc_read(codec, CS42L51_PCM_MIXER)&3; + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + unsigned long value = snd_soc_component_read32(component, CS42L51_PCM_MIXER)&3; switch (value) { default: @@ -82,7 +82,7 @@ static int cs42l51_get_chan_mix(struct snd_kcontrol *kcontrol, static int cs42l51_set_chan_mix(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned char val; switch (ucontrol->value.enumerated.item[0]) { @@ -98,7 +98,7 @@ static int cs42l51_set_chan_mix(struct snd_kcontrol *kcontrol, break; } - snd_soc_write(codec, CS42L51_PCM_MIXER, val); + snd_soc_component_write(component, CS42L51_PCM_MIXER, val); return 1; } @@ -153,17 +153,17 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = { static int cs42l51_pdn_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, CS42L51_POWER_CTL1, + snd_soc_component_update_bits(component, CS42L51_POWER_CTL1, CS42L51_POWER_CTL1_PDN, CS42L51_POWER_CTL1_PDN); break; default: case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, CS42L51_POWER_CTL1, + snd_soc_component_update_bits(component, CS42L51_POWER_CTL1, CS42L51_POWER_CTL1_PDN, 0); break; } @@ -263,8 +263,8 @@ static const struct snd_soc_dapm_route cs42l51_routes[] = { static int cs42l51_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l51_private *cs42l51 = snd_soc_component_get_drvdata(component); switch (format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: @@ -273,7 +273,7 @@ static int cs42l51_set_dai_fmt(struct snd_soc_dai *codec_dai, cs42l51->audio_mode = format & SND_SOC_DAIFMT_FORMAT_MASK; break; default: - dev_err(codec->dev, "invalid DAI format\n"); + dev_err(component->dev, "invalid DAI format\n"); return -EINVAL; } @@ -285,7 +285,7 @@ static int cs42l51_set_dai_fmt(struct snd_soc_dai *codec_dai, cs42l51->func = MODE_SLAVE_AUTO; break; default: - dev_err(codec->dev, "Unknown master/slave configuration\n"); + dev_err(component->dev, "Unknown master/slave configuration\n"); return -EINVAL; } @@ -326,8 +326,8 @@ static struct cs42l51_ratios slave_auto_ratios[] = { static int cs42l51_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l51_private *cs42l51 = snd_soc_component_get_drvdata(component); cs42l51->mclk = freq; return 0; @@ -337,8 +337,8 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l51_private *cs42l51 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l51_private *cs42l51 = snd_soc_component_get_drvdata(component); int ret; unsigned int i; unsigned int rate; @@ -370,12 +370,12 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream, if (i == nr_ratios) { /* We did not find a matching ratio */ - dev_err(codec->dev, "could not find matching ratio\n"); + dev_err(component->dev, "could not find matching ratio\n"); return -EINVAL; } - intf_ctl = snd_soc_read(codec, CS42L51_INTF_CTL); - power_ctl = snd_soc_read(codec, CS42L51_MIC_POWER_CTL); + intf_ctl = snd_soc_component_read32(component, CS42L51_INTF_CTL); + power_ctl = snd_soc_component_read32(component, CS42L51_MIC_POWER_CTL); intf_ctl &= ~(CS42L51_INTF_CTL_MASTER | CS42L51_INTF_CTL_ADC_I2S | CS42L51_INTF_CTL_DAC_FORMAT(7)); @@ -418,24 +418,24 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream, fmt = CS42L51_DAC_DIF_RJ24; break; default: - dev_err(codec->dev, "unknown format\n"); + dev_err(component->dev, "unknown format\n"); return -EINVAL; } intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(fmt); break; default: - dev_err(codec->dev, "unknown format\n"); + dev_err(component->dev, "unknown format\n"); return -EINVAL; } if (ratios[i].mclk) power_ctl |= CS42L51_MIC_POWER_CTL_MCLK_DIV2; - ret = snd_soc_write(codec, CS42L51_INTF_CTL, intf_ctl); + ret = snd_soc_component_write(component, CS42L51_INTF_CTL, intf_ctl); if (ret < 0) return ret; - ret = snd_soc_write(codec, CS42L51_MIC_POWER_CTL, power_ctl); + ret = snd_soc_component_write(component, CS42L51_MIC_POWER_CTL, power_ctl); if (ret < 0) return ret; @@ -444,18 +444,18 @@ static int cs42l51_hw_params(struct snd_pcm_substream *substream, static int cs42l51_dai_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int reg; int mask = CS42L51_DAC_OUT_CTL_DACA_MUTE|CS42L51_DAC_OUT_CTL_DACB_MUTE; - reg = snd_soc_read(codec, CS42L51_DAC_OUT_CTL); + reg = snd_soc_component_read32(component, CS42L51_DAC_OUT_CTL); if (mute) reg |= mask; else reg &= ~mask; - return snd_soc_write(codec, CS42L51_DAC_OUT_CTL, reg); + return snd_soc_component_write(component, CS42L51_DAC_OUT_CTL, reg); } static const struct snd_soc_dai_ops cs42l51_dai_ops = { @@ -484,7 +484,7 @@ static struct snd_soc_dai_driver cs42l51_dai = { .ops = &cs42l51_dai_ops, }; -static int cs42l51_codec_probe(struct snd_soc_codec *codec) +static int cs42l51_component_probe(struct snd_soc_component *component) { int ret, reg; @@ -497,24 +497,25 @@ static int cs42l51_codec_probe(struct snd_soc_codec *codec) */ reg = CS42L51_DAC_CTL_DATA_SEL(1) | CS42L51_DAC_CTL_AMUTE | CS42L51_DAC_CTL_DACSZ(0); - ret = snd_soc_write(codec, CS42L51_DAC_CTL, reg); + ret = snd_soc_component_write(component, CS42L51_DAC_CTL, reg); if (ret < 0) return ret; return 0; } -static const struct snd_soc_codec_driver soc_codec_device_cs42l51 = { - .probe = cs42l51_codec_probe, - - .component_driver = { - .controls = cs42l51_snd_controls, - .num_controls = ARRAY_SIZE(cs42l51_snd_controls), - .dapm_widgets = cs42l51_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42l51_dapm_widgets), - .dapm_routes = cs42l51_routes, - .num_dapm_routes = ARRAY_SIZE(cs42l51_routes), - }, +static const struct snd_soc_component_driver soc_component_device_cs42l51 = { + .probe = cs42l51_component_probe, + .controls = cs42l51_snd_controls, + .num_controls = ARRAY_SIZE(cs42l51_snd_controls), + .dapm_widgets = cs42l51_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42l51_dapm_widgets), + .dapm_routes = cs42l51_routes, + .num_dapm_routes = ARRAY_SIZE(cs42l51_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; const struct regmap_config cs42l51_regmap = { @@ -555,8 +556,8 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap) dev_info(dev, "Cirrus Logic CS42L51, Revision: %02X\n", val & CS42L51_CHIP_REV_MASK); - ret = snd_soc_register_codec(dev, - &soc_codec_device_cs42l51, &cs42l51_dai, 1); + ret = devm_snd_soc_register_component(dev, + &soc_component_device_cs42l51, &cs42l51_dai, 1); error: return ret; } diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 9731e5dff291..3d83c1be1292 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -42,7 +42,7 @@ struct sp_config { struct cs42l52_private { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct device *dev; struct sp_config config; struct cs42l52_platform_data pdata; @@ -473,17 +473,17 @@ static const struct snd_kcontrol_new cs42l52_micb_controls[] = { SOC_ENUM("MICB Select", micb_enum), }; -static int cs42l52_add_mic_controls(struct snd_soc_codec *codec) +static int cs42l52_add_mic_controls(struct snd_soc_component *component) { - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); struct cs42l52_platform_data *pdata = &cs42l52->pdata; if (!pdata->mica_diff_cfg) - snd_soc_add_codec_controls(codec, cs42l52_mica_controls, + snd_soc_add_component_controls(component, cs42l52_mica_controls, ARRAY_SIZE(cs42l52_mica_controls)); if (!pdata->micb_diff_cfg) - snd_soc_add_codec_controls(codec, cs42l52_micb_controls, + snd_soc_add_component_controls(component, cs42l52_micb_controls, ARRAY_SIZE(cs42l52_micb_controls)); return 0; @@ -716,13 +716,13 @@ static int cs42l52_get_clk(int mclk, int rate) static int cs42l52_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); if ((freq >= CS42L52_MIN_CLK) && (freq <= CS42L52_MAX_CLK)) { cs42l52->sysclk = freq; } else { - dev_err(codec->dev, "Invalid freq parameter\n"); + dev_err(component->dev, "Invalid freq parameter\n"); return -EINVAL; } return 0; @@ -730,8 +730,8 @@ static int cs42l52_set_sysclk(struct snd_soc_dai *codec_dai, static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); u8 iface = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -783,21 +783,21 @@ static int cs42l52_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } cs42l52->config.format = iface; - snd_soc_write(codec, CS42L52_IFACE_CTL1, cs42l52->config.format); + snd_soc_component_write(component, CS42L52_IFACE_CTL1, cs42l52->config.format); return 0; } static int cs42l52_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) - snd_soc_update_bits(codec, CS42L52_PB_CTL1, + snd_soc_component_update_bits(component, CS42L52_PB_CTL1, CS42L52_PB_CTL1_MUTE_MASK, CS42L52_PB_CTL1_MUTE); else - snd_soc_update_bits(codec, CS42L52_PB_CTL1, + snd_soc_component_update_bits(component, CS42L52_PB_CTL1, CS42L52_PB_CTL1_MUTE_MASK, CS42L52_PB_CTL1_UNMUTE); @@ -808,8 +808,8 @@ static int cs42l52_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); u32 clk = 0; int index; @@ -823,36 +823,36 @@ static int cs42l52_pcm_hw_params(struct snd_pcm_substream *substream, (clk_map_table[index].ratio << CLK_RATIO_SHIFT) | clk_map_table[index].mclkdiv2; - snd_soc_write(codec, CS42L52_CLK_CTL, clk); + snd_soc_component_write(component, CS42L52_CLK_CTL, clk); } else { - dev_err(codec->dev, "can't get correct mclk\n"); + dev_err(component->dev, "can't get correct mclk\n"); return -EINVAL; } return 0; } -static int cs42l52_set_bias_level(struct snd_soc_codec *codec, +static int cs42l52_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, CS42L52_PWRCTL1, + snd_soc_component_update_bits(component, CS42L52_PWRCTL1, CS42L52_PWRCTL1_PDN_CODEC, 0); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { regcache_cache_only(cs42l52->regmap, false); regcache_sync(cs42l52->regmap); } - snd_soc_write(codec, CS42L52_PWRCTL1, CS42L52_PWRCTL1_PDN_ALL); + snd_soc_component_write(component, CS42L52_PWRCTL1, CS42L52_PWRCTL1_PDN_ALL); break; case SND_SOC_BIAS_OFF: - snd_soc_write(codec, CS42L52_PWRCTL1, CS42L52_PWRCTL1_PDN_ALL); + snd_soc_component_write(component, CS42L52_PWRCTL1, CS42L52_PWRCTL1_PDN_ALL); regcache_cache_only(cs42l52->regmap, true); break; } @@ -902,8 +902,8 @@ static void cs42l52_beep_work(struct work_struct *work) { struct cs42l52_private *cs42l52 = container_of(work, struct cs42l52_private, beep_work); - struct snd_soc_codec *codec = cs42l52->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = cs42l52->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int i; int val = 0; int best = 0; @@ -915,18 +915,18 @@ static void cs42l52_beep_work(struct work_struct *work) best = i; } - dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n", + dev_dbg(component->dev, "Set beep rate %dHz for requested %dHz\n", beep_rates[best], cs42l52->beep_rate); val = (best << CS42L52_BEEP_RATE_SHIFT); snd_soc_dapm_enable_pin(dapm, "Beep"); } else { - dev_dbg(codec->dev, "Disabling beep\n"); + dev_dbg(component->dev, "Disabling beep\n"); snd_soc_dapm_disable_pin(dapm, "Beep"); } - snd_soc_update_bits(codec, CS42L52_BEEP_FREQ, + snd_soc_component_update_bits(component, CS42L52_BEEP_FREQ, CS42L52_BEEP_RATE_MASK, val); snd_soc_dapm_sync(dapm); @@ -938,10 +938,10 @@ static void cs42l52_beep_work(struct work_struct *work) static int cs42l52_beep_event(struct input_dev *dev, unsigned int type, unsigned int code, int hz) { - struct snd_soc_codec *codec = input_get_drvdata(dev); - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = input_get_drvdata(dev); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "Beep event %x %x\n", code, hz); + dev_dbg(component->dev, "Beep event %x %x\n", code, hz); switch (code) { case SND_BELL: @@ -978,14 +978,14 @@ static ssize_t cs42l52_beep_set(struct device *dev, static DEVICE_ATTR(beep, 0200, NULL, cs42l52_beep_set); -static void cs42l52_init_beep(struct snd_soc_codec *codec) +static void cs42l52_init_beep(struct snd_soc_component *component) { - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); int ret; - cs42l52->beep = devm_input_allocate_device(codec->dev); + cs42l52->beep = devm_input_allocate_device(component->dev); if (!cs42l52->beep) { - dev_err(codec->dev, "Failed to allocate beep device\n"); + dev_err(component->dev, "Failed to allocate beep device\n"); return; } @@ -993,49 +993,49 @@ static void cs42l52_init_beep(struct snd_soc_codec *codec) cs42l52->beep_rate = 0; cs42l52->beep->name = "CS42L52 Beep Generator"; - cs42l52->beep->phys = dev_name(codec->dev); + cs42l52->beep->phys = dev_name(component->dev); cs42l52->beep->id.bustype = BUS_I2C; cs42l52->beep->evbit[0] = BIT_MASK(EV_SND); cs42l52->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); cs42l52->beep->event = cs42l52_beep_event; - cs42l52->beep->dev.parent = codec->dev; - input_set_drvdata(cs42l52->beep, codec); + cs42l52->beep->dev.parent = component->dev; + input_set_drvdata(cs42l52->beep, component); ret = input_register_device(cs42l52->beep); if (ret != 0) { cs42l52->beep = NULL; - dev_err(codec->dev, "Failed to register beep device\n"); + dev_err(component->dev, "Failed to register beep device\n"); } - ret = device_create_file(codec->dev, &dev_attr_beep); + ret = device_create_file(component->dev, &dev_attr_beep); if (ret != 0) { - dev_err(codec->dev, "Failed to create keyclick file: %d\n", + dev_err(component->dev, "Failed to create keyclick file: %d\n", ret); } } -static void cs42l52_free_beep(struct snd_soc_codec *codec) +static void cs42l52_free_beep(struct snd_soc_component *component) { - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); - device_remove_file(codec->dev, &dev_attr_beep); + device_remove_file(component->dev, &dev_attr_beep); cancel_work_sync(&cs42l52->beep_work); cs42l52->beep = NULL; - snd_soc_update_bits(codec, CS42L52_BEEP_TONE_CTL, + snd_soc_component_update_bits(component, CS42L52_BEEP_TONE_CTL, CS42L52_BEEP_EN_MASK, 0); } -static int cs42l52_probe(struct snd_soc_codec *codec) +static int cs42l52_probe(struct snd_soc_component *component) { - struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); + struct cs42l52_private *cs42l52 = snd_soc_component_get_drvdata(component); regcache_cache_only(cs42l52->regmap, true); - cs42l52_add_mic_controls(codec); + cs42l52_add_mic_controls(component); - cs42l52_init_beep(codec); + cs42l52_init_beep(component); cs42l52->sysclk = CS42L52_DEFAULT_CLK; cs42l52->config.format = CS42L52_DEFAULT_FORMAT; @@ -1043,27 +1043,26 @@ static int cs42l52_probe(struct snd_soc_codec *codec) return 0; } -static int cs42l52_remove(struct snd_soc_codec *codec) +static void cs42l52_remove(struct snd_soc_component *component) { - cs42l52_free_beep(codec); - - return 0; + cs42l52_free_beep(component); } -static const struct snd_soc_codec_driver soc_codec_dev_cs42l52 = { - .probe = cs42l52_probe, - .remove = cs42l52_remove, - .set_bias_level = cs42l52_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = cs42l52_snd_controls, - .num_controls = ARRAY_SIZE(cs42l52_snd_controls), - .dapm_widgets = cs42l52_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42l52_dapm_widgets), - .dapm_routes = cs42l52_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs42l52_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_cs42l52 = { + .probe = cs42l52_probe, + .remove = cs42l52_remove, + .set_bias_level = cs42l52_set_bias_level, + .controls = cs42l52_snd_controls, + .num_controls = ARRAY_SIZE(cs42l52_snd_controls), + .dapm_widgets = cs42l52_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42l52_dapm_widgets), + .dapm_routes = cs42l52_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs42l52_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* Current and threshold powerup sequence Pg37 */ @@ -1202,19 +1201,13 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, CS42L52_IFACE_CTL2_BIAS_LVL, cs42l52->pdata.micbias_lvl); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs42l52, &cs42l52_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs42l52, &cs42l52_dai, 1); if (ret < 0) return ret; return 0; } -static int cs42l52_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct of_device_id cs42l52_of_match[] = { { .compatible = "cirrus,cs42l52", }, {}, @@ -1235,7 +1228,6 @@ static struct i2c_driver cs42l52_i2c_driver = { }, .id_table = cs42l52_id, .probe = cs42l52_i2c_probe, - .remove = cs42l52_i2c_remove, }; module_i2c_driver(cs42l52_i2c_driver); diff --git a/sound/soc/codecs/cs42l56.c b/sound/soc/codecs/cs42l56.c index fd7b8d32c2b2..a5c8736fad77 100644 --- a/sound/soc/codecs/cs42l56.c +++ b/sound/soc/codecs/cs42l56.c @@ -45,7 +45,7 @@ static const char *const cs42l56_supply_names[CS42L56_NUM_SUPPLIES] = { struct cs42l56_private { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct device *dev; struct cs42l56_platform_data pdata; struct regulator_bulk_data supplies[CS42L56_NUM_SUPPLIES]; @@ -726,8 +726,8 @@ static int cs42l56_get_mclk_ratio(int mclk, int rate) static int cs42l56_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); switch (freq) { case CS42L56_MCLK_5P6448MHZ: @@ -753,10 +753,10 @@ static int cs42l56_set_sysclk(struct snd_soc_dai *codec_dai, } cs42l56->mclk = freq; - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_MCLK_PREDIV_MASK, cs42l56->mclk_prediv); - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_MCLK_DIV2_MASK, cs42l56->mclk_div2); @@ -765,8 +765,8 @@ static int cs42l56_set_sysclk(struct snd_soc_dai *codec_dai, static int cs42l56_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -803,22 +803,22 @@ static int cs42l56_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_MS_MODE_MASK, cs42l56->iface); - snd_soc_update_bits(codec, CS42L56_SERIAL_FMT, + snd_soc_component_update_bits(component, CS42L56_SERIAL_FMT, CS42L56_DIG_FMT_MASK, cs42l56->iface_fmt); - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_SCLK_INV_MASK, cs42l56->iface_inv); return 0; } static int cs42l56_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) { /* Hit the DSP Mixer first */ - snd_soc_update_bits(codec, CS42L56_DSP_MUTE_CTL, + snd_soc_component_update_bits(component, CS42L56_DSP_MUTE_CTL, CS42L56_ADCAMIX_MUTE_MASK | CS42L56_ADCBMIX_MUTE_MASK | CS42L56_PCMAMIX_MUTE_MASK | @@ -827,21 +827,21 @@ static int cs42l56_digital_mute(struct snd_soc_dai *dai, int mute) CS42L56_MSTA_MUTE_MASK, CS42L56_MUTE_ALL); /* Mute ADC's */ - snd_soc_update_bits(codec, CS42L56_MISC_ADC_CTL, + snd_soc_component_update_bits(component, CS42L56_MISC_ADC_CTL, CS42L56_ADCA_MUTE_MASK | CS42L56_ADCB_MUTE_MASK, CS42L56_MUTE_ALL); /* HP And LO */ - snd_soc_update_bits(codec, CS42L56_HPA_VOLUME, + snd_soc_component_update_bits(component, CS42L56_HPA_VOLUME, CS42L56_HP_MUTE_MASK, CS42L56_MUTE_ALL); - snd_soc_update_bits(codec, CS42L56_HPB_VOLUME, + snd_soc_component_update_bits(component, CS42L56_HPB_VOLUME, CS42L56_HP_MUTE_MASK, CS42L56_MUTE_ALL); - snd_soc_update_bits(codec, CS42L56_LOA_VOLUME, + snd_soc_component_update_bits(component, CS42L56_LOA_VOLUME, CS42L56_LO_MUTE_MASK, CS42L56_MUTE_ALL); - snd_soc_update_bits(codec, CS42L56_LOB_VOLUME, + snd_soc_component_update_bits(component, CS42L56_LOB_VOLUME, CS42L56_LO_MUTE_MASK, CS42L56_MUTE_ALL); } else { - snd_soc_update_bits(codec, CS42L56_DSP_MUTE_CTL, + snd_soc_component_update_bits(component, CS42L56_DSP_MUTE_CTL, CS42L56_ADCAMIX_MUTE_MASK | CS42L56_ADCBMIX_MUTE_MASK | CS42L56_PCMAMIX_MUTE_MASK | @@ -850,18 +850,18 @@ static int cs42l56_digital_mute(struct snd_soc_dai *dai, int mute) CS42L56_MSTA_MUTE_MASK, CS42L56_UNMUTE); - snd_soc_update_bits(codec, CS42L56_MISC_ADC_CTL, + snd_soc_component_update_bits(component, CS42L56_MISC_ADC_CTL, CS42L56_ADCA_MUTE_MASK | CS42L56_ADCB_MUTE_MASK, CS42L56_UNMUTE); - snd_soc_update_bits(codec, CS42L56_HPA_VOLUME, + snd_soc_component_update_bits(component, CS42L56_HPA_VOLUME, CS42L56_HP_MUTE_MASK, CS42L56_UNMUTE); - snd_soc_update_bits(codec, CS42L56_HPB_VOLUME, + snd_soc_component_update_bits(component, CS42L56_HPB_VOLUME, CS42L56_HP_MUTE_MASK, CS42L56_UNMUTE); - snd_soc_update_bits(codec, CS42L56_LOA_VOLUME, + snd_soc_component_update_bits(component, CS42L56_LOA_VOLUME, CS42L56_LO_MUTE_MASK, CS42L56_UNMUTE); - snd_soc_update_bits(codec, CS42L56_LOB_VOLUME, + snd_soc_component_update_bits(component, CS42L56_LOB_VOLUME, CS42L56_LO_MUTE_MASK, CS42L56_UNMUTE); } return 0; @@ -871,39 +871,39 @@ static int cs42l56_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); int ratio; ratio = cs42l56_get_mclk_ratio(cs42l56->mclk, params_rate(params)); if (ratio >= 0) { - snd_soc_update_bits(codec, CS42L56_CLKCTL_2, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_2, CS42L56_CLK_RATIO_MASK, ratio); } else { - dev_err(codec->dev, "unsupported mclk/sclk/lrclk ratio\n"); + dev_err(component->dev, "unsupported mclk/sclk/lrclk ratio\n"); return -EINVAL; } return 0; } -static int cs42l56_set_bias_level(struct snd_soc_codec *codec, +static int cs42l56_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); int ret; switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_MCLK_DIS_MASK, 0); - snd_soc_update_bits(codec, CS42L56_PWRCTL_1, + snd_soc_component_update_bits(component, CS42L56_PWRCTL_1, CS42L56_PDN_ALL_MASK, 0); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { regcache_cache_only(cs42l56->regmap, false); regcache_sync(cs42l56->regmap); ret = regulator_bulk_enable(ARRAY_SIZE(cs42l56->supplies), @@ -915,13 +915,13 @@ static int cs42l56_set_bias_level(struct snd_soc_codec *codec, return ret; } } - snd_soc_update_bits(codec, CS42L56_PWRCTL_1, + snd_soc_component_update_bits(component, CS42L56_PWRCTL_1, CS42L56_PDN_ALL_MASK, 1); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, CS42L56_PWRCTL_1, + snd_soc_component_update_bits(component, CS42L56_PWRCTL_1, CS42L56_PDN_ALL_MASK, 1); - snd_soc_update_bits(codec, CS42L56_CLKCTL_1, + snd_soc_component_update_bits(component, CS42L56_CLKCTL_1, CS42L56_MCLK_DIS_MASK, 1); regcache_cache_only(cs42l56->regmap, true); regulator_bulk_disable(ARRAY_SIZE(cs42l56->supplies), @@ -974,8 +974,8 @@ static void cs42l56_beep_work(struct work_struct *work) { struct cs42l56_private *cs42l56 = container_of(work, struct cs42l56_private, beep_work); - struct snd_soc_codec *codec = cs42l56->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = cs42l56->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int i; int val = 0; int best = 0; @@ -987,18 +987,18 @@ static void cs42l56_beep_work(struct work_struct *work) best = i; } - dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n", + dev_dbg(component->dev, "Set beep rate %dHz for requested %dHz\n", beep_freq[best], cs42l56->beep_rate); val = (best << CS42L56_BEEP_RATE_SHIFT); snd_soc_dapm_enable_pin(dapm, "Beep"); } else { - dev_dbg(codec->dev, "Disabling beep\n"); + dev_dbg(component->dev, "Disabling beep\n"); snd_soc_dapm_disable_pin(dapm, "Beep"); } - snd_soc_update_bits(codec, CS42L56_BEEP_FREQ_ONTIME, + snd_soc_component_update_bits(component, CS42L56_BEEP_FREQ_ONTIME, CS42L56_BEEP_FREQ_MASK, val); snd_soc_dapm_sync(dapm); @@ -1010,10 +1010,10 @@ static void cs42l56_beep_work(struct work_struct *work) static int cs42l56_beep_event(struct input_dev *dev, unsigned int type, unsigned int code, int hz) { - struct snd_soc_codec *codec = input_get_drvdata(dev); - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = input_get_drvdata(dev); + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "Beep event %x %x\n", code, hz); + dev_dbg(component->dev, "Beep event %x %x\n", code, hz); switch (code) { case SND_BELL: @@ -1050,14 +1050,14 @@ static ssize_t cs42l56_beep_set(struct device *dev, static DEVICE_ATTR(beep, 0200, NULL, cs42l56_beep_set); -static void cs42l56_init_beep(struct snd_soc_codec *codec) +static void cs42l56_init_beep(struct snd_soc_component *component) { - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); int ret; - cs42l56->beep = devm_input_allocate_device(codec->dev); + cs42l56->beep = devm_input_allocate_device(component->dev); if (!cs42l56->beep) { - dev_err(codec->dev, "Failed to allocate beep device\n"); + dev_err(component->dev, "Failed to allocate beep device\n"); return; } @@ -1065,68 +1065,67 @@ static void cs42l56_init_beep(struct snd_soc_codec *codec) cs42l56->beep_rate = 0; cs42l56->beep->name = "CS42L56 Beep Generator"; - cs42l56->beep->phys = dev_name(codec->dev); + cs42l56->beep->phys = dev_name(component->dev); cs42l56->beep->id.bustype = BUS_I2C; cs42l56->beep->evbit[0] = BIT_MASK(EV_SND); cs42l56->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); cs42l56->beep->event = cs42l56_beep_event; - cs42l56->beep->dev.parent = codec->dev; - input_set_drvdata(cs42l56->beep, codec); + cs42l56->beep->dev.parent = component->dev; + input_set_drvdata(cs42l56->beep, component); ret = input_register_device(cs42l56->beep); if (ret != 0) { cs42l56->beep = NULL; - dev_err(codec->dev, "Failed to register beep device\n"); + dev_err(component->dev, "Failed to register beep device\n"); } - ret = device_create_file(codec->dev, &dev_attr_beep); + ret = device_create_file(component->dev, &dev_attr_beep); if (ret != 0) { - dev_err(codec->dev, "Failed to create keyclick file: %d\n", + dev_err(component->dev, "Failed to create keyclick file: %d\n", ret); } } -static void cs42l56_free_beep(struct snd_soc_codec *codec) +static void cs42l56_free_beep(struct snd_soc_component *component) { - struct cs42l56_private *cs42l56 = snd_soc_codec_get_drvdata(codec); + struct cs42l56_private *cs42l56 = snd_soc_component_get_drvdata(component); - device_remove_file(codec->dev, &dev_attr_beep); + device_remove_file(component->dev, &dev_attr_beep); cancel_work_sync(&cs42l56->beep_work); cs42l56->beep = NULL; - snd_soc_update_bits(codec, CS42L56_BEEP_TONE_CFG, + snd_soc_component_update_bits(component, CS42L56_BEEP_TONE_CFG, CS42L56_BEEP_EN_MASK, 0); } -static int cs42l56_probe(struct snd_soc_codec *codec) +static int cs42l56_probe(struct snd_soc_component *component) { - cs42l56_init_beep(codec); + cs42l56_init_beep(component); return 0; } -static int cs42l56_remove(struct snd_soc_codec *codec) +static void cs42l56_remove(struct snd_soc_component *component) { - cs42l56_free_beep(codec); - - return 0; + cs42l56_free_beep(component); } -static const struct snd_soc_codec_driver soc_codec_dev_cs42l56 = { - .probe = cs42l56_probe, - .remove = cs42l56_remove, - .set_bias_level = cs42l56_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = cs42l56_snd_controls, - .num_controls = ARRAY_SIZE(cs42l56_snd_controls), - .dapm_widgets = cs42l56_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42l56_dapm_widgets), - .dapm_routes = cs42l56_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs42l56_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_cs42l56 = { + .probe = cs42l56_probe, + .remove = cs42l56_remove, + .set_bias_level = cs42l56_set_bias_level, + .controls = cs42l56_snd_controls, + .num_controls = ARRAY_SIZE(cs42l56_snd_controls), + .dapm_widgets = cs42l56_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42l56_dapm_widgets), + .dapm_routes = cs42l56_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs42l56_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs42l56_regmap = { @@ -1315,8 +1314,8 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client, CS42L56_ADAPT_PWR_MASK, cs42l56->pdata.adaptive_pwr); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs42l56, &cs42l56_dai, 1); + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs42l56, &cs42l56_dai, 1); if (ret < 0) return ret; @@ -1332,7 +1331,6 @@ static int cs42l56_i2c_remove(struct i2c_client *client) { struct cs42l56_private *cs42l56 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); regulator_bulk_disable(ARRAY_SIZE(cs42l56->supplies), cs42l56->supplies); return 0; diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index aebaa97490b6..36b57ee00a30 100644 --- a/sound/soc/codecs/cs42l73.c +++ b/sound/soc/codecs/cs42l73.c @@ -490,8 +490,8 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = { static int cs42l73_spklo_spk_amp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMD: /* 150 ms delay between setting PDN and MCLKDIS */ @@ -506,8 +506,8 @@ static int cs42l73_spklo_spk_amp_event(struct snd_soc_dapm_widget *w, static int cs42l73_ear_amp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMD: /* 50 ms delay between setting PDN and MCLKDIS */ @@ -524,8 +524,8 @@ static int cs42l73_ear_amp_event(struct snd_soc_dapm_widget *w, static int cs42l73_hp_amp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMD: /* 30 ms delay between setting PDN and MCLKDIS */ @@ -884,8 +884,8 @@ static int cs42l73_get_mclk_coeff(int mclk, int srate) static int cs42l73_set_mclk(struct snd_soc_dai *dai, unsigned int freq) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); int mclkx_coeff; u32 mclk = 0; @@ -899,14 +899,14 @@ static int cs42l73_set_mclk(struct snd_soc_dai *dai, unsigned int freq) mclk = cs42l73_mclkx_coeffs[mclkx_coeff].mclkx / cs42l73_mclkx_coeffs[mclkx_coeff].ratio; - dev_dbg(codec->dev, "MCLK%u %u <-> internal MCLK %u\n", + dev_dbg(component->dev, "MCLK%u %u <-> internal MCLK %u\n", priv->mclksel + 1, cs42l73_mclkx_coeffs[mclkx_coeff].mclkx, mclk); dmmcc = (priv->mclksel << 4) | (cs42l73_mclkx_coeffs[mclkx_coeff].mclkdiv << 1); - snd_soc_write(codec, CS42L73_DMMCC, dmmcc); + snd_soc_component_write(component, CS42L73_DMMCC, dmmcc); priv->sysclk = mclkx_coeff; priv->mclk = mclk; @@ -917,8 +917,8 @@ static int cs42l73_set_mclk(struct snd_soc_dai *dai, unsigned int freq) static int cs42l73_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); switch (clk_id) { case CS42L73_CLKID_MCLK1: @@ -930,7 +930,7 @@ static int cs42l73_set_sysclk(struct snd_soc_dai *dai, } if ((cs42l73_set_mclk(dai, freq)) < 0) { - dev_err(codec->dev, "Unable to set MCLK for dai %s\n", + dev_err(component->dev, "Unable to set MCLK for dai %s\n", dai->name); return -EINVAL; } @@ -942,14 +942,14 @@ static int cs42l73_set_sysclk(struct snd_soc_dai *dai, static int cs42l73_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); u8 id = codec_dai->id; unsigned int inv, format; u8 spc, mmcc; - spc = snd_soc_read(codec, CS42L73_SPC(id)); - mmcc = snd_soc_read(codec, CS42L73_MMCC(id)); + spc = snd_soc_component_read32(component, CS42L73_SPC(id)); + mmcc = snd_soc_component_read32(component, CS42L73_MMCC(id)); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -974,12 +974,12 @@ static int cs42l73_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_B: if (mmcc & CS42L73_MS_MASTER) { - dev_err(codec->dev, + dev_err(component->dev, "PCM format in slave mode only\n"); return -EINVAL; } if (id == CS42L73_ASP) { - dev_err(codec->dev, + dev_err(component->dev, "PCM format is not supported on ASP port\n"); return -EINVAL; } @@ -1029,7 +1029,7 @@ static unsigned int cs42l73_get_xspfs_coeff(u32 rate) return 0; /* 0 = Don't know */ } -static void cs42l73_update_asrc(struct snd_soc_codec *codec, int id, int srate) +static void cs42l73_update_asrc(struct snd_soc_component *component, int id, int srate) { u8 spfs = 0; @@ -1038,13 +1038,13 @@ static void cs42l73_update_asrc(struct snd_soc_codec *codec, int id, int srate) switch (id) { case CS42L73_XSP: - snd_soc_update_bits(codec, CS42L73_VXSPFS, 0x0f, spfs); + snd_soc_component_update_bits(component, CS42L73_VXSPFS, 0x0f, spfs); break; case CS42L73_ASP: - snd_soc_update_bits(codec, CS42L73_ASPC, 0x3c, spfs << 2); + snd_soc_component_update_bits(component, CS42L73_ASPC, 0x3c, spfs << 2); break; case CS42L73_VSP: - snd_soc_update_bits(codec, CS42L73_VXSPFS, 0xf0, spfs << 4); + snd_soc_component_update_bits(component, CS42L73_VXSPFS, 0xf0, spfs << 4); break; default: break; @@ -1055,8 +1055,8 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42l73_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42l73_private *priv = snd_soc_component_get_drvdata(component); int id = dai->id; int mclk_coeff; int srate = params_rate(params); @@ -1070,7 +1070,7 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, if (mclk_coeff < 0) return -EINVAL; - dev_dbg(codec->dev, + dev_dbg(component->dev, "DAI[%d]: MCLK %u, srate %u, MMCC[5:0] = %x\n", id, priv->mclk, srate, cs42l73_mclk_coeffs[mclk_coeff].mmcc); @@ -1091,38 +1091,38 @@ static int cs42l73_pcm_hw_params(struct snd_pcm_substream *substream, /* Update ASRCs */ priv->config[id].srate = srate; - snd_soc_write(codec, CS42L73_SPC(id), priv->config[id].spc); - snd_soc_write(codec, CS42L73_MMCC(id), priv->config[id].mmcc); + snd_soc_component_write(component, CS42L73_SPC(id), priv->config[id].spc); + snd_soc_component_write(component, CS42L73_MMCC(id), priv->config[id].mmcc); - cs42l73_update_asrc(codec, id, srate); + cs42l73_update_asrc(component, id, srate); return 0; } -static int cs42l73_set_bias_level(struct snd_soc_codec *codec, +static int cs42l73_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct cs42l73_private *cs42l73 = snd_soc_codec_get_drvdata(codec); + struct cs42l73_private *cs42l73 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: - snd_soc_update_bits(codec, CS42L73_DMMCC, CS42L73_MCLKDIS, 0); - snd_soc_update_bits(codec, CS42L73_PWRCTL1, CS42L73_PDN, 0); + snd_soc_component_update_bits(component, CS42L73_DMMCC, CS42L73_MCLKDIS, 0); + snd_soc_component_update_bits(component, CS42L73_PWRCTL1, CS42L73_PDN, 0); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { regcache_cache_only(cs42l73->regmap, false); regcache_sync(cs42l73->regmap); } - snd_soc_update_bits(codec, CS42L73_PWRCTL1, CS42L73_PDN, 1); + snd_soc_component_update_bits(component, CS42L73_PWRCTL1, CS42L73_PDN, 1); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, CS42L73_PWRCTL1, CS42L73_PDN, 1); + snd_soc_component_update_bits(component, CS42L73_PWRCTL1, CS42L73_PDN, 1); if (cs42l73->shutdwn_delay > 0) { mdelay(cs42l73->shutdwn_delay); cs42l73->shutdwn_delay = 0; @@ -1131,7 +1131,7 @@ static int cs42l73_set_bias_level(struct snd_soc_codec *codec, * down. */ } - snd_soc_update_bits(codec, CS42L73_DMMCC, CS42L73_MCLKDIS, 1); + snd_soc_component_update_bits(component, CS42L73_DMMCC, CS42L73_MCLKDIS, 1); break; } return 0; @@ -1139,10 +1139,10 @@ static int cs42l73_set_bias_level(struct snd_soc_codec *codec, static int cs42l73_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int id = dai->id; - return snd_soc_update_bits(codec, CS42L73_SPC(id), CS42L73_SP_3ST, + return snd_soc_component_update_bits(component, CS42L73_SPC(id), CS42L73_SP_3ST, tristate << 7); } @@ -1235,13 +1235,13 @@ static struct snd_soc_dai_driver cs42l73_dai[] = { } }; -static int cs42l73_probe(struct snd_soc_codec *codec) +static int cs42l73_probe(struct snd_soc_component *component) { - struct cs42l73_private *cs42l73 = snd_soc_codec_get_drvdata(codec); + struct cs42l73_private *cs42l73 = snd_soc_component_get_drvdata(component); /* Set Charge Pump Frequency */ if (cs42l73->pdata.chgfreq) - snd_soc_update_bits(codec, CS42L73_CPFCHC, + snd_soc_component_update_bits(component, CS42L73_CPFCHC, CS42L73_CHARGEPUMP_MASK, cs42l73->pdata.chgfreq << 4); @@ -1252,19 +1252,20 @@ static int cs42l73_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_cs42l73 = { - .probe = cs42l73_probe, - .set_bias_level = cs42l73_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = cs42l73_snd_controls, - .num_controls = ARRAY_SIZE(cs42l73_snd_controls), - .dapm_widgets = cs42l73_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42l73_dapm_widgets), - .dapm_routes = cs42l73_audio_map, - .num_dapm_routes = ARRAY_SIZE(cs42l73_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_cs42l73 = { + .probe = cs42l73_probe, + .set_bias_level = cs42l73_set_bias_level, + .controls = cs42l73_snd_controls, + .num_controls = ARRAY_SIZE(cs42l73_snd_controls), + .dapm_widgets = cs42l73_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42l73_dapm_widgets), + .dapm_routes = cs42l73_audio_map, + .num_dapm_routes = ARRAY_SIZE(cs42l73_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs42l73_regmap = { @@ -1361,20 +1362,14 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client, dev_info(&i2c_client->dev, "Cirrus Logic CS42L73, Revision: %02X\n", reg & 0xFF); - ret = snd_soc_register_codec(&i2c_client->dev, - &soc_codec_dev_cs42l73, cs42l73_dai, + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs42l73, cs42l73_dai, ARRAY_SIZE(cs42l73_dai)); if (ret < 0) return ret; return 0; } -static int cs42l73_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct of_device_id cs42l73_of_match[] = { { .compatible = "cirrus,cs42l73", }, {}, @@ -1395,7 +1390,6 @@ static struct i2c_driver cs42l73_i2c_driver = { }, .id_table = cs42l73_id, .probe = cs42l73_i2c_probe, - .remove = cs42l73_i2c_remove, }; diff --git a/sound/soc/codecs/cs42xx8-i2c.c b/sound/soc/codecs/cs42xx8-i2c.c index 800c1d549347..0214e3ab9da0 100644 --- a/sound/soc/codecs/cs42xx8-i2c.c +++ b/sound/soc/codecs/cs42xx8-i2c.c @@ -33,7 +33,6 @@ static int cs42xx8_i2c_probe(struct i2c_client *i2c, static int cs42xx8_i2c_remove(struct i2c_client *i2c) { - snd_soc_unregister_codec(&i2c->dev); pm_runtime_disable(&i2c->dev); return 0; diff --git a/sound/soc/codecs/cs42xx8.c b/sound/soc/codecs/cs42xx8.c index c1785bd4ff19..ebb9e0cf8364 100644 --- a/sound/soc/codecs/cs42xx8.c +++ b/sound/soc/codecs/cs42xx8.c @@ -194,8 +194,8 @@ static const struct cs42xx8_ratios cs42xx8_ratios[] = { static int cs42xx8_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42xx8_priv *cs42xx8 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42xx8_priv *cs42xx8 = snd_soc_component_get_drvdata(component); cs42xx8->sysclk = freq; @@ -205,8 +205,8 @@ static int cs42xx8_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int cs42xx8_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs42xx8_priv *cs42xx8 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs42xx8_priv *cs42xx8 = snd_soc_component_get_drvdata(component); u32 val; /* Set DAI format */ @@ -224,7 +224,7 @@ static int cs42xx8_set_dai_fmt(struct snd_soc_dai *codec_dai, val = CS42XX8_INTF_DAC_DIF_TDM | CS42XX8_INTF_ADC_DIF_TDM; break; default: - dev_err(codec->dev, "unsupported dai format\n"); + dev_err(component->dev, "unsupported dai format\n"); return -EINVAL; } @@ -241,7 +241,7 @@ static int cs42xx8_set_dai_fmt(struct snd_soc_dai *codec_dai, cs42xx8->slave_mode = false; break; default: - dev_err(codec->dev, "unsupported master/slave mode\n"); + dev_err(component->dev, "unsupported master/slave mode\n"); return -EINVAL; } @@ -252,8 +252,8 @@ static int cs42xx8_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs42xx8_priv *cs42xx8 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42xx8_priv *cs42xx8 = snd_soc_component_get_drvdata(component); bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; u32 ratio = cs42xx8->sysclk / params_rate(params); u32 i, fm, val, mask; @@ -267,7 +267,7 @@ static int cs42xx8_hw_params(struct snd_pcm_substream *substream, } if (i == ARRAY_SIZE(cs42xx8_ratios)) { - dev_err(codec->dev, "unsupported sysclk ratio\n"); + dev_err(component->dev, "unsupported sysclk ratio\n"); return -EINVAL; } @@ -285,8 +285,8 @@ static int cs42xx8_hw_params(struct snd_pcm_substream *substream, static int cs42xx8_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct cs42xx8_priv *cs42xx8 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs42xx8_priv *cs42xx8 = snd_soc_component_get_drvdata(component); u8 dac_unmute = cs42xx8->tx_channels ? ~((0x1 << cs42xx8->tx_channels) - 1) : 0; @@ -382,14 +382,14 @@ const struct regmap_config cs42xx8_regmap_config = { }; EXPORT_SYMBOL_GPL(cs42xx8_regmap_config); -static int cs42xx8_codec_probe(struct snd_soc_codec *codec) +static int cs42xx8_component_probe(struct snd_soc_component *component) { - struct cs42xx8_priv *cs42xx8 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct cs42xx8_priv *cs42xx8 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); switch (cs42xx8->drvdata->num_adcs) { case 3: - snd_soc_add_codec_controls(codec, cs42xx8_adc3_snd_controls, + snd_soc_add_component_controls(component, cs42xx8_adc3_snd_controls, ARRAY_SIZE(cs42xx8_adc3_snd_controls)); snd_soc_dapm_new_controls(dapm, cs42xx8_adc3_dapm_widgets, ARRAY_SIZE(cs42xx8_adc3_dapm_widgets)); @@ -406,18 +406,17 @@ static int cs42xx8_codec_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver cs42xx8_driver = { - .probe = cs42xx8_codec_probe, - .idle_bias_off = true, - - .component_driver = { - .controls = cs42xx8_snd_controls, - .num_controls = ARRAY_SIZE(cs42xx8_snd_controls), - .dapm_widgets = cs42xx8_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs42xx8_dapm_widgets), - .dapm_routes = cs42xx8_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(cs42xx8_dapm_routes), - }, +static const struct snd_soc_component_driver cs42xx8_driver = { + .probe = cs42xx8_component_probe, + .controls = cs42xx8_snd_controls, + .num_controls = ARRAY_SIZE(cs42xx8_snd_controls), + .dapm_widgets = cs42xx8_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs42xx8_dapm_widgets), + .dapm_routes = cs42xx8_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(cs42xx8_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; const struct cs42xx8_driver_data cs42448_data = { @@ -520,9 +519,9 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap) /* Each adc supports stereo input */ cs42xx8_dai.capture.channels_max = cs42xx8->drvdata->num_adcs * 2; - ret = snd_soc_register_codec(dev, &cs42xx8_driver, &cs42xx8_dai, 1); + ret = devm_snd_soc_register_component(dev, &cs42xx8_driver, &cs42xx8_dai, 1); if (ret) { - dev_err(dev, "failed to register codec:%d\n", ret); + dev_err(dev, "failed to register component:%d\n", ret); goto err_enable; } diff --git a/sound/soc/codecs/cs43130.c b/sound/soc/codecs/cs43130.c index 5ba0edc19df4..feca0a672976 100644 --- a/sound/soc/codecs/cs43130.c +++ b/sound/soc/codecs/cs43130.c @@ -236,12 +236,12 @@ static const struct cs43130_pll_params *cs43130_get_pll_table( return NULL; } -static int cs43130_pll_config(struct snd_soc_codec *codec) +static int cs43130_pll_config(struct snd_soc_component *component) { - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); const struct cs43130_pll_params *pll_entry; - dev_dbg(codec->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n", + dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n", cs43130->mclk, cs43130->mclk_int); pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int); @@ -286,11 +286,11 @@ static int cs43130_pll_config(struct snd_soc_codec *codec) return 0; } -static int cs43130_set_pll(struct snd_soc_codec *codec, int pll_id, int source, +static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { int ret = 0; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (freq_in) { case 9600000: @@ -306,7 +306,7 @@ static int cs43130_set_pll(struct snd_soc_codec *codec, int pll_id, int source, cs43130->mclk = freq_in; break; default: - dev_err(codec->dev, + dev_err(component->dev, "unsupported pll input reference clock:%d\n", freq_in); return -EINVAL; } @@ -319,21 +319,21 @@ static int cs43130_set_pll(struct snd_soc_codec *codec, int pll_id, int source, cs43130->mclk_int = freq_out; break; default: - dev_err(codec->dev, + dev_err(component->dev, "unsupported pll output ref clock: %u\n", freq_out); return -EINVAL; } - ret = cs43130_pll_config(codec); - dev_dbg(codec->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass); + ret = cs43130_pll_config(component); + dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass); return ret; } -static int cs43130_change_clksrc(struct snd_soc_codec *codec, +static int cs43130_change_clksrc(struct snd_soc_component *component, enum cs43130_mclk_src_sel src) { int ret; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); int mclk_int_decoded; if (src == cs43130->mclk_int_src) { @@ -349,7 +349,7 @@ static int cs43130_change_clksrc(struct snd_soc_codec *codec, mclk_int_decoded = CS43130_MCLK_24P5; break; default: - dev_err(codec->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int); + dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int); return -EINVAL; } @@ -373,7 +373,7 @@ static int cs43130_change_clksrc(struct snd_soc_codec *codec, CS43130_XTAL_RDY_INT_MASK, 1 << CS43130_XTAL_RDY_INT_SHIFT); if (ret == 0) { - dev_err(codec->dev, "Timeout waiting for XTAL_READY interrupt\n"); + dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n"); return -ETIMEDOUT; } } @@ -409,7 +409,7 @@ static int cs43130_change_clksrc(struct snd_soc_codec *codec, CS43130_XTAL_RDY_INT_MASK, 1 << CS43130_XTAL_RDY_INT_SHIFT); if (ret == 0) { - dev_err(codec->dev, "Timeout waiting for XTAL_READY interrupt\n"); + dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n"); return -ETIMEDOUT; } } @@ -425,7 +425,7 @@ static int cs43130_change_clksrc(struct snd_soc_codec *codec, CS43130_PLL_RDY_INT_MASK, 1 << CS43130_PLL_RDY_INT_SHIFT); if (ret == 0) { - dev_err(codec->dev, "Timeout waiting for PLL_READY interrupt\n"); + dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n"); return -ETIMEDOUT; } @@ -456,7 +456,7 @@ static int cs43130_change_clksrc(struct snd_soc_codec *codec, 1 << CS43130_PDN_PLL_SHIFT); break; default: - dev_err(codec->dev, "Invalid MCLK source value\n"); + dev_err(component->dev, "Invalid MCLK source value\n"); return -EINVAL; } @@ -774,8 +774,8 @@ static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); unsigned int required_clk; u8 dsd_speed; @@ -787,11 +787,11 @@ static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream, else required_clk = CS43130_MCLK_24M; - cs43130_set_pll(codec, 0, 0, cs43130->mclk, required_clk); + cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk); if (cs43130->pll_bypass) - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); else - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); } cs43130->clk_req++; @@ -807,7 +807,7 @@ static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream, dsd_speed = 1; break; default: - dev_err(codec->dev, "Rate(%u) not supported\n", + dev_err(component->dev, "Rate(%u) not supported\n", params_rate(params)); return -EINVAL; } @@ -833,8 +833,8 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); const struct cs43130_rate_map *rate_map; unsigned int sclk = cs43130->dais[dai->id].sclk; unsigned int bitwidth_sclk; @@ -850,11 +850,11 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, else required_clk = CS43130_MCLK_24M; - cs43130_set_pll(codec, 0, 0, cs43130->mclk, required_clk); + cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk); if (cs43130->pll_bypass) - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); else - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); } cs43130->clk_req++; @@ -878,7 +878,7 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, dsd_speed = 1; break; default: - dev_err(codec->dev, "Rate(%u) not supported\n", + dev_err(component->dev, "Rate(%u) not supported\n", params_rate(params)); return -EINVAL; } @@ -895,7 +895,7 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val); break; default: - dev_err(codec->dev, "Invalid DAI (%d)\n", dai->id); + dev_err(component->dev, "Invalid DAI (%d)\n", dai->id); return -EINVAL; } @@ -919,21 +919,21 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, if (!sclk) { /* at this point, SCLK must be set */ - dev_err(codec->dev, "SCLK freq is not set\n"); + dev_err(component->dev, "SCLK freq is not set\n"); return -EINVAL; } bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params); if (bitwidth_sclk < bitwidth_dai) { - dev_err(codec->dev, "Format not supported: SCLK freq is too low\n"); + dev_err(component->dev, "Format not supported: SCLK freq is too low\n"); return -EINVAL; } - dev_dbg(codec->dev, + dev_dbg(component->dev, "sclk = %u, fs = %d, bitwidth_dai = %u\n", sclk, params_rate(params), bitwidth_dai); - dev_dbg(codec->dev, + dev_dbg(component->dev, "bitwidth_sclk = %u, num_ch = %u\n", bitwidth_sclk, params_channels(params)); @@ -946,14 +946,14 @@ static int cs43130_hw_params(struct snd_pcm_substream *substream, static int cs43130_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); mutex_lock(&cs43130->clk_mutex); cs43130->clk_req--; if (!cs43130->clk_req) { /* no DAI is currently using clk */ - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_RCO); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO); cs43130_pcm_dsd_mix(false, cs43130->regmap); } mutex_unlock(&cs43130->clk_mutex); @@ -1023,8 +1023,8 @@ static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol, { struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int *item = ucontrol->value.enumerated.item; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); unsigned int val; if (item[0] >= e->items) @@ -1144,8 +1144,8 @@ static const struct reg_sequence unmute_seq[] = { static int cs43130_dsd_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -1192,7 +1192,7 @@ static int cs43130_dsd_event(struct snd_soc_dapm_widget *w, } break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); return -EINVAL; } return 0; @@ -1201,8 +1201,8 @@ static int cs43130_dsd_event(struct snd_soc_dapm_widget *w, static int cs43130_pcm_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -1249,7 +1249,7 @@ static int cs43130_pcm_event(struct snd_soc_dapm_widget *w, } break; default: - dev_err(codec->dev, "Invalid event = 0x%x\n", event); + dev_err(component->dev, "Invalid event = 0x%x\n", event); return -EINVAL; } return 0; @@ -1270,8 +1270,8 @@ static const struct reg_sequence dac_postpmd_seq[] = { static int cs43130_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -1325,7 +1325,7 @@ static int cs43130_dac_event(struct snd_soc_dapm_widget *w, } break; default: - dev_err(codec->dev, "Invalid DAC event = 0x%x\n", event); + dev_err(component->dev, "Invalid DAC event = 0x%x\n", event); return -EINVAL; } return 0; @@ -1350,8 +1350,8 @@ static const struct reg_sequence hpin_postpmu_seq[] = { static int cs43130_hpin_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMD: @@ -1363,7 +1363,7 @@ static int cs43130_hpin_event(struct snd_soc_dapm_widget *w, ARRAY_SIZE(hpin_postpmu_seq)); break; default: - dev_err(codec->dev, "Invalid HPIN event = 0x%x\n", event); + dev_err(component->dev, "Invalid HPIN event = 0x%x\n", event); return -EINVAL; } return 0; @@ -1471,8 +1471,8 @@ static int cs43130_dop_startup(struct snd_pcm_substream *substream, static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: @@ -1482,7 +1482,7 @@ static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM; break; default: - dev_err(codec->dev, "unsupported mode\n"); + dev_err(component->dev, "unsupported mode\n"); return -EINVAL; } @@ -1500,12 +1500,12 @@ static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B; break; default: - dev_err(codec->dev, + dev_err(component->dev, "unsupported audio format\n"); return -EINVAL; } - dev_dbg(codec->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n", + dev_dbg(component->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n", codec_dai->id, cs43130->dais[codec_dai->id].dai_mode, cs43130->dais[codec_dai->id].dai_format); @@ -1515,8 +1515,8 @@ static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: @@ -1526,11 +1526,11 @@ static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM; break; default: - dev_err(codec->dev, "Unsupported DAI format.\n"); + dev_err(component->dev, "Unsupported DAI format.\n"); return -EINVAL; } - dev_dbg(codec->dev, "dai_mode = 0x%x\n", + dev_dbg(component->dev, "dai_mode = 0x%x\n", cs43130->dais[codec_dai->id].dai_mode); return 0; @@ -1539,11 +1539,11 @@ static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); cs43130->dais[codec_dai->id].sclk = freq; - dev_dbg(codec->dev, "dai_id = %d, sclk = %u\n", codec_dai->id, + dev_dbg(component->dev, "dai_id = %d, sclk = %u\n", codec_dai->id, cs43130->dais[codec_dai->id].sclk); return 0; @@ -1627,13 +1627,13 @@ static struct snd_soc_dai_driver cs43130_dai[] = { }; -static int cs43130_codec_set_sysclk(struct snd_soc_codec *codec, +static int cs43130_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n", + dev_dbg(component->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n", clk_id, source, freq, dir); switch (freq) { @@ -1642,14 +1642,14 @@ static int cs43130_codec_set_sysclk(struct snd_soc_codec *codec, cs43130->mclk = freq; break; default: - dev_err(codec->dev, "Invalid MCLK INT freq: %u\n", freq); + dev_err(component->dev, "Invalid MCLK INT freq: %u\n", freq); return -EINVAL; } if (source == CS43130_MCLK_SRC_EXT) { cs43130->pll_bypass = true; } else { - dev_err(codec->dev, "Invalid MCLK source\n"); + dev_err(component->dev, "Invalid MCLK source\n"); return -EINVAL; } @@ -1929,7 +1929,7 @@ static int cs43130_update_hpload(unsigned int msk, int ac_idx, unsigned int reg; u32 addr; u16 impedance; - struct snd_soc_codec *codec = cs43130->codec; + struct snd_soc_component *component = cs43130->component; switch (msk) { case CS43130_HPLOAD_DC_INT: @@ -1959,7 +1959,7 @@ static int cs43130_update_hpload(unsigned int msk, int ac_idx, else cs43130->hpload_dc[HP_RIGHT] = impedance; - dev_dbg(codec->dev, "HP DC impedance (Ch %u): %u\n", !left_ch, + dev_dbg(component->dev, "HP DC impedance (Ch %u): %u\n", !left_ch, impedance); } else { if (left_ch) @@ -1967,7 +1967,7 @@ static int cs43130_update_hpload(unsigned int msk, int ac_idx, else cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance; - dev_dbg(codec->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n", + dev_dbg(component->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n", cs43130->ac_freq[ac_idx], !left_ch, impedance); } @@ -1981,7 +1981,7 @@ static int cs43130_hpload_proc(struct cs43130_private *cs43130, int ret; unsigned int msk; u16 ac_reg_val; - struct snd_soc_codec *codec = cs43130->codec; + struct snd_soc_component *component = cs43130->component; reinit_completion(&cs43130->hpload_evt); @@ -2004,17 +2004,17 @@ static int cs43130_hpload_proc(struct cs43130_private *cs43130, msecs_to_jiffies(1000)); regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk); if (!ret) { - dev_err(codec->dev, "Timeout waiting for HPLOAD interrupt\n"); + dev_err(component->dev, "Timeout waiting for HPLOAD interrupt\n"); return -1; } - dev_dbg(codec->dev, "HP load stat: %x, INT_MASK_4: %x\n", + dev_dbg(component->dev, "HP load stat: %x, INT_MASK_4: %x\n", cs43130->hpload_stat, msk); if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT | CS43130_HPLOAD_UNPLUG_INT | CS43130_HPLOAD_OOR_INT)) || !(cs43130->hpload_stat & rslt_msk)) { - dev_dbg(codec->dev, "HP load measure failed\n"); + dev_dbg(component->dev, "HP load measure failed\n"); return -1; } @@ -2056,11 +2056,11 @@ static void cs43130_imp_meas(struct work_struct *wk) unsigned int reg, seq_size; int i, ret, ac_idx; struct cs43130_private *cs43130; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct reg_sequences *hpload_seq; cs43130 = container_of(wk, struct cs43130_private, work); - codec = cs43130->codec; + component = cs43130->component; if (!cs43130->mclk) return; @@ -2070,11 +2070,11 @@ static void cs43130_imp_meas(struct work_struct *wk) mutex_lock(&cs43130->clk_mutex); if (!cs43130->clk_req) { /* clk not in use */ - cs43130_set_pll(codec, 0, 0, cs43130->mclk, CS43130_MCLK_22M); + cs43130_set_pll(component, 0, 0, cs43130->mclk, CS43130_MCLK_22M); if (cs43130->pll_bypass) - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_EXT); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); else - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_PLL); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); } cs43130->clk_req++; @@ -2125,9 +2125,9 @@ static void cs43130_imp_meas(struct work_struct *wk) snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE, CS43130_JACK_MASK); - dev_dbg(codec->dev, "Set HP output control. DC threshold\n"); + dev_dbg(component->dev, "Set HP output control. DC threshold\n"); for (i = 0; i < CS43130_DC_THRESHOLD; i++) - dev_dbg(codec->dev, "DC threshold[%d]: %u.\n", i, + dev_dbg(component->dev, "DC threshold[%d]: %u.\n", i, cs43130->dc_threshold[i]); cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT], @@ -2154,14 +2154,14 @@ exit: cs43130->clk_req--; /* clk not in use */ if (!cs43130->clk_req) - cs43130_change_clksrc(codec, CS43130_MCLK_SRC_RCO); + cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO); mutex_unlock(&cs43130->clk_mutex); } static irqreturn_t cs43130_irq_thread(int irq, void *data) { struct cs43130_private *cs43130 = (struct cs43130_private *)data; - struct snd_soc_codec *codec = cs43130->codec; + struct snd_soc_component *component = cs43130->component; unsigned int stickies[CS43130_NUM_INT]; unsigned int irq_occurrence = 0; unsigned int masks[CS43130_NUM_INT]; @@ -2179,7 +2179,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) for (j = 0; j < 8; j++) irq_occurrence += (stickies[i] >> j) & 1; } - dev_dbg(codec->dev, "number of interrupts occurred (%u)\n", + dev_dbg(component->dev, "number of interrupts occurred (%u)\n", irq_occurrence); if (!irq_occurrence) @@ -2197,7 +2197,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) { cs43130->hpload_stat = stickies[3]; - dev_err(codec->dev, + dev_err(component->dev, "DC load has not completed before AC load (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); @@ -2206,7 +2206,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) { cs43130->hpload_stat = stickies[3]; - dev_err(codec->dev, "HP unplugged during measurement (%x)\n", + dev_err(component->dev, "HP unplugged during measurement (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; @@ -2214,7 +2214,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_OOR_INT) { cs43130->hpload_stat = stickies[3]; - dev_err(codec->dev, "HP load out of range (%x)\n", + dev_err(component->dev, "HP load out of range (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; @@ -2222,7 +2222,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_AC_INT) { cs43130->hpload_stat = stickies[3]; - dev_dbg(codec->dev, "HP AC load measurement done (%x)\n", + dev_dbg(component->dev, "HP AC load measurement done (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; @@ -2230,7 +2230,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_DC_INT) { cs43130->hpload_stat = stickies[3]; - dev_dbg(codec->dev, "HP DC load measurement done (%x)\n", + dev_dbg(component->dev, "HP DC load measurement done (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; @@ -2238,7 +2238,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_ON_INT) { cs43130->hpload_stat = stickies[3]; - dev_dbg(codec->dev, "HP load state machine on done (%x)\n", + dev_dbg(component->dev, "HP load state machine on done (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; @@ -2246,19 +2246,19 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[3] & CS43130_HPLOAD_OFF_INT) { cs43130->hpload_stat = stickies[3]; - dev_dbg(codec->dev, "HP load state machine off done (%x)\n", + dev_dbg(component->dev, "HP load state machine off done (%x)\n", cs43130->hpload_stat); complete(&cs43130->hpload_evt); return IRQ_HANDLED; } if (stickies[0] & CS43130_XTAL_ERR_INT) { - dev_err(codec->dev, "Crystal err: clock is not running\n"); + dev_err(component->dev, "Crystal err: clock is not running\n"); return IRQ_HANDLED; } if (stickies[0] & CS43130_HP_UNPLUG_INT) { - dev_dbg(codec->dev, "HP unplugged\n"); + dev_dbg(component->dev, "HP unplugged\n"); cs43130->hpload_done = false; snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK); return IRQ_HANDLED; @@ -2267,7 +2267,7 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) if (stickies[0] & CS43130_HP_PLUG_INT) { if (cs43130->dc_meas && !cs43130->hpload_done && !work_busy(&cs43130->work)) { - dev_dbg(codec->dev, "HP load queue work\n"); + dev_dbg(component->dev, "HP load queue work\n"); queue_work(cs43130->wq, &cs43130->work); } @@ -2279,14 +2279,14 @@ static irqreturn_t cs43130_irq_thread(int irq, void *data) return IRQ_NONE; } -static int cs43130_probe(struct snd_soc_codec *codec) +static int cs43130_probe(struct snd_soc_component *component) { int ret; - struct cs43130_private *cs43130 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_card *card = codec->component.card; + struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); + struct snd_soc_card *card = component->card; unsigned int reg; - cs43130->codec = codec; + cs43130->component = component; if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) { regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET, @@ -2299,25 +2299,25 @@ static int cs43130_probe(struct snd_soc_codec *codec) ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK, &cs43130->jack, NULL, 0); if (ret < 0) { - dev_err(codec->dev, "Cannot create jack\n"); + dev_err(component->dev, "Cannot create jack\n"); return ret; } cs43130->hpload_done = false; if (cs43130->dc_meas) { - ret = device_create_file(codec->dev, &dev_attr_hpload_dc_l); + ret = device_create_file(component->dev, &dev_attr_hpload_dc_l); if (ret < 0) return ret; - ret = device_create_file(codec->dev, &dev_attr_hpload_dc_r); + ret = device_create_file(component->dev, &dev_attr_hpload_dc_r); if (ret < 0) return ret; - ret = device_create_file(codec->dev, &dev_attr_hpload_ac_l); + ret = device_create_file(component->dev, &dev_attr_hpload_ac_l); if (ret < 0) return ret; - ret = device_create_file(codec->dev, &dev_attr_hpload_ac_r); + ret = device_create_file(component->dev, &dev_attr_hpload_ac_r); if (ret < 0) return ret; @@ -2338,14 +2338,16 @@ static int cs43130_probe(struct snd_soc_codec *codec) return 0; } -static struct snd_soc_codec_driver soc_codec_dev_cs43130 = { +static struct snd_soc_component_driver soc_component_dev_cs43130 = { .probe = cs43130_probe, - .component_driver = { - .controls = cs43130_snd_controls, - .num_controls = ARRAY_SIZE(cs43130_snd_controls), - }, - .set_sysclk = cs43130_codec_set_sysclk, + .controls = cs43130_snd_controls, + .num_controls = ARRAY_SIZE(cs43130_snd_controls), + .set_sysclk = cs43130_component_set_sysclk, .set_pll = cs43130_set_pll, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs43130_regmap = { @@ -2536,33 +2538,34 @@ static int cs43130_i2c_probe(struct i2c_client *client, memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes), analog_hp_routes, sizeof(analog_hp_routes)); - soc_codec_dev_cs43130.component_driver.dapm_widgets = + soc_component_dev_cs43130.dapm_widgets = all_hp_widgets; - soc_codec_dev_cs43130.component_driver.num_dapm_widgets = + soc_component_dev_cs43130.num_dapm_widgets = ARRAY_SIZE(all_hp_widgets); - soc_codec_dev_cs43130.component_driver.dapm_routes = + soc_component_dev_cs43130.dapm_routes = all_hp_routes; - soc_codec_dev_cs43130.component_driver.num_dapm_routes = + soc_component_dev_cs43130.num_dapm_routes = ARRAY_SIZE(all_hp_routes); break; case CS43198_CHIP_ID: case CS4399_CHIP_ID: - soc_codec_dev_cs43130.component_driver.dapm_widgets = + soc_component_dev_cs43130.dapm_widgets = digital_hp_widgets; - soc_codec_dev_cs43130.component_driver.num_dapm_widgets = + soc_component_dev_cs43130.num_dapm_widgets = ARRAY_SIZE(digital_hp_widgets); - soc_codec_dev_cs43130.component_driver.dapm_routes = + soc_component_dev_cs43130.dapm_routes = digital_hp_routes; - soc_codec_dev_cs43130.component_driver.num_dapm_routes = + soc_component_dev_cs43130.num_dapm_routes = ARRAY_SIZE(digital_hp_routes); break; } - ret = snd_soc_register_codec(&client->dev, &soc_codec_dev_cs43130, + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_dev_cs43130, cs43130_dai, ARRAY_SIZE(cs43130_dai)); if (ret < 0) { dev_err(&client->dev, - "snd_soc_register_codec failed with ret = %d\n", ret); + "snd_soc_register_component failed with ret = %d\n", ret); goto err; } @@ -2604,8 +2607,6 @@ static int cs43130_i2c_remove(struct i2c_client *client) pm_runtime_disable(&client->dev); regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies); - snd_soc_unregister_codec(&client->dev); - return 0; } diff --git a/sound/soc/codecs/cs43130.h b/sound/soc/codecs/cs43130.h index 781258418d89..c3c6eef61e87 100644 --- a/sound/soc/codecs/cs43130.h +++ b/sound/soc/codecs/cs43130.h @@ -508,7 +508,7 @@ struct cs43130_dai { }; struct cs43130_private { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regmap *regmap; struct regulator_bulk_data supplies[CS43130_NUM_SUPPLIES]; struct gpio_desc *reset_gpio; diff --git a/sound/soc/codecs/cs4349.c b/sound/soc/codecs/cs4349.c index 0a749c79ef57..bee0e343723f 100644 --- a/sound/soc/codecs/cs4349.c +++ b/sound/soc/codecs/cs4349.c @@ -74,8 +74,8 @@ static bool cs4349_writeable_register(struct device *dev, unsigned int reg) static int cs4349_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct cs4349_private *cs4349 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct cs4349_private *cs4349 = snd_soc_component_get_drvdata(component); unsigned int fmt; fmt = format & SND_SOC_DAIFMT_FORMAT_MASK; @@ -97,8 +97,8 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct cs4349_private *cs4349 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct cs4349_private *cs4349 = snd_soc_component_get_drvdata(component); int fmt, ret; cs4349->rate = params_rate(params); @@ -126,7 +126,7 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - ret = snd_soc_update_bits(codec, CS4349_MODE, DIF_MASK, + ret = snd_soc_component_update_bits(component, CS4349_MODE, DIF_MASK, MODE_FORMAT(fmt)); if (ret < 0) return ret; @@ -136,14 +136,14 @@ static int cs4349_pcm_hw_params(struct snd_pcm_substream *substream, static int cs4349_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int reg; reg = 0; if (mute) reg = MUTE_AB_MASK; - return snd_soc_update_bits(codec, CS4349_MUTE, MUTE_AB_MASK, reg); + return snd_soc_component_update_bits(component, CS4349_MUTE, MUTE_AB_MASK, reg); } static DECLARE_TLV_DB_SCALE(dig_tlv, -12750, 50, 0); @@ -255,15 +255,17 @@ static struct snd_soc_dai_driver cs4349_dai = { .symmetric_rates = 1, }; -static const struct snd_soc_codec_driver soc_codec_dev_cs4349 = { - .component_driver = { - .controls = cs4349_snd_controls, - .num_controls = ARRAY_SIZE(cs4349_snd_controls), - .dapm_widgets = cs4349_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs4349_dapm_widgets), - .dapm_routes = cs4349_routes, - .num_dapm_routes = ARRAY_SIZE(cs4349_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_cs4349 = { + .controls = cs4349_snd_controls, + .num_controls = ARRAY_SIZE(cs4349_snd_controls), + .dapm_widgets = cs4349_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs4349_dapm_widgets), + .dapm_routes = cs4349_routes, + .num_dapm_routes = ARRAY_SIZE(cs4349_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config cs4349_regmap = { @@ -305,7 +307,8 @@ static int cs4349_i2c_probe(struct i2c_client *client, i2c_set_clientdata(client, cs4349); - return snd_soc_register_codec(&client->dev, &soc_codec_dev_cs4349, + return devm_snd_soc_register_component(&client->dev, + &soc_component_dev_cs4349, &cs4349_dai, 1); } @@ -313,8 +316,6 @@ static int cs4349_i2c_remove(struct i2c_client *client) { struct cs4349_private *cs4349 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); - /* Hold down reset */ gpiod_set_value_cansleep(cs4349->reset_gpio, 0); diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c index be2750680838..196e9c343aeb 100644 --- a/sound/soc/codecs/cs47l24.c +++ b/sound/soc/codecs/cs47l24.c @@ -33,6 +33,8 @@ #include "wm_adsp.h" #include "cs47l24.h" +#define DRV_NAME "cs47l24-codec" + struct cs47l24_priv { struct arizona_priv core; struct arizona_fll fll[2]; @@ -60,14 +62,14 @@ static const struct wm_adsp_region *cs47l24_dsp_regions[] = { static int cs47l24_adsp_power_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); unsigned int v; int ret; ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v); if (ret != 0) { - dev_err(codec->dev, "Failed to read SYSCLK state: %d\n", ret); + dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret); return ret; } @@ -194,14 +196,13 @@ SOC_SINGLE("HPOUT1 SC Protect Switch", ARIZONA_HP1_SHORT_CIRCUIT_CTRL, SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), SOC_SINGLE("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, - ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), + ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L, - ARIZONA_OUT4L_VOL_SHIFT, - 0xbf, 0, digital_tlv), + ARIZONA_OUT4L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp), SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp), @@ -492,8 +493,7 @@ SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3, ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0), SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &cs47l24_aec_loopback_mux), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, &cs47l24_aec_loopback_mux), SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), @@ -929,10 +929,10 @@ static const struct snd_soc_dapm_route cs47l24_dapm_routes[] = { { "DSP3 Voice Trigger", "Switch", "DSP3" }, }; -static int cs47l24_set_fll(struct snd_soc_codec *codec, int fll_id, int source, - unsigned int Fref, unsigned int Fout) +static int cs47l24_set_fll(struct snd_soc_component *component, int fll_id, + int source, unsigned int Fref, unsigned int Fout) { - struct cs47l24_priv *cs47l24 = snd_soc_codec_get_drvdata(codec); + struct cs47l24_priv *cs47l24 = snd_soc_component_get_drvdata(component); switch (fll_id) { case CS47L24_FLL1: @@ -1069,7 +1069,8 @@ static struct snd_soc_dai_driver cs47l24_dai[] = { static int cs47l24_open(struct snd_compr_stream *stream) { struct snd_soc_pcm_runtime *rtd = stream->private_data; - struct cs47l24_priv *priv = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int n_adsp; @@ -1115,34 +1116,34 @@ static irqreturn_t cs47l24_adsp2_irq(int irq, void *data) return IRQ_HANDLED; } -static int cs47l24_codec_probe(struct snd_soc_codec *codec) +static int cs47l24_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); - struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int ret; arizona->dapm = dapm; - snd_soc_codec_init_regmap(codec, arizona->regmap); + snd_soc_component_init_regmap(component, arizona->regmap); - ret = arizona_init_spk(codec); + ret = arizona_init_spk(component); if (ret < 0) return ret; - arizona_init_gpio(codec); - arizona_init_mono(codec); + arizona_init_gpio(component); + arizona_init_mono(component); - ret = wm_adsp2_codec_probe(&priv->core.adsp[1], codec); + ret = wm_adsp2_component_probe(&priv->core.adsp[1], component); if (ret) goto err_adsp2_codec_probe; - ret = wm_adsp2_codec_probe(&priv->core.adsp[2], codec); + ret = wm_adsp2_component_probe(&priv->core.adsp[2], component); if (ret) goto err_adsp2_codec_probe; - ret = snd_soc_add_codec_controls(codec, - &arizona_adsp2_rate_controls[1], 2); + ret = snd_soc_add_component_controls(component, + &arizona_adsp2_rate_controls[1], + 2); if (ret) goto err_adsp2_codec_probe; @@ -1151,22 +1152,20 @@ static int cs47l24_codec_probe(struct snd_soc_codec *codec) return 0; err_adsp2_codec_probe: - wm_adsp2_codec_remove(&priv->core.adsp[1], codec); - wm_adsp2_codec_remove(&priv->core.adsp[2], codec); + wm_adsp2_component_remove(&priv->core.adsp[1], component); + wm_adsp2_component_remove(&priv->core.adsp[2], component); return ret; } -static int cs47l24_codec_remove(struct snd_soc_codec *codec) +static void cs47l24_component_remove(struct snd_soc_component *component) { - struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec); + struct cs47l24_priv *priv = snd_soc_component_get_drvdata(component); - wm_adsp2_codec_remove(&priv->core.adsp[1], codec); - wm_adsp2_codec_remove(&priv->core.adsp[2], codec); + wm_adsp2_component_remove(&priv->core.adsp[1], component); + wm_adsp2_component_remove(&priv->core.adsp[2], component); priv->core.arizona->dapm = NULL; - - return 0; } #define CS47L24_DIG_VU 0x0200 @@ -1177,37 +1176,32 @@ static unsigned int cs47l24_digital_vu[] = { ARIZONA_DAC_DIGITAL_VOLUME_4L, }; -static const struct snd_soc_codec_driver soc_codec_dev_cs47l24 = { - .probe = cs47l24_codec_probe, - .remove = cs47l24_codec_remove, - - .idle_bias_off = true, - - .set_sysclk = arizona_set_sysclk, - .set_pll = cs47l24_set_fll, - - .component_driver = { - .controls = cs47l24_snd_controls, - .num_controls = ARRAY_SIZE(cs47l24_snd_controls), - .dapm_widgets = cs47l24_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs47l24_dapm_widgets), - .dapm_routes = cs47l24_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(cs47l24_dapm_routes), - }, -}; - -static const struct snd_compr_ops cs47l24_compr_ops = { - .open = cs47l24_open, - .free = wm_adsp_compr_free, - .set_params = wm_adsp_compr_set_params, - .get_caps = wm_adsp_compr_get_caps, - .trigger = wm_adsp_compr_trigger, - .pointer = wm_adsp_compr_pointer, - .copy = wm_adsp_compr_copy, +static struct snd_compr_ops cs47l24_compr_ops = { + .open = cs47l24_open, + .free = wm_adsp_compr_free, + .set_params = wm_adsp_compr_set_params, + .get_caps = wm_adsp_compr_get_caps, + .trigger = wm_adsp_compr_trigger, + .pointer = wm_adsp_compr_pointer, + .copy = wm_adsp_compr_copy, }; -static const struct snd_soc_platform_driver cs47l24_compr_platform = { - .compr_ops = &cs47l24_compr_ops, +static const struct snd_soc_component_driver soc_component_dev_cs47l24 = { + .probe = cs47l24_component_probe, + .remove = cs47l24_component_remove, + .set_sysclk = arizona_set_sysclk, + .set_pll = cs47l24_set_fll, + .name = DRV_NAME, + .compr_ops = &cs47l24_compr_ops, + .controls = cs47l24_snd_controls, + .num_controls = ARRAY_SIZE(cs47l24_snd_controls), + .dapm_widgets = cs47l24_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs47l24_dapm_widgets), + .dapm_routes = cs47l24_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(cs47l24_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int cs47l24_probe(struct platform_device *pdev) @@ -1219,7 +1213,7 @@ static int cs47l24_probe(struct platform_device *pdev) BUILD_BUG_ON(ARRAY_SIZE(cs47l24_dai) > ARIZONA_MAX_DAI); cs47l24 = devm_kzalloc(&pdev->dev, sizeof(struct cs47l24_priv), - GFP_KERNEL); + GFP_KERNEL); if (!cs47l24) return -ENOMEM; @@ -1298,23 +1292,17 @@ static int cs47l24_probe(struct platform_device *pdev) if (ret < 0) goto err_dsp_irq; - ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform); + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_cs47l24, + cs47l24_dai, + ARRAY_SIZE(cs47l24_dai)); if (ret < 0) { - dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); + dev_err(&pdev->dev, "Failed to register component: %d\n", ret); goto err_spk_irqs; } - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24, - cs47l24_dai, ARRAY_SIZE(cs47l24_dai)); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); - goto err_platform; - } - return ret; -err_platform: - snd_soc_unregister_platform(&pdev->dev); err_spk_irqs: arizona_free_spk_irqs(arizona); err_dsp_irq: @@ -1328,8 +1316,6 @@ static int cs47l24_remove(struct platform_device *pdev) struct cs47l24_priv *cs47l24 = platform_get_drvdata(pdev); struct arizona *arizona = cs47l24->core.arizona; - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); wm_adsp2_remove(&cs47l24->core.adsp[1]); diff --git a/sound/soc/codecs/cs53l30.c b/sound/soc/codecs/cs53l30.c index c7edf2df5e36..8995ea45b4ca 100644 --- a/sound/soc/codecs/cs53l30.c +++ b/sound/soc/codecs/cs53l30.c @@ -549,7 +549,7 @@ static int cs53l30_get_mclk_coeff(int mclk_rate, int srate) static int cs53l30_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); int mclkx_coeff; u32 mclk_rate; @@ -572,7 +572,7 @@ static int cs53l30_set_sysclk(struct snd_soc_dai *dai, static int cs53l30_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); u8 aspcfg = 0, aspctl1 = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -626,7 +626,7 @@ static int cs53l30_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); int srate = params_rate(params); int mclk_coeff; @@ -650,11 +650,11 @@ static int cs53l30_pcm_hw_params(struct snd_pcm_substream *substream, return 0; } -static int cs53l30_set_bias_level(struct snd_soc_codec *codec, +static int cs53l30_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(component); unsigned int reg; int i, inter_max_check, ret; @@ -670,7 +670,7 @@ static int cs53l30_set_bias_level(struct snd_soc_codec *codec, if (dapm->bias_level == SND_SOC_BIAS_OFF) { ret = clk_prepare_enable(priv->mclk); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "failed to enable MCLK: %d\n", ret); return ret; } @@ -736,7 +736,7 @@ static int cs53l30_set_bias_level(struct snd_soc_codec *codec, static int cs53l30_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); u8 val = tristate ? CS53L30_ASP_3ST : 0; return regmap_update_bits(priv->regmap, CS53L30_ASP_CTL1, @@ -770,7 +770,7 @@ static int cs53l30_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); unsigned int loc[CS53L30_TDM_SLOT_MAX] = {48, 48, 48, 48}; unsigned int slot_next, slot_step; u64 tx_enable = 0; @@ -840,7 +840,7 @@ static int cs53l30_set_dai_tdm_slot(struct snd_soc_dai *dai, static int cs53l30_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); gpiod_set_value_cansleep(priv->mute_gpio, mute); @@ -876,10 +876,10 @@ static struct snd_soc_dai_driver cs53l30_dai = { .symmetric_rates = 1, }; -static int cs53l30_codec_probe(struct snd_soc_codec *codec) +static int cs53l30_component_probe(struct snd_soc_component *component) { - struct cs53l30_private *priv = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct cs53l30_private *priv = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (priv->use_sdout2) snd_soc_dapm_add_routes(dapm, cs53l30_dapm_routes_sdout2, @@ -891,19 +891,18 @@ static int cs53l30_codec_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver cs53l30_driver = { - .probe = cs53l30_codec_probe, - .set_bias_level = cs53l30_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = cs53l30_snd_controls, - .num_controls = ARRAY_SIZE(cs53l30_snd_controls), - .dapm_widgets = cs53l30_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cs53l30_dapm_widgets), - .dapm_routes = cs53l30_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(cs53l30_dapm_routes), - }, +static const struct snd_soc_component_driver cs53l30_driver = { + .probe = cs53l30_component_probe, + .set_bias_level = cs53l30_set_bias_level, + .controls = cs53l30_snd_controls, + .num_controls = ARRAY_SIZE(cs53l30_snd_controls), + .dapm_widgets = cs53l30_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cs53l30_dapm_widgets), + .dapm_routes = cs53l30_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(cs53l30_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct regmap_config cs53l30_regmap = { @@ -1033,9 +1032,9 @@ static int cs53l30_i2c_probe(struct i2c_client *client, dev_info(dev, "Cirrus Logic CS53L30, Revision: %02X\n", reg & 0xFF); - ret = snd_soc_register_codec(dev, &cs53l30_driver, &cs53l30_dai, 1); + ret = devm_snd_soc_register_component(dev, &cs53l30_driver, &cs53l30_dai, 1); if (ret) { - dev_err(dev, "failed to register codec: %d\n", ret); + dev_err(dev, "failed to register component: %d\n", ret); goto error; } @@ -1051,8 +1050,6 @@ static int cs53l30_i2c_remove(struct i2c_client *client) { struct cs53l30_private *cs53l30 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); - /* Hold down reset */ gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c index 95bb10ba80dc..07dd33b09596 100644 --- a/sound/soc/codecs/cx20442.c +++ b/sound/soc/codecs/cx20442.c @@ -89,10 +89,10 @@ static const struct snd_soc_dapm_route cx20442_audio_map[] = { {"ADC", NULL, "Input Mixer"}, }; -static unsigned int cx20442_read_reg_cache(struct snd_soc_codec *codec, +static unsigned int cx20442_read_reg_cache(struct snd_soc_component *component, unsigned int reg) { - struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); + struct cx20442_priv *cx20442 = snd_soc_component_get_drvdata(component); if (reg >= 1) return -EINVAL; @@ -153,10 +153,10 @@ static int cx20442_pm_to_v253_vsp(u8 value) return (value & (1 << CX20442_AGC)) ? -EINVAL : 0; } -static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg, +static int cx20442_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); + struct cx20442_priv *cx20442 = snd_soc_component_get_drvdata(component); int vls, vsp, old, len; char buf[18]; @@ -193,7 +193,7 @@ static int cx20442_write(struct snd_soc_codec *codec, unsigned int reg, if (unlikely(len > (ARRAY_SIZE(buf) - 1))) return -ENOMEM; - dev_dbg(codec->dev, "%s: %s\n", __func__, buf); + dev_dbg(component->dev, "%s: %s\n", __func__, buf); if (cx20442->tty->ops->write(cx20442->tty, buf, len) != len) return -EIO; @@ -240,19 +240,19 @@ err: /* Line discipline .close() */ static void v253_close(struct tty_struct *tty) { - struct snd_soc_codec *codec = tty->disc_data; + struct snd_soc_component *component = tty->disc_data; struct cx20442_priv *cx20442; tty->disc_data = NULL; - if (!codec) + if (!component) return; - cx20442 = snd_soc_codec_get_drvdata(codec); + cx20442 = snd_soc_component_get_drvdata(component); /* Prevent the codec driver from further accessing the modem */ cx20442->tty = NULL; - codec->component.card->pop_time = 0; + component->card->pop_time = 0; } /* Line discipline .hangup() */ @@ -266,20 +266,20 @@ static int v253_hangup(struct tty_struct *tty) static void v253_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { - struct snd_soc_codec *codec = tty->disc_data; + struct snd_soc_component *component = tty->disc_data; struct cx20442_priv *cx20442; - if (!codec) + if (!component) return; - cx20442 = snd_soc_codec_get_drvdata(codec); + cx20442 = snd_soc_component_get_drvdata(component); if (!cx20442->tty) { /* First modem response, complete setup procedure */ /* Set up codec driver access to modem controls */ cx20442->tty = tty; - codec->component.card->pop_time = 1; + component->card->pop_time = 1; } } @@ -323,15 +323,15 @@ static struct snd_soc_dai_driver cx20442_dai = { }, }; -static int cx20442_set_bias_level(struct snd_soc_codec *codec, +static int cx20442_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); + struct cx20442_priv *cx20442 = snd_soc_component_get_drvdata(component); int err = 0; switch (level) { case SND_SOC_BIAS_PREPARE: - if (snd_soc_codec_get_bias_level(codec) != SND_SOC_BIAS_STANDBY) + if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_STANDBY) break; if (IS_ERR(cx20442->por)) err = PTR_ERR(cx20442->por); @@ -339,7 +339,7 @@ static int cx20442_set_bias_level(struct snd_soc_codec *codec, err = regulator_enable(cx20442->por); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) != SND_SOC_BIAS_PREPARE) + if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_PREPARE) break; if (IS_ERR(cx20442->por)) err = PTR_ERR(cx20442->por); @@ -353,7 +353,7 @@ static int cx20442_set_bias_level(struct snd_soc_codec *codec, return err; } -static int cx20442_codec_probe(struct snd_soc_codec *codec) +static int cx20442_component_probe(struct snd_soc_component *component) { struct cx20442_priv *cx20442; @@ -361,21 +361,21 @@ static int cx20442_codec_probe(struct snd_soc_codec *codec) if (cx20442 == NULL) return -ENOMEM; - cx20442->por = regulator_get(codec->dev, "POR"); + cx20442->por = regulator_get(component->dev, "POR"); if (IS_ERR(cx20442->por)) - dev_warn(codec->dev, "failed to get the regulator"); + dev_warn(component->dev, "failed to get the regulator"); cx20442->tty = NULL; - snd_soc_codec_set_drvdata(codec, cx20442); - codec->component.card->pop_time = 0; + snd_soc_component_set_drvdata(component, cx20442); + component->card->pop_time = 0; return 0; } /* power down chip */ -static int cx20442_codec_remove(struct snd_soc_codec *codec) +static void cx20442_component_remove(struct snd_soc_component *component) { - struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); + struct cx20442_priv *cx20442 = snd_soc_component_get_drvdata(component); if (cx20442->tty) { struct tty_struct *tty = cx20442->tty; @@ -387,36 +387,30 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec) regulator_put(cx20442->por); } - snd_soc_codec_set_drvdata(codec, NULL); + snd_soc_component_set_drvdata(component, NULL); kfree(cx20442); - return 0; } -static const struct snd_soc_codec_driver cx20442_codec_dev = { - .probe = cx20442_codec_probe, - .remove = cx20442_codec_remove, - .set_bias_level = cx20442_set_bias_level, - .read = cx20442_read_reg_cache, - .write = cx20442_write, - - .component_driver = { - .dapm_widgets = cx20442_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(cx20442_dapm_widgets), - .dapm_routes = cx20442_audio_map, - .num_dapm_routes = ARRAY_SIZE(cx20442_audio_map), - }, +static const struct snd_soc_component_driver cx20442_component_dev = { + .probe = cx20442_component_probe, + .remove = cx20442_component_remove, + .set_bias_level = cx20442_set_bias_level, + .read = cx20442_read_reg_cache, + .write = cx20442_write, + .dapm_widgets = cx20442_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cx20442_dapm_widgets), + .dapm_routes = cx20442_audio_map, + .num_dapm_routes = ARRAY_SIZE(cx20442_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int cx20442_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &cx20442_codec_dev, &cx20442_dai, 1); -} - -static int cx20442_platform_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &cx20442_component_dev, &cx20442_dai, 1); } static struct platform_driver cx20442_platform_driver = { @@ -424,7 +418,6 @@ static struct platform_driver cx20442_platform_driver = { .name = "cx20442-codec", }, .probe = cx20442_platform_probe, - .remove = cx20442_platform_remove, }; module_platform_driver(cx20442_platform_driver); diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index 1af443ccbc51..a664111b7184 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c @@ -331,12 +331,12 @@ static SOC_ENUM_SINGLE_DECL(da7210_hp_mode_sel, static int da7210_put_alc_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); if (ucontrol->value.integer.value[0]) { /* Check if noise suppression is enabled */ - if (snd_soc_read(codec, DA7210_CONTROL) & DA7210_NOISE_SUP_EN) { - dev_dbg(codec->dev, + if (snd_soc_component_read32(component, DA7210_CONTROL) & DA7210_NOISE_SUP_EN) { + dev_dbg(component->dev, "Disable noise suppression to enable ALC\n"); return -EINVAL; } @@ -354,32 +354,32 @@ static int da7210_put_alc_sw(struct snd_kcontrol *kcontrol, static int da7210_put_noise_sup_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); u8 val; if (ucontrol->value.integer.value[0]) { /* Check if ALC is enabled */ - if (snd_soc_read(codec, DA7210_ADC) & DA7210_ADC_ALC_EN) + if (snd_soc_component_read32(component, DA7210_ADC) & DA7210_ADC_ALC_EN) goto err; /* Check ZC for HP and AUX1 PGA */ - if ((snd_soc_read(codec, DA7210_ZERO_CROSS) & + if ((snd_soc_component_read32(component, DA7210_ZERO_CROSS) & (DA7210_AUX1_L_ZC | DA7210_AUX1_R_ZC | DA7210_HP_L_ZC | DA7210_HP_R_ZC)) != (DA7210_AUX1_L_ZC | DA7210_AUX1_R_ZC | DA7210_HP_L_ZC | DA7210_HP_R_ZC)) goto err; /* Check INPGA_L_VOL and INPGA_R_VOL */ - val = snd_soc_read(codec, DA7210_IN_GAIN); + val = snd_soc_component_read32(component, DA7210_IN_GAIN); if (((val & DA7210_INPGA_L_VOL) < DA7210_INPGA_MIN_VOL_NS) || (((val & DA7210_INPGA_R_VOL) >> 4) < DA7210_INPGA_MIN_VOL_NS)) goto err; /* Check AUX1_L_VOL and AUX1_R_VOL */ - if (((snd_soc_read(codec, DA7210_AUX1_L) & DA7210_AUX1_L_VOL) < + if (((snd_soc_component_read32(component, DA7210_AUX1_L) & DA7210_AUX1_L_VOL) < DA7210_AUX1_MIN_VOL_NS) || - ((snd_soc_read(codec, DA7210_AUX1_R) & DA7210_AUX1_R_VOL) < + ((snd_soc_component_read32(component, DA7210_AUX1_R) & DA7210_AUX1_R_VOL) < DA7210_AUX1_MIN_VOL_NS)) goto err; } @@ -760,19 +760,19 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct da7210_priv *da7210 = snd_soc_component_get_drvdata(component); u32 dai_cfg1; u32 fs, sysclk; /* set DAI source to Left and Right ADC */ - snd_soc_write(codec, DA7210_DAI_SRC_SEL, + snd_soc_component_write(component, DA7210_DAI_SRC_SEL, DA7210_DAI_OUT_R_SRC | DA7210_DAI_OUT_L_SRC); /* Enable DAI */ - snd_soc_write(codec, DA7210_DAI_CFG3, DA7210_DAI_OE | DA7210_DAI_EN); + snd_soc_component_write(component, DA7210_DAI_CFG3, DA7210_DAI_OE | DA7210_DAI_EN); - dai_cfg1 = 0xFC & snd_soc_read(codec, DA7210_DAI_CFG1); + dai_cfg1 = 0xFC & snd_soc_component_read32(component, DA7210_DAI_CFG1); switch (params_width(params)) { case 16: @@ -791,7 +791,7 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_write(codec, DA7210_DAI_CFG1, dai_cfg1); + snd_soc_component_write(component, DA7210_DAI_CFG1, dai_cfg1); switch (params_rate(params)) { case 8000: @@ -839,17 +839,17 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, } /* Disable active mode */ - snd_soc_update_bits(codec, DA7210_STARTUP1, DA7210_SC_MST_EN, 0); + snd_soc_component_update_bits(component, DA7210_STARTUP1, DA7210_SC_MST_EN, 0); - snd_soc_update_bits(codec, DA7210_PLL, DA7210_PLL_FS_MASK, fs); + snd_soc_component_update_bits(component, DA7210_PLL, DA7210_PLL_FS_MASK, fs); if (da7210->mclk_rate && (da7210->mclk_rate != sysclk)) { /* PLL mode, disable PLL bypass */ - snd_soc_update_bits(codec, DA7210_PLL_DIV3, DA7210_PLL_BYP, 0); + snd_soc_component_update_bits(component, DA7210_PLL_DIV3, DA7210_PLL_BYP, 0); if (!da7210->master) { /* PLL slave mode, also enable SRM */ - snd_soc_update_bits(codec, DA7210_PLL, + snd_soc_component_update_bits(component, DA7210_PLL, (DA7210_MCLK_SRM_EN | DA7210_MCLK_DET_EN), (DA7210_MCLK_SRM_EN | @@ -857,13 +857,13 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, } } else { /* PLL bypass mode, enable PLL bypass and Auto Detection */ - snd_soc_update_bits(codec, DA7210_PLL, DA7210_MCLK_DET_EN, + snd_soc_component_update_bits(component, DA7210_PLL, DA7210_MCLK_DET_EN, DA7210_MCLK_DET_EN); - snd_soc_update_bits(codec, DA7210_PLL_DIV3, DA7210_PLL_BYP, + snd_soc_component_update_bits(component, DA7210_PLL_DIV3, DA7210_PLL_BYP, DA7210_PLL_BYP); } /* Enable active mode */ - snd_soc_update_bits(codec, DA7210_STARTUP1, + snd_soc_component_update_bits(component, DA7210_STARTUP1, DA7210_SC_MST_EN, DA7210_SC_MST_EN); return 0; @@ -874,16 +874,16 @@ static int da7210_hw_params(struct snd_pcm_substream *substream, */ static int da7210_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7210_priv *da7210 = snd_soc_component_get_drvdata(component); u32 dai_cfg1; u32 dai_cfg3; - dai_cfg1 = 0x7f & snd_soc_read(codec, DA7210_DAI_CFG1); - dai_cfg3 = 0xfc & snd_soc_read(codec, DA7210_DAI_CFG3); + dai_cfg1 = 0x7f & snd_soc_component_read32(component, DA7210_DAI_CFG1); + dai_cfg3 = 0xfc & snd_soc_component_read32(component, DA7210_DAI_CFG3); - if ((snd_soc_read(codec, DA7210_PLL) & DA7210_PLL_EN) && - (!(snd_soc_read(codec, DA7210_PLL_DIV3) & DA7210_PLL_BYP))) + if ((snd_soc_component_read32(component, DA7210_PLL) & DA7210_PLL_EN) && + (!(snd_soc_component_read32(component, DA7210_PLL_DIV3) & DA7210_PLL_BYP))) return -EINVAL; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -923,21 +923,21 @@ static int da7210_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) */ dai_cfg1 |= DA7210_DAI_FLEN_64BIT; - snd_soc_write(codec, DA7210_DAI_CFG1, dai_cfg1); - snd_soc_write(codec, DA7210_DAI_CFG3, dai_cfg3); + snd_soc_component_write(component, DA7210_DAI_CFG1, dai_cfg1); + snd_soc_component_write(component, DA7210_DAI_CFG3, dai_cfg3); return 0; } static int da7210_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - u8 mute_reg = snd_soc_read(codec, DA7210_DAC_HPF) & 0xFB; + struct snd_soc_component *component = dai->component; + u8 mute_reg = snd_soc_component_read32(component, DA7210_DAC_HPF) & 0xFB; if (mute) - snd_soc_write(codec, DA7210_DAC_HPF, mute_reg | 0x4); + snd_soc_component_write(component, DA7210_DAC_HPF, mute_reg | 0x4); else - snd_soc_write(codec, DA7210_DAC_HPF, mute_reg); + snd_soc_component_write(component, DA7210_DAC_HPF, mute_reg); return 0; } @@ -947,8 +947,8 @@ static int da7210_mute(struct snd_soc_dai *dai, int mute) static int da7210_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7210_priv *da7210 = snd_soc_component_get_drvdata(component); switch (clk_id) { case DA7210_CLKSRC_MCLK: @@ -988,8 +988,8 @@ static int da7210_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int da7210_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int fref, unsigned int fout) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7210_priv *da7210 = snd_soc_component_get_drvdata(component); u8 pll_div1, pll_div2, pll_div3, cnt; @@ -1014,18 +1014,18 @@ static int da7210_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, goto err; /* Disable active mode */ - snd_soc_update_bits(codec, DA7210_STARTUP1, DA7210_SC_MST_EN, 0); + snd_soc_component_update_bits(component, DA7210_STARTUP1, DA7210_SC_MST_EN, 0); /* Write PLL dividers */ - snd_soc_write(codec, DA7210_PLL_DIV1, pll_div1); - snd_soc_write(codec, DA7210_PLL_DIV2, pll_div2); - snd_soc_update_bits(codec, DA7210_PLL_DIV3, + snd_soc_component_write(component, DA7210_PLL_DIV1, pll_div1); + snd_soc_component_write(component, DA7210_PLL_DIV2, pll_div2); + snd_soc_component_update_bits(component, DA7210_PLL_DIV3, DA7210_PLL_DIV_L_MASK, pll_div3); /* Enable PLL */ - snd_soc_update_bits(codec, DA7210_PLL, DA7210_PLL_EN, DA7210_PLL_EN); + snd_soc_component_update_bits(component, DA7210_PLL, DA7210_PLL_EN, DA7210_PLL_EN); /* Enable active mode */ - snd_soc_update_bits(codec, DA7210_STARTUP1, DA7210_SC_MST_EN, + snd_soc_component_update_bits(component, DA7210_STARTUP1, DA7210_SC_MST_EN, DA7210_SC_MST_EN); return 0; err: @@ -1064,53 +1064,53 @@ static struct snd_soc_dai_driver da7210_dai = { .symmetric_rates = 1, }; -static int da7210_probe(struct snd_soc_codec *codec) +static int da7210_probe(struct snd_soc_component *component) { - struct da7210_priv *da7210 = snd_soc_codec_get_drvdata(codec); + struct da7210_priv *da7210 = snd_soc_component_get_drvdata(component); - dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); + dev_info(component->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); da7210->mclk_rate = 0; /* This will be set from set_sysclk() */ da7210->master = 0; /* This will be set from set_fmt() */ /* Enable internal regulator & bias current */ - snd_soc_write(codec, DA7210_CONTROL, DA7210_REG_EN | DA7210_BIAS_EN); + snd_soc_component_write(component, DA7210_CONTROL, DA7210_REG_EN | DA7210_BIAS_EN); /* * ADC settings */ /* Enable Left & Right MIC PGA and Mic Bias */ - snd_soc_write(codec, DA7210_MIC_L, DA7210_MIC_L_EN | DA7210_MICBIAS_EN); - snd_soc_write(codec, DA7210_MIC_R, DA7210_MIC_R_EN); + snd_soc_component_write(component, DA7210_MIC_L, DA7210_MIC_L_EN | DA7210_MICBIAS_EN); + snd_soc_component_write(component, DA7210_MIC_R, DA7210_MIC_R_EN); /* Enable Left and Right input PGA */ - snd_soc_write(codec, DA7210_INMIX_L, DA7210_IN_L_EN); - snd_soc_write(codec, DA7210_INMIX_R, DA7210_IN_R_EN); + snd_soc_component_write(component, DA7210_INMIX_L, DA7210_IN_L_EN); + snd_soc_component_write(component, DA7210_INMIX_R, DA7210_IN_R_EN); /* Enable Left and Right ADC */ - snd_soc_write(codec, DA7210_ADC, DA7210_ADC_L_EN | DA7210_ADC_R_EN); + snd_soc_component_write(component, DA7210_ADC, DA7210_ADC_L_EN | DA7210_ADC_R_EN); /* * DAC settings */ /* Enable Left and Right DAC */ - snd_soc_write(codec, DA7210_DAC_SEL, + snd_soc_component_write(component, DA7210_DAC_SEL, DA7210_DAC_L_SRC_DAI_L | DA7210_DAC_L_EN | DA7210_DAC_R_SRC_DAI_R | DA7210_DAC_R_EN); /* Enable Left and Right out PGA */ - snd_soc_write(codec, DA7210_OUTMIX_L, DA7210_OUT_L_EN); - snd_soc_write(codec, DA7210_OUTMIX_R, DA7210_OUT_R_EN); + snd_soc_component_write(component, DA7210_OUTMIX_L, DA7210_OUT_L_EN); + snd_soc_component_write(component, DA7210_OUTMIX_R, DA7210_OUT_R_EN); /* Enable Left and Right HeadPhone PGA */ - snd_soc_write(codec, DA7210_HP_CFG, + snd_soc_component_write(component, DA7210_HP_CFG, DA7210_HP_2CAP_MODE | DA7210_HP_SENSE_EN | DA7210_HP_L_EN | DA7210_HP_MODE | DA7210_HP_R_EN); /* Enable ramp mode for DAC gain update */ - snd_soc_write(codec, DA7210_SOFTMUTE, DA7210_RAMP_EN); + snd_soc_component_write(component, DA7210_SOFTMUTE, DA7210_RAMP_EN); /* * For DA7210 codec, there are two ways to enable/disable analog IOs @@ -1138,43 +1138,44 @@ static int da7210_probe(struct snd_soc_codec *codec) */ /* Enable Line out amplifiers */ - snd_soc_write(codec, DA7210_OUT1_L, DA7210_OUT1_L_EN); - snd_soc_write(codec, DA7210_OUT1_R, DA7210_OUT1_R_EN); - snd_soc_write(codec, DA7210_OUT2, DA7210_OUT2_EN | + snd_soc_component_write(component, DA7210_OUT1_L, DA7210_OUT1_L_EN); + snd_soc_component_write(component, DA7210_OUT1_R, DA7210_OUT1_R_EN); + snd_soc_component_write(component, DA7210_OUT2, DA7210_OUT2_EN | DA7210_OUT2_OUTMIX_L | DA7210_OUT2_OUTMIX_R); /* Enable Aux1 */ - snd_soc_write(codec, DA7210_AUX1_L, DA7210_AUX1_L_EN); - snd_soc_write(codec, DA7210_AUX1_R, DA7210_AUX1_R_EN); + snd_soc_component_write(component, DA7210_AUX1_L, DA7210_AUX1_L_EN); + snd_soc_component_write(component, DA7210_AUX1_R, DA7210_AUX1_R_EN); /* Enable Aux2 */ - snd_soc_write(codec, DA7210_AUX2, DA7210_AUX2_EN); + snd_soc_component_write(component, DA7210_AUX2, DA7210_AUX2_EN); /* Set PLL Master clock range 10-20 MHz, enable PLL bypass */ - snd_soc_write(codec, DA7210_PLL_DIV3, DA7210_MCLK_RANGE_10_20_MHZ | + snd_soc_component_write(component, DA7210_PLL_DIV3, DA7210_MCLK_RANGE_10_20_MHZ | DA7210_PLL_BYP); /* Diable PLL and bypass it */ - snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000); + snd_soc_component_write(component, DA7210_PLL, DA7210_PLL_FS_48000); /* Activate all enabled subsystem */ - snd_soc_write(codec, DA7210_STARTUP1, DA7210_SC_MST_EN); + snd_soc_component_write(component, DA7210_STARTUP1, DA7210_SC_MST_EN); - dev_info(codec->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); + dev_info(component->dev, "DA7210 Audio Codec %s\n", DA7210_VERSION); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_da7210 = { +static const struct snd_soc_component_driver soc_component_dev_da7210 = { .probe = da7210_probe, - - .component_driver = { - .controls = da7210_snd_controls, - .num_controls = ARRAY_SIZE(da7210_snd_controls), - .dapm_widgets = da7210_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da7210_dapm_widgets), - .dapm_routes = da7210_audio_map, - .num_dapm_routes = ARRAY_SIZE(da7210_audio_map), - }, + .controls = da7210_snd_controls, + .num_controls = ARRAY_SIZE(da7210_snd_controls), + .dapm_widgets = da7210_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da7210_dapm_widgets), + .dapm_routes = da7210_audio_map, + .num_dapm_routes = ARRAY_SIZE(da7210_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; #if IS_ENABLED(CONFIG_I2C) @@ -1232,20 +1233,14 @@ static int da7210_i2c_probe(struct i2c_client *i2c, if (ret != 0) dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_da7210, &da7210_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da7210, &da7210_dai, 1); if (ret < 0) - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } -static int da7210_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id da7210_i2c_id[] = { { "da7210", 0 }, { } @@ -1258,7 +1253,6 @@ static struct i2c_driver da7210_i2c_driver = { .name = "da7210", }, .probe = da7210_i2c_probe, - .remove = da7210_i2c_remove, .id_table = da7210_i2c_id, }; #endif @@ -1325,24 +1319,17 @@ static int da7210_spi_probe(struct spi_device *spi) if (ret != 0) dev_warn(&spi->dev, "Failed to apply regmap patch: %d\n", ret); - ret = snd_soc_register_codec(&spi->dev, - &soc_codec_dev_da7210, &da7210_dai, 1); + ret = devm_snd_soc_register_component(&spi->dev, + &soc_component_dev_da7210, &da7210_dai, 1); return ret; } -static int da7210_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver da7210_spi_driver = { .driver = { .name = "da7210", }, .probe = da7210_spi_probe, - .remove = da7210_spi_remove }; #endif diff --git a/sound/soc/codecs/da7213.c b/sound/soc/codecs/da7213.c index b2b4e90fc02a..54cb5f24969f 100644 --- a/sound/soc/codecs/da7213.c +++ b/sound/soc/codecs/da7213.c @@ -194,7 +194,7 @@ static SOC_ENUM_SINGLE_DECL(da7213_alc_integ_release_rate, * Control Functions */ -static int da7213_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) +static int da7213_get_alc_data(struct snd_soc_component *component, u8 reg_val) { int mid_data, top_data; int sum = 0; @@ -203,17 +203,17 @@ static int da7213_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) for (iteration = 0; iteration < DA7213_ALC_AVG_ITERATIONS; iteration++) { /* Select the left or right channel and capture data */ - snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val); + snd_soc_component_write(component, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val); /* Select middle 8 bits for read back from data register */ - snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL, + snd_soc_component_write(component, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val | DA7213_ALC_DATA_MIDDLE); - mid_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA); + mid_data = snd_soc_component_read32(component, DA7213_ALC_CIC_OP_LVL_DATA); /* Select top 8 bits for read back from data register */ - snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL, + snd_soc_component_write(component, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val | DA7213_ALC_DATA_TOP); - top_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA); + top_data = snd_soc_component_read32(component, DA7213_ALC_CIC_OP_LVL_DATA); sum += ((mid_data << 8) | (top_data << 16)); } @@ -221,17 +221,17 @@ static int da7213_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) return sum / DA7213_ALC_AVG_ITERATIONS; } -static void da7213_alc_calib_man(struct snd_soc_codec *codec) +static void da7213_alc_calib_man(struct snd_soc_component *component) { u8 reg_val; int avg_left_data, avg_right_data, offset_l, offset_r; /* Calculate average for Left and Right data */ /* Left Data */ - avg_left_data = da7213_get_alc_data(codec, + avg_left_data = da7213_get_alc_data(component, DA7213_ALC_CIC_OP_CHANNEL_LEFT); /* Right Data */ - avg_right_data = da7213_get_alc_data(codec, + avg_right_data = da7213_get_alc_data(component, DA7213_ALC_CIC_OP_CHANNEL_RIGHT); /* Calculate DC offset */ @@ -239,122 +239,122 @@ static void da7213_alc_calib_man(struct snd_soc_codec *codec) offset_r = -avg_right_data; reg_val = (offset_l & DA7213_ALC_OFFSET_15_8) >> 8; - snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_L, reg_val); + snd_soc_component_write(component, DA7213_ALC_OFFSET_MAN_M_L, reg_val); reg_val = (offset_l & DA7213_ALC_OFFSET_19_16) >> 16; - snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_L, reg_val); + snd_soc_component_write(component, DA7213_ALC_OFFSET_MAN_U_L, reg_val); reg_val = (offset_r & DA7213_ALC_OFFSET_15_8) >> 8; - snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_R, reg_val); + snd_soc_component_write(component, DA7213_ALC_OFFSET_MAN_M_R, reg_val); reg_val = (offset_r & DA7213_ALC_OFFSET_19_16) >> 16; - snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_R, reg_val); + snd_soc_component_write(component, DA7213_ALC_OFFSET_MAN_U_R, reg_val); /* Enable analog/digital gain mode & offset cancellation */ - snd_soc_update_bits(codec, DA7213_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7213_ALC_CTRL1, DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE, DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE); } -static void da7213_alc_calib_auto(struct snd_soc_codec *codec) +static void da7213_alc_calib_auto(struct snd_soc_component *component) { u8 alc_ctrl1; /* Begin auto calibration and wait for completion */ - snd_soc_update_bits(codec, DA7213_ALC_CTRL1, DA7213_ALC_AUTO_CALIB_EN, + snd_soc_component_update_bits(component, DA7213_ALC_CTRL1, DA7213_ALC_AUTO_CALIB_EN, DA7213_ALC_AUTO_CALIB_EN); do { - alc_ctrl1 = snd_soc_read(codec, DA7213_ALC_CTRL1); + alc_ctrl1 = snd_soc_component_read32(component, DA7213_ALC_CTRL1); } while (alc_ctrl1 & DA7213_ALC_AUTO_CALIB_EN); /* If auto calibration fails, fall back to digital gain only mode */ if (alc_ctrl1 & DA7213_ALC_CALIB_OVERFLOW) { - dev_warn(codec->dev, + dev_warn(component->dev, "ALC auto calibration failed with overflow\n"); - snd_soc_update_bits(codec, DA7213_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7213_ALC_CTRL1, DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE, 0); } else { /* Enable analog/digital gain mode & offset cancellation */ - snd_soc_update_bits(codec, DA7213_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7213_ALC_CTRL1, DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE, DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE); } } -static void da7213_alc_calib(struct snd_soc_codec *codec) +static void da7213_alc_calib(struct snd_soc_component *component) { - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); u8 adc_l_ctrl, adc_r_ctrl; u8 mixin_l_sel, mixin_r_sel; u8 mic_1_ctrl, mic_2_ctrl; /* Save current values from ADC control registers */ - adc_l_ctrl = snd_soc_read(codec, DA7213_ADC_L_CTRL); - adc_r_ctrl = snd_soc_read(codec, DA7213_ADC_R_CTRL); + adc_l_ctrl = snd_soc_component_read32(component, DA7213_ADC_L_CTRL); + adc_r_ctrl = snd_soc_component_read32(component, DA7213_ADC_R_CTRL); /* Save current values from MIXIN_L/R_SELECT registers */ - mixin_l_sel = snd_soc_read(codec, DA7213_MIXIN_L_SELECT); - mixin_r_sel = snd_soc_read(codec, DA7213_MIXIN_R_SELECT); + mixin_l_sel = snd_soc_component_read32(component, DA7213_MIXIN_L_SELECT); + mixin_r_sel = snd_soc_component_read32(component, DA7213_MIXIN_R_SELECT); /* Save current values from MIC control registers */ - mic_1_ctrl = snd_soc_read(codec, DA7213_MIC_1_CTRL); - mic_2_ctrl = snd_soc_read(codec, DA7213_MIC_2_CTRL); + mic_1_ctrl = snd_soc_component_read32(component, DA7213_MIC_1_CTRL); + mic_2_ctrl = snd_soc_component_read32(component, DA7213_MIC_2_CTRL); /* Enable ADC Left and Right */ - snd_soc_update_bits(codec, DA7213_ADC_L_CTRL, DA7213_ADC_EN, + snd_soc_component_update_bits(component, DA7213_ADC_L_CTRL, DA7213_ADC_EN, DA7213_ADC_EN); - snd_soc_update_bits(codec, DA7213_ADC_R_CTRL, DA7213_ADC_EN, + snd_soc_component_update_bits(component, DA7213_ADC_R_CTRL, DA7213_ADC_EN, DA7213_ADC_EN); /* Enable MIC paths */ - snd_soc_update_bits(codec, DA7213_MIXIN_L_SELECT, + snd_soc_component_update_bits(component, DA7213_MIXIN_L_SELECT, DA7213_MIXIN_L_MIX_SELECT_MIC_1 | DA7213_MIXIN_L_MIX_SELECT_MIC_2, DA7213_MIXIN_L_MIX_SELECT_MIC_1 | DA7213_MIXIN_L_MIX_SELECT_MIC_2); - snd_soc_update_bits(codec, DA7213_MIXIN_R_SELECT, + snd_soc_component_update_bits(component, DA7213_MIXIN_R_SELECT, DA7213_MIXIN_R_MIX_SELECT_MIC_2 | DA7213_MIXIN_R_MIX_SELECT_MIC_1, DA7213_MIXIN_R_MIX_SELECT_MIC_2 | DA7213_MIXIN_R_MIX_SELECT_MIC_1); /* Mute MIC PGAs */ - snd_soc_update_bits(codec, DA7213_MIC_1_CTRL, DA7213_MUTE_EN, + snd_soc_component_update_bits(component, DA7213_MIC_1_CTRL, DA7213_MUTE_EN, DA7213_MUTE_EN); - snd_soc_update_bits(codec, DA7213_MIC_2_CTRL, DA7213_MUTE_EN, + snd_soc_component_update_bits(component, DA7213_MIC_2_CTRL, DA7213_MUTE_EN, DA7213_MUTE_EN); /* Perform calibration */ if (da7213->alc_calib_auto) - da7213_alc_calib_auto(codec); + da7213_alc_calib_auto(component); else - da7213_alc_calib_man(codec); + da7213_alc_calib_man(component); /* Restore MIXIN_L/R_SELECT registers to their original states */ - snd_soc_write(codec, DA7213_MIXIN_L_SELECT, mixin_l_sel); - snd_soc_write(codec, DA7213_MIXIN_R_SELECT, mixin_r_sel); + snd_soc_component_write(component, DA7213_MIXIN_L_SELECT, mixin_l_sel); + snd_soc_component_write(component, DA7213_MIXIN_R_SELECT, mixin_r_sel); /* Restore ADC control registers to their original states */ - snd_soc_write(codec, DA7213_ADC_L_CTRL, adc_l_ctrl); - snd_soc_write(codec, DA7213_ADC_R_CTRL, adc_r_ctrl); + snd_soc_component_write(component, DA7213_ADC_L_CTRL, adc_l_ctrl); + snd_soc_component_write(component, DA7213_ADC_R_CTRL, adc_r_ctrl); /* Restore original values of MIC control registers */ - snd_soc_write(codec, DA7213_MIC_1_CTRL, mic_1_ctrl); - snd_soc_write(codec, DA7213_MIC_2_CTRL, mic_2_ctrl); + snd_soc_component_write(component, DA7213_MIC_1_CTRL, mic_1_ctrl); + snd_soc_component_write(component, DA7213_MIC_2_CTRL, mic_2_ctrl); } static int da7213_put_mixin_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); int ret; ret = snd_soc_put_volsw_2r(kcontrol, ucontrol); /* If ALC in operation, make sure calibrated offsets are updated */ if ((!ret) && (da7213->alc_en)) - da7213_alc_calib(codec); + da7213_alc_calib(component); return ret; } @@ -362,14 +362,14 @@ static int da7213_put_mixin_gain(struct snd_kcontrol *kcontrol, static int da7213_put_alc_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); /* Force ALC offset calibration if enabling ALC */ if (ucontrol->value.integer.value[0] || ucontrol->value.integer.value[1]) { if (!da7213->alc_en) { - da7213_alc_calib(codec); + da7213_alc_calib(component); da7213->alc_en = true; } } else { @@ -735,8 +735,8 @@ static const struct snd_kcontrol_new da7213_dapm_mixoutr_controls[] = { static int da7213_dai_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, pll_status; int i = 0; bool srm_lock = false; @@ -745,29 +745,29 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMU: /* Enable DAI clks for master mode */ if (da7213->master) - snd_soc_update_bits(codec, DA7213_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7213_DAI_CLK_MODE, DA7213_DAI_CLK_EN_MASK, DA7213_DAI_CLK_EN_MASK); /* PC synchronised to DAI */ - snd_soc_update_bits(codec, DA7213_PC_COUNT, + snd_soc_component_update_bits(component, DA7213_PC_COUNT, DA7213_PC_FREERUN_MASK, 0); /* If SRM not enabled then nothing more to do */ - pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL); + pll_ctrl = snd_soc_component_read32(component, DA7213_PLL_CTRL); if (!(pll_ctrl & DA7213_PLL_SRM_EN)) return 0; /* Assist 32KHz mode PLL lock */ if (pll_ctrl & DA7213_PLL_32K_MODE) { - snd_soc_write(codec, 0xF0, 0x8B); - snd_soc_write(codec, 0xF2, 0x03); - snd_soc_write(codec, 0xF0, 0x00); + snd_soc_component_write(component, 0xF0, 0x8B); + snd_soc_component_write(component, 0xF2, 0x03); + snd_soc_component_write(component, 0xF0, 0x00); } /* Check SRM has locked */ do { - pll_status = snd_soc_read(codec, DA7213_PLL_STATUS); + pll_status = snd_soc_component_read32(component, DA7213_PLL_STATUS); if (pll_status & DA7219_PLL_SRM_LOCK) { srm_lock = true; } else { @@ -777,26 +777,26 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w, } while ((i < DA7213_SRM_CHECK_RETRIES) && (!srm_lock)); if (!srm_lock) - dev_warn(codec->dev, "SRM failed to lock\n"); + dev_warn(component->dev, "SRM failed to lock\n"); return 0; case SND_SOC_DAPM_POST_PMD: /* Revert 32KHz PLL lock udpates if applied previously */ - pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL); + pll_ctrl = snd_soc_component_read32(component, DA7213_PLL_CTRL); if (pll_ctrl & DA7213_PLL_32K_MODE) { - snd_soc_write(codec, 0xF0, 0x8B); - snd_soc_write(codec, 0xF2, 0x01); - snd_soc_write(codec, 0xF0, 0x00); + snd_soc_component_write(component, 0xF0, 0x8B); + snd_soc_component_write(component, 0xF2, 0x01); + snd_soc_component_write(component, 0xF0, 0x00); } /* PC free-running */ - snd_soc_update_bits(codec, DA7213_PC_COUNT, + snd_soc_component_update_bits(component, DA7213_PC_COUNT, DA7213_PC_FREERUN_MASK, DA7213_PC_FREERUN_MASK); /* Disable DAI clks if in master mode */ if (da7213->master) - snd_soc_update_bits(codec, DA7213_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7213_DAI_CLK_MODE, DA7213_DAI_CLK_EN_MASK, 0); return 0; default: @@ -1150,7 +1150,7 @@ static int da7213_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 dai_ctrl = 0; u8 fs; @@ -1208,17 +1208,17 @@ static int da7213_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_WORD_LENGTH_MASK, + snd_soc_component_update_bits(component, DA7213_DAI_CTRL, DA7213_DAI_WORD_LENGTH_MASK, dai_ctrl); - snd_soc_write(codec, DA7213_SR, fs); + snd_soc_component_write(component, DA7213_SR, fs); return 0; } static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); u8 dai_clk_mode = 0, dai_ctrl = 0; u8 dai_offset = 0; @@ -1305,27 +1305,27 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) /* By default only 64 BCLK per WCLK is supported */ dai_clk_mode |= DA7213_DAI_BCLKS_PER_WCLK_64; - snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode); - snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK, + snd_soc_component_write(component, DA7213_DAI_CLK_MODE, dai_clk_mode); + snd_soc_component_update_bits(component, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK, dai_ctrl); - snd_soc_write(codec, DA7213_DAI_OFFSET, dai_offset); + snd_soc_component_write(component, DA7213_DAI_OFFSET, dai_offset); return 0; } static int da7213_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) { - snd_soc_update_bits(codec, DA7213_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_L_CTRL, DA7213_MUTE_EN, DA7213_MUTE_EN); - snd_soc_update_bits(codec, DA7213_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_R_CTRL, DA7213_MUTE_EN, DA7213_MUTE_EN); } else { - snd_soc_update_bits(codec, DA7213_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_L_CTRL, DA7213_MUTE_EN, 0); - snd_soc_update_bits(codec, DA7213_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_R_CTRL, DA7213_MUTE_EN, 0); } @@ -1338,8 +1338,8 @@ static int da7213_mute(struct snd_soc_dai *dai, int mute) static int da7213_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); int ret = 0; if ((da7213->clk_src == clk_id) && (da7213->mclk_rate == freq)) @@ -1353,11 +1353,11 @@ static int da7213_set_dai_sysclk(struct snd_soc_dai *codec_dai, switch (clk_id) { case DA7213_CLKSRC_MCLK: - snd_soc_update_bits(codec, DA7213_PLL_CTRL, + snd_soc_component_update_bits(component, DA7213_PLL_CTRL, DA7213_PLL_MCLK_SQR_EN, 0); break; case DA7213_CLKSRC_MCLK_SQR: - snd_soc_update_bits(codec, DA7213_PLL_CTRL, + snd_soc_component_update_bits(component, DA7213_PLL_CTRL, DA7213_PLL_MCLK_SQR_EN, DA7213_PLL_MCLK_SQR_EN); break; @@ -1387,8 +1387,8 @@ static int da7213_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int fref, unsigned int fout) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, indiv_bits, indiv; u8 pll_frac_top, pll_frac_bot, pll_integer; @@ -1398,7 +1398,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, /* Workout input divider based on MCLK rate */ if (da7213->mclk_rate == 32768) { if (!da7213->master) { - dev_err(codec->dev, + dev_err(component->dev, "32KHz only valid if codec is clock master\n"); return -EINVAL; } @@ -1411,7 +1411,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, } else { if (da7213->mclk_rate < 5000000) { - dev_err(codec->dev, + dev_err(component->dev, "PLL input clock %d below valid range\n", da7213->mclk_rate); return -EINVAL; @@ -1428,7 +1428,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, indiv_bits = DA7213_PLL_INDIV_36_TO_54_MHZ; indiv = DA7213_PLL_INDIV_36_TO_54_MHZ_VAL; } else { - dev_err(codec->dev, + dev_err(component->dev, "PLL input clock %d above valid range\n", da7213->mclk_rate); return -EINVAL; @@ -1441,7 +1441,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, /* Configure PLL */ switch (source) { case DA7213_SYSCLK_MCLK: - snd_soc_update_bits(codec, DA7213_PLL_CTRL, + snd_soc_component_update_bits(component, DA7213_PLL_CTRL, DA7213_PLL_INDIV_MASK | DA7213_PLL_MODE_MASK, pll_ctrl); return 0; @@ -1453,7 +1453,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, break; case DA7213_SYSCLK_PLL_32KHZ: if (da7213->mclk_rate != 32768) { - dev_err(codec->dev, + dev_err(component->dev, "32KHz mode only valid with 32KHz MCLK\n"); return -EINVAL; } @@ -1462,7 +1462,7 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, fout = DA7213_PLL_FREQ_OUT_94310400; break; default: - dev_err(codec->dev, "Invalid PLL config\n"); + dev_err(component->dev, "Invalid PLL config\n"); return -EINVAL; } @@ -1474,22 +1474,22 @@ static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, pll_frac_bot = (frac_div) & DA7213_BYTE_MASK; /* Write PLL dividers */ - snd_soc_write(codec, DA7213_PLL_FRAC_TOP, pll_frac_top); - snd_soc_write(codec, DA7213_PLL_FRAC_BOT, pll_frac_bot); - snd_soc_write(codec, DA7213_PLL_INTEGER, pll_integer); + snd_soc_component_write(component, DA7213_PLL_FRAC_TOP, pll_frac_top); + snd_soc_component_write(component, DA7213_PLL_FRAC_BOT, pll_frac_bot); + snd_soc_component_write(component, DA7213_PLL_INTEGER, pll_integer); /* Enable PLL */ pll_ctrl |= DA7213_PLL_EN; - snd_soc_update_bits(codec, DA7213_PLL_CTRL, + snd_soc_component_update_bits(component, DA7213_PLL_CTRL, DA7213_PLL_INDIV_MASK | DA7213_PLL_MODE_MASK, pll_ctrl); /* Assist 32KHz mode PLL lock */ if (source == DA7213_SYSCLK_PLL_32KHZ) { - snd_soc_write(codec, 0xF0, 0x8B); - snd_soc_write(codec, 0xF1, 0x03); - snd_soc_write(codec, 0xF1, 0x01); - snd_soc_write(codec, 0xF0, 0x00); + snd_soc_component_write(component, 0xF0, 0x8B); + snd_soc_component_write(component, 0xF1, 0x03); + snd_soc_component_write(component, 0xF1, 0x01); + snd_soc_component_write(component, 0xF0, 0x00); } return 0; @@ -1526,10 +1526,10 @@ static struct snd_soc_dai_driver da7213_dai = { .symmetric_rates = 1, }; -static int da7213_set_bias_level(struct snd_soc_codec *codec, +static int da7213_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1537,11 +1537,11 @@ static int da7213_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_PREPARE: /* Enable MCLK for transition to ON state */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) { if (da7213->mclk) { ret = clk_prepare_enable(da7213->mclk); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable mclk\n"); return ret; } @@ -1549,9 +1549,9 @@ static int da7213_set_bias_level(struct snd_soc_codec *codec, } break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Enable VMID reference & master bias */ - snd_soc_update_bits(codec, DA7213_REFERENCES, + snd_soc_component_update_bits(component, DA7213_REFERENCES, DA7213_VMID_EN | DA7213_BIAS_EN, DA7213_VMID_EN | DA7213_BIAS_EN); } else { @@ -1562,7 +1562,7 @@ static int da7213_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: /* Disable VMID reference & master bias */ - snd_soc_update_bits(codec, DA7213_REFERENCES, + snd_soc_component_update_bits(component, DA7213_REFERENCES, DA7213_VMID_EN | DA7213_BIAS_EN, 0); break; } @@ -1588,7 +1588,7 @@ MODULE_DEVICE_TABLE(acpi, da7213_acpi_match); #endif static enum da7213_micbias_voltage - da7213_of_micbias_lvl(struct snd_soc_codec *codec, u32 val) + da7213_of_micbias_lvl(struct snd_soc_component *component, u32 val) { switch (val) { case 1600: @@ -1600,39 +1600,39 @@ static enum da7213_micbias_voltage case 3000: return DA7213_MICBIAS_3_0V; default: - dev_warn(codec->dev, "Invalid micbias level\n"); + dev_warn(component->dev, "Invalid micbias level\n"); return DA7213_MICBIAS_2_2V; } } static enum da7213_dmic_data_sel - da7213_of_dmic_data_sel(struct snd_soc_codec *codec, const char *str) + da7213_of_dmic_data_sel(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "lrise_rfall")) { return DA7213_DMIC_DATA_LRISE_RFALL; } else if (!strcmp(str, "lfall_rrise")) { return DA7213_DMIC_DATA_LFALL_RRISE; } else { - dev_warn(codec->dev, "Invalid DMIC data select type\n"); + dev_warn(component->dev, "Invalid DMIC data select type\n"); return DA7213_DMIC_DATA_LRISE_RFALL; } } static enum da7213_dmic_samplephase - da7213_of_dmic_samplephase(struct snd_soc_codec *codec, const char *str) + da7213_of_dmic_samplephase(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "on_clkedge")) { return DA7213_DMIC_SAMPLE_ON_CLKEDGE; } else if (!strcmp(str, "between_clkedge")) { return DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE; } else { - dev_warn(codec->dev, "Invalid DMIC sample phase\n"); + dev_warn(component->dev, "Invalid DMIC sample phase\n"); return DA7213_DMIC_SAMPLE_ON_CLKEDGE; } } static enum da7213_dmic_clk_rate - da7213_of_dmic_clkrate(struct snd_soc_codec *codec, u32 val) + da7213_of_dmic_clkrate(struct snd_soc_component *component, u32 val) { switch (val) { case 1500000: @@ -1640,46 +1640,46 @@ static enum da7213_dmic_clk_rate case 3000000: return DA7213_DMIC_CLK_3_0MHZ; default: - dev_warn(codec->dev, "Invalid DMIC clock rate\n"); + dev_warn(component->dev, "Invalid DMIC clock rate\n"); return DA7213_DMIC_CLK_1_5MHZ; } } static struct da7213_platform_data - *da7213_fw_to_pdata(struct snd_soc_codec *codec) + *da7213_fw_to_pdata(struct snd_soc_component *component) { - struct device *dev = codec->dev; + struct device *dev = component->dev; struct da7213_platform_data *pdata; const char *fw_str; u32 fw_val32; - pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL); + pdata = devm_kzalloc(component->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return NULL; if (device_property_read_u32(dev, "dlg,micbias1-lvl", &fw_val32) >= 0) - pdata->micbias1_lvl = da7213_of_micbias_lvl(codec, fw_val32); + pdata->micbias1_lvl = da7213_of_micbias_lvl(component, fw_val32); else pdata->micbias1_lvl = DA7213_MICBIAS_2_2V; if (device_property_read_u32(dev, "dlg,micbias2-lvl", &fw_val32) >= 0) - pdata->micbias2_lvl = da7213_of_micbias_lvl(codec, fw_val32); + pdata->micbias2_lvl = da7213_of_micbias_lvl(component, fw_val32); else pdata->micbias2_lvl = DA7213_MICBIAS_2_2V; if (!device_property_read_string(dev, "dlg,dmic-data-sel", &fw_str)) - pdata->dmic_data_sel = da7213_of_dmic_data_sel(codec, fw_str); + pdata->dmic_data_sel = da7213_of_dmic_data_sel(component, fw_str); else pdata->dmic_data_sel = DA7213_DMIC_DATA_LRISE_RFALL; if (!device_property_read_string(dev, "dlg,dmic-samplephase", &fw_str)) pdata->dmic_samplephase = - da7213_of_dmic_samplephase(codec, fw_str); + da7213_of_dmic_samplephase(component, fw_str); else pdata->dmic_samplephase = DA7213_DMIC_SAMPLE_ON_CLKEDGE; if (device_property_read_u32(dev, "dlg,dmic-clkrate", &fw_val32) >= 0) - pdata->dmic_clk_rate = da7213_of_dmic_clkrate(codec, fw_val32); + pdata->dmic_clk_rate = da7213_of_dmic_clkrate(component, fw_val32); else pdata->dmic_clk_rate = DA7213_DMIC_CLK_3_0MHZ; @@ -1687,41 +1687,41 @@ static struct da7213_platform_data } -static int da7213_probe(struct snd_soc_codec *codec) +static int da7213_probe(struct snd_soc_component *component) { - struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); + struct da7213_priv *da7213 = snd_soc_component_get_drvdata(component); /* Default to using ALC auto offset calibration mode. */ - snd_soc_update_bits(codec, DA7213_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7213_ALC_CTRL1, DA7213_ALC_CALIB_MODE_MAN, 0); da7213->alc_calib_auto = true; /* Default PC counter to free-running */ - snd_soc_update_bits(codec, DA7213_PC_COUNT, DA7213_PC_FREERUN_MASK, + snd_soc_component_update_bits(component, DA7213_PC_COUNT, DA7213_PC_FREERUN_MASK, DA7213_PC_FREERUN_MASK); /* Enable all Gain Ramps */ - snd_soc_update_bits(codec, DA7213_AUX_L_CTRL, + snd_soc_component_update_bits(component, DA7213_AUX_L_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_AUX_R_CTRL, + snd_soc_component_update_bits(component, DA7213_AUX_R_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXIN_L_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXIN_R_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_ADC_L_CTRL, + snd_soc_component_update_bits(component, DA7213_ADC_L_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_ADC_R_CTRL, + snd_soc_component_update_bits(component, DA7213_ADC_R_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_L_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA7213_DAC_R_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7213_HP_L_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7213_HP_R_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); - snd_soc_update_bits(codec, DA7213_LINE_CTRL, + snd_soc_component_update_bits(component, DA7213_LINE_CTRL, DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN); /* @@ -1732,28 +1732,28 @@ static int da7213_probe(struct snd_soc_codec *codec) * being managed by DAPM while other (non power related) bits are * enabled here */ - snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXIN_L_CTRL, DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN); - snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXIN_R_CTRL, DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN); - snd_soc_update_bits(codec, DA7213_MIXOUT_L_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXOUT_L_CTRL, DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN); - snd_soc_update_bits(codec, DA7213_MIXOUT_R_CTRL, + snd_soc_component_update_bits(component, DA7213_MIXOUT_R_CTRL, DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN); - snd_soc_update_bits(codec, DA7213_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7213_HP_L_CTRL, DA7213_HP_AMP_OE, DA7213_HP_AMP_OE); - snd_soc_update_bits(codec, DA7213_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7213_HP_R_CTRL, DA7213_HP_AMP_OE, DA7213_HP_AMP_OE); - snd_soc_update_bits(codec, DA7213_LINE_CTRL, + snd_soc_component_update_bits(component, DA7213_LINE_CTRL, DA7213_LINE_AMP_OE, DA7213_LINE_AMP_OE); /* Handle DT/Platform data */ - da7213->pdata = dev_get_platdata(codec->dev); + da7213->pdata = dev_get_platdata(component->dev); if (!da7213->pdata) - da7213->pdata = da7213_fw_to_pdata(codec); + da7213->pdata = da7213_fw_to_pdata(component); /* Set platform data values */ if (da7213->pdata) { @@ -1779,7 +1779,7 @@ static int da7213_probe(struct snd_soc_codec *codec) DA7213_MICBIAS2_LEVEL_SHIFT); break; } - snd_soc_update_bits(codec, DA7213_MICBIAS_CTRL, + snd_soc_component_update_bits(component, DA7213_MICBIAS_CTRL, DA7213_MICBIAS1_LEVEL_MASK | DA7213_MICBIAS2_LEVEL_MASK, micbias_lvl); @@ -1805,14 +1805,14 @@ static int da7213_probe(struct snd_soc_codec *codec) DA7213_DMIC_CLK_RATE_SHIFT); break; } - snd_soc_update_bits(codec, DA7213_MIC_CONFIG, + snd_soc_component_update_bits(component, DA7213_MIC_CONFIG, DA7213_DMIC_DATA_SEL_MASK | DA7213_DMIC_SAMPLEPHASE_MASK | DA7213_DMIC_CLK_RATE_MASK, dmic_cfg); } /* Check if MCLK provided */ - da7213->mclk = devm_clk_get(codec->dev, "mclk"); + da7213->mclk = devm_clk_get(component->dev, "mclk"); if (IS_ERR(da7213->mclk)) { if (PTR_ERR(da7213->mclk) != -ENOENT) return PTR_ERR(da7213->mclk); @@ -1823,18 +1823,19 @@ static int da7213_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_da7213 = { +static const struct snd_soc_component_driver soc_component_dev_da7213 = { .probe = da7213_probe, .set_bias_level = da7213_set_bias_level, - - .component_driver = { - .controls = da7213_snd_controls, - .num_controls = ARRAY_SIZE(da7213_snd_controls), - .dapm_widgets = da7213_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da7213_dapm_widgets), - .dapm_routes = da7213_audio_map, - .num_dapm_routes = ARRAY_SIZE(da7213_audio_map), - }, + .controls = da7213_snd_controls, + .num_controls = ARRAY_SIZE(da7213_snd_controls), + .dapm_widgets = da7213_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da7213_dapm_widgets), + .dapm_routes = da7213_audio_map, + .num_dapm_routes = ARRAY_SIZE(da7213_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config da7213_regmap_config = { @@ -1866,21 +1867,15 @@ static int da7213_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_da7213, &da7213_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da7213, &da7213_dai, 1); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register da7213 codec: %d\n", + dev_err(&i2c->dev, "Failed to register da7213 component: %d\n", ret); } return ret; } -static int da7213_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id da7213_i2c_id[] = { { "da7213", 0 }, { } @@ -1895,7 +1890,6 @@ static struct i2c_driver da7213_i2c_driver = { .acpi_match_table = ACPI_PTR(da7213_acpi_match), }, .probe = da7213_i2c_probe, - .remove = da7213_remove, .id_table = da7213_i2c_id, }; diff --git a/sound/soc/codecs/da7218.c b/sound/soc/codecs/da7218.c index 96c644a15b11..ddc90ac0b19f 100644 --- a/sound/soc/codecs/da7218.c +++ b/sound/soc/codecs/da7218.c @@ -291,7 +291,7 @@ static const struct soc_enum da7218_cp_tau_delay = */ /* ALC */ -static void da7218_alc_calib(struct snd_soc_codec *codec) +static void da7218_alc_calib(struct snd_soc_component *component) { u8 mic_1_ctrl, mic_2_ctrl; u8 mixin_1_ctrl, mixin_2_ctrl; @@ -302,59 +302,59 @@ static void da7218_alc_calib(struct snd_soc_codec *codec) bool calibrated = false; /* Save current state of MIC control registers */ - mic_1_ctrl = snd_soc_read(codec, DA7218_MIC_1_CTRL); - mic_2_ctrl = snd_soc_read(codec, DA7218_MIC_2_CTRL); + mic_1_ctrl = snd_soc_component_read32(component, DA7218_MIC_1_CTRL); + mic_2_ctrl = snd_soc_component_read32(component, DA7218_MIC_2_CTRL); /* Save current state of input mixer control registers */ - mixin_1_ctrl = snd_soc_read(codec, DA7218_MIXIN_1_CTRL); - mixin_2_ctrl = snd_soc_read(codec, DA7218_MIXIN_2_CTRL); + mixin_1_ctrl = snd_soc_component_read32(component, DA7218_MIXIN_1_CTRL); + mixin_2_ctrl = snd_soc_component_read32(component, DA7218_MIXIN_2_CTRL); /* Save current state of input filter control registers */ - in_1l_filt_ctrl = snd_soc_read(codec, DA7218_IN_1L_FILTER_CTRL); - in_1r_filt_ctrl = snd_soc_read(codec, DA7218_IN_1R_FILTER_CTRL); - in_2l_filt_ctrl = snd_soc_read(codec, DA7218_IN_2L_FILTER_CTRL); - in_2r_filt_ctrl = snd_soc_read(codec, DA7218_IN_2R_FILTER_CTRL); + in_1l_filt_ctrl = snd_soc_component_read32(component, DA7218_IN_1L_FILTER_CTRL); + in_1r_filt_ctrl = snd_soc_component_read32(component, DA7218_IN_1R_FILTER_CTRL); + in_2l_filt_ctrl = snd_soc_component_read32(component, DA7218_IN_2L_FILTER_CTRL); + in_2r_filt_ctrl = snd_soc_component_read32(component, DA7218_IN_2R_FILTER_CTRL); /* Save current state of input HPF control registers */ - in_1_hpf_ctrl = snd_soc_read(codec, DA7218_IN_1_HPF_FILTER_CTRL); - in_2_hpf_ctrl = snd_soc_read(codec, DA7218_IN_2_HPF_FILTER_CTRL); + in_1_hpf_ctrl = snd_soc_component_read32(component, DA7218_IN_1_HPF_FILTER_CTRL); + in_2_hpf_ctrl = snd_soc_component_read32(component, DA7218_IN_2_HPF_FILTER_CTRL); /* Enable then Mute MIC PGAs */ - snd_soc_update_bits(codec, DA7218_MIC_1_CTRL, DA7218_MIC_1_AMP_EN_MASK, + snd_soc_component_update_bits(component, DA7218_MIC_1_CTRL, DA7218_MIC_1_AMP_EN_MASK, DA7218_MIC_1_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_MIC_2_CTRL, DA7218_MIC_2_AMP_EN_MASK, + snd_soc_component_update_bits(component, DA7218_MIC_2_CTRL, DA7218_MIC_2_AMP_EN_MASK, DA7218_MIC_2_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_MIC_1_CTRL, + snd_soc_component_update_bits(component, DA7218_MIC_1_CTRL, DA7218_MIC_1_AMP_MUTE_EN_MASK, DA7218_MIC_1_AMP_MUTE_EN_MASK); - snd_soc_update_bits(codec, DA7218_MIC_2_CTRL, + snd_soc_component_update_bits(component, DA7218_MIC_2_CTRL, DA7218_MIC_2_AMP_MUTE_EN_MASK, DA7218_MIC_2_AMP_MUTE_EN_MASK); /* Enable input mixers unmuted */ - snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL, + snd_soc_component_update_bits(component, DA7218_MIXIN_1_CTRL, DA7218_MIXIN_1_AMP_EN_MASK | DA7218_MIXIN_1_AMP_MUTE_EN_MASK, DA7218_MIXIN_1_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL, + snd_soc_component_update_bits(component, DA7218_MIXIN_2_CTRL, DA7218_MIXIN_2_AMP_EN_MASK | DA7218_MIXIN_2_AMP_MUTE_EN_MASK, DA7218_MIXIN_2_AMP_EN_MASK); /* Enable input filters unmuted */ - snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_1L_FILTER_CTRL, DA7218_IN_1L_FILTER_EN_MASK | DA7218_IN_1L_MUTE_EN_MASK, DA7218_IN_1L_FILTER_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_1R_FILTER_CTRL, DA7218_IN_1R_FILTER_EN_MASK | DA7218_IN_1R_MUTE_EN_MASK, DA7218_IN_1R_FILTER_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_2L_FILTER_CTRL, DA7218_IN_2L_FILTER_EN_MASK | DA7218_IN_2L_MUTE_EN_MASK, DA7218_IN_2L_FILTER_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_2R_FILTER_CTRL, DA7218_IN_2R_FILTER_EN_MASK | DA7218_IN_2R_MUTE_EN_MASK, DA7218_IN_2R_FILTER_EN_MASK); @@ -364,16 +364,16 @@ static void da7218_alc_calib(struct snd_soc_codec *codec) * rates above 32KHz the ADC signals will be stopped and will cause * calibration to lock up. */ - snd_soc_update_bits(codec, DA7218_IN_1_HPF_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_1_HPF_FILTER_CTRL, DA7218_IN_1_VOICE_EN_MASK, 0); - snd_soc_update_bits(codec, DA7218_IN_2_HPF_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_2_HPF_FILTER_CTRL, DA7218_IN_2_VOICE_EN_MASK, 0); /* Perform auto calibration */ - snd_soc_update_bits(codec, DA7218_CALIB_CTRL, DA7218_CALIB_AUTO_EN_MASK, + snd_soc_component_update_bits(component, DA7218_CALIB_CTRL, DA7218_CALIB_AUTO_EN_MASK, DA7218_CALIB_AUTO_EN_MASK); do { - calib_ctrl = snd_soc_read(codec, DA7218_CALIB_CTRL); + calib_ctrl = snd_soc_component_read32(component, DA7218_CALIB_CTRL); if (calib_ctrl & DA7218_CALIB_AUTO_EN_MASK) { ++i; usleep_range(DA7218_ALC_CALIB_DELAY_MIN, @@ -386,51 +386,51 @@ static void da7218_alc_calib(struct snd_soc_codec *codec) /* If auto calibration fails, disable DC offset, hybrid ALC */ if ((!calibrated) || (calib_ctrl & DA7218_CALIB_OVERFLOW_MASK)) { - dev_warn(codec->dev, + dev_warn(component->dev, "ALC auto calibration failed - %s\n", (calibrated) ? "overflow" : "timeout"); - snd_soc_update_bits(codec, DA7218_CALIB_CTRL, + snd_soc_component_update_bits(component, DA7218_CALIB_CTRL, DA7218_CALIB_OFFSET_EN_MASK, 0); - snd_soc_update_bits(codec, DA7218_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7218_ALC_CTRL1, DA7218_ALC_SYNC_MODE_MASK, 0); } else { /* Enable DC offset cancellation */ - snd_soc_update_bits(codec, DA7218_CALIB_CTRL, + snd_soc_component_update_bits(component, DA7218_CALIB_CTRL, DA7218_CALIB_OFFSET_EN_MASK, DA7218_CALIB_OFFSET_EN_MASK); /* Enable ALC hybrid mode */ - snd_soc_update_bits(codec, DA7218_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7218_ALC_CTRL1, DA7218_ALC_SYNC_MODE_MASK, DA7218_ALC_SYNC_MODE_CH1 | DA7218_ALC_SYNC_MODE_CH2); } /* Restore input HPF control registers to original states */ - snd_soc_write(codec, DA7218_IN_1_HPF_FILTER_CTRL, in_1_hpf_ctrl); - snd_soc_write(codec, DA7218_IN_2_HPF_FILTER_CTRL, in_2_hpf_ctrl); + snd_soc_component_write(component, DA7218_IN_1_HPF_FILTER_CTRL, in_1_hpf_ctrl); + snd_soc_component_write(component, DA7218_IN_2_HPF_FILTER_CTRL, in_2_hpf_ctrl); /* Restore input filter control registers to original states */ - snd_soc_write(codec, DA7218_IN_1L_FILTER_CTRL, in_1l_filt_ctrl); - snd_soc_write(codec, DA7218_IN_1R_FILTER_CTRL, in_1r_filt_ctrl); - snd_soc_write(codec, DA7218_IN_2L_FILTER_CTRL, in_2l_filt_ctrl); - snd_soc_write(codec, DA7218_IN_2R_FILTER_CTRL, in_2r_filt_ctrl); + snd_soc_component_write(component, DA7218_IN_1L_FILTER_CTRL, in_1l_filt_ctrl); + snd_soc_component_write(component, DA7218_IN_1R_FILTER_CTRL, in_1r_filt_ctrl); + snd_soc_component_write(component, DA7218_IN_2L_FILTER_CTRL, in_2l_filt_ctrl); + snd_soc_component_write(component, DA7218_IN_2R_FILTER_CTRL, in_2r_filt_ctrl); /* Restore input mixer control registers to original state */ - snd_soc_write(codec, DA7218_MIXIN_1_CTRL, mixin_1_ctrl); - snd_soc_write(codec, DA7218_MIXIN_2_CTRL, mixin_2_ctrl); + snd_soc_component_write(component, DA7218_MIXIN_1_CTRL, mixin_1_ctrl); + snd_soc_component_write(component, DA7218_MIXIN_2_CTRL, mixin_2_ctrl); /* Restore MIC control registers to original states */ - snd_soc_write(codec, DA7218_MIC_1_CTRL, mic_1_ctrl); - snd_soc_write(codec, DA7218_MIC_2_CTRL, mic_2_ctrl); + snd_soc_component_write(component, DA7218_MIC_1_CTRL, mic_1_ctrl); + snd_soc_component_write(component, DA7218_MIC_2_CTRL, mic_2_ctrl); } static int da7218_mixin_gain_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); int ret; ret = snd_soc_put_volsw(kcontrol, ucontrol); @@ -440,7 +440,7 @@ static int da7218_mixin_gain_put(struct snd_kcontrol *kcontrol, * make sure calibrated offsets are updated. */ if ((ret == 1) && (da7218->alc_en)) - da7218_alc_calib(codec); + da7218_alc_calib(component); return ret; } @@ -450,8 +450,8 @@ static int da7218_alc_sw_put(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *) kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); unsigned int lvalue = ucontrol->value.integer.value[0]; unsigned int rvalue = ucontrol->value.integer.value[1]; unsigned int lshift = mc->shift; @@ -460,7 +460,7 @@ static int da7218_alc_sw_put(struct snd_kcontrol *kcontrol, /* Force ALC offset calibration if enabling ALC */ if ((lvalue || rvalue) && (!da7218->alc_en)) - da7218_alc_calib(codec); + da7218_alc_calib(component); /* Update bits to detail which channels are enabled/disabled */ da7218->alc_en &= ~mask; @@ -473,8 +473,8 @@ static int da7218_alc_sw_put(struct snd_kcontrol *kcontrol, static int da7218_tonegen_freq_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int reg = mixer_ctrl->reg; @@ -497,8 +497,8 @@ static int da7218_tonegen_freq_get(struct snd_kcontrol *kcontrol, static int da7218_tonegen_freq_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int reg = mixer_ctrl->reg; @@ -517,8 +517,8 @@ static int da7218_tonegen_freq_put(struct snd_kcontrol *kcontrol, static int da7218_mic_lvl_det_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int lvalue = ucontrol->value.integer.value[0]; @@ -537,15 +537,15 @@ static int da7218_mic_lvl_det_sw_put(struct snd_kcontrol *kcontrol, * power the path (IN_FILTER widget events). This handling avoids * unwanted level detect events. */ - return snd_soc_write(codec, mixer_ctrl->reg, + return snd_soc_component_write(component, mixer_ctrl->reg, (da7218->in_filt_en & da7218->mic_lvl_det_en)); } static int da7218_mic_lvl_det_sw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int lshift = mixer_ctrl->shift; @@ -564,8 +564,8 @@ static int da7218_mic_lvl_det_sw_get(struct snd_kcontrol *kcontrol, static int da7218_biquad_coeff_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_bytes_ext *bytes_ext = (struct soc_bytes_ext *) kcontrol->private_value; @@ -589,8 +589,8 @@ static int da7218_biquad_coeff_get(struct snd_kcontrol *kcontrol, static int da7218_biquad_coeff_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct soc_bytes_ext *bytes_ext = (struct soc_bytes_ext *) kcontrol->private_value; u8 reg, out_filt1l; @@ -617,8 +617,8 @@ static int da7218_biquad_coeff_put(struct snd_kcontrol *kcontrol, } /* Make sure at least out filter1 enabled to allow programming */ - out_filt1l = snd_soc_read(codec, DA7218_OUT_1L_FILTER_CTRL); - snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL, + out_filt1l = snd_soc_component_read32(component, DA7218_OUT_1L_FILTER_CTRL); + snd_soc_component_write(component, DA7218_OUT_1L_FILTER_CTRL, out_filt1l | DA7218_OUT_1L_FILTER_EN_MASK); for (i = 0; i < bytes_ext->max; ++i) { @@ -628,7 +628,7 @@ static int da7218_biquad_coeff_put(struct snd_kcontrol *kcontrol, } /* Restore filter to previous setting */ - snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL, out_filt1l); + snd_soc_component_write(component, DA7218_OUT_1L_FILTER_CTRL, out_filt1l); return 0; } @@ -1349,8 +1349,8 @@ static const struct snd_kcontrol_new da7218_st_out_filtr_mix_controls[] = { static int da7218_in_filter_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); u8 mask; switch (w->reg) { @@ -1389,7 +1389,7 @@ static int da7218_in_filter_event(struct snd_soc_dapm_widget *w, } /* Enable configured level detection paths */ - snd_soc_write(codec, DA7218_LVL_DET_CTRL, + snd_soc_component_write(component, DA7218_LVL_DET_CTRL, (da7218->in_filt_en & da7218->mic_lvl_det_en)); return 0; @@ -1398,8 +1398,8 @@ static int da7218_in_filter_event(struct snd_soc_dapm_widget *w, static int da7218_dai_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, pll_status, refosc_cal; int i; bool success; @@ -1408,14 +1408,14 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_POST_PMU: if (da7218->master) /* Enable DAI clks for master mode */ - snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7218_DAI_CLK_MODE, DA7218_DAI_CLK_EN_MASK, DA7218_DAI_CLK_EN_MASK); /* Tune reference oscillator */ - snd_soc_write(codec, DA7218_PLL_REFOSC_CAL, + snd_soc_component_write(component, DA7218_PLL_REFOSC_CAL, DA7218_PLL_REFOSC_CAL_START_MASK); - snd_soc_write(codec, DA7218_PLL_REFOSC_CAL, + snd_soc_component_write(component, DA7218_PLL_REFOSC_CAL, DA7218_PLL_REFOSC_CAL_START_MASK | DA7218_PLL_REFOSC_CAL_EN_MASK); @@ -1423,7 +1423,7 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, i = 0; success = false; do { - refosc_cal = snd_soc_read(codec, DA7218_PLL_REFOSC_CAL); + refosc_cal = snd_soc_component_read32(component, DA7218_PLL_REFOSC_CAL); if (!(refosc_cal & DA7218_PLL_REFOSC_CAL_START_MASK)) { success = true; } else { @@ -1434,15 +1434,15 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, } while ((i < DA7218_REF_OSC_CHECK_TRIES) && (!success)); if (!success) - dev_warn(codec->dev, + dev_warn(component->dev, "Reference oscillator failed calibration\n"); /* PC synchronised to DAI */ - snd_soc_write(codec, DA7218_PC_COUNT, + snd_soc_component_write(component, DA7218_PC_COUNT, DA7218_PC_RESYNC_AUTO_MASK); /* If SRM not enabled, we don't need to check status */ - pll_ctrl = snd_soc_read(codec, DA7218_PLL_CTRL); + pll_ctrl = snd_soc_component_read32(component, DA7218_PLL_CTRL); if ((pll_ctrl & DA7218_PLL_MODE_MASK) != DA7218_PLL_MODE_SRM) return 0; @@ -1450,7 +1450,7 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, i = 0; success = false; do { - pll_status = snd_soc_read(codec, DA7218_PLL_STATUS); + pll_status = snd_soc_component_read32(component, DA7218_PLL_STATUS); if (pll_status & DA7218_PLL_SRM_STATUS_SRM_LOCK) { success = true; } else { @@ -1460,16 +1460,16 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, } while ((i < DA7218_SRM_CHECK_TRIES) && (!success)); if (!success) - dev_warn(codec->dev, "SRM failed to lock\n"); + dev_warn(component->dev, "SRM failed to lock\n"); return 0; case SND_SOC_DAPM_POST_PMD: /* PC free-running */ - snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK); + snd_soc_component_write(component, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK); if (da7218->master) /* Disable DAI clks for master mode */ - snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7218_DAI_CLK_MODE, DA7218_DAI_CLK_EN_MASK, 0); return 0; @@ -1481,8 +1481,8 @@ static int da7218_dai_event(struct snd_soc_dapm_widget *w, static int da7218_cp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); /* * If this is DA7217 and we're using single supply for differential @@ -1493,11 +1493,11 @@ static int da7218_cp_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK, + snd_soc_component_update_bits(component, DA7218_CP_CTRL, DA7218_CP_EN_MASK, DA7218_CP_EN_MASK); return 0; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK, + snd_soc_component_update_bits(component, DA7218_CP_CTRL, DA7218_CP_EN_MASK, 0); return 0; default: @@ -1508,17 +1508,17 @@ static int da7218_cp_event(struct snd_soc_dapm_widget *w, static int da7218_hp_pga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: /* Enable headphone output */ - snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK, + snd_soc_component_update_bits(component, w->reg, DA7218_HP_AMP_OE_MASK, DA7218_HP_AMP_OE_MASK); return 0; case SND_SOC_DAPM_PRE_PMD: /* Headphone output high impedance */ - snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK, 0); + snd_soc_component_update_bits(component, w->reg, DA7218_HP_AMP_OE_MASK, 0); return 0; default: return -EINVAL; @@ -1813,8 +1813,8 @@ static const struct snd_soc_dapm_route da7218_audio_map[] = { static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); int ret; if (da7218->mclk_rate == freq) @@ -1828,12 +1828,12 @@ static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai, switch (clk_id) { case DA7218_CLKSRC_MCLK_SQR: - snd_soc_update_bits(codec, DA7218_PLL_CTRL, + snd_soc_component_update_bits(component, DA7218_PLL_CTRL, DA7218_PLL_MCLK_SQR_EN_MASK, DA7218_PLL_MCLK_SQR_EN_MASK); break; case DA7218_CLKSRC_MCLK: - snd_soc_update_bits(codec, DA7218_PLL_CTRL, + snd_soc_component_update_bits(component, DA7218_PLL_CTRL, DA7218_PLL_MCLK_SQR_EN_MASK, 0); break; default: @@ -1859,8 +1859,8 @@ static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int fref, unsigned int fout) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, indiv_bits, indiv; u8 pll_frac_top, pll_frac_bot, pll_integer; @@ -1869,7 +1869,7 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, /* Verify 2MHz - 54MHz MCLK provided, and set input divider */ if (da7218->mclk_rate < 2000000) { - dev_err(codec->dev, "PLL input clock %d below valid range\n", + dev_err(component->dev, "PLL input clock %d below valid range\n", da7218->mclk_rate); return -EINVAL; } else if (da7218->mclk_rate <= 4500000) { @@ -1888,7 +1888,7 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, indiv_bits = DA7218_PLL_INDIV_36_TO_54_MHZ; indiv = DA7218_PLL_INDIV_36_TO_54_MHZ_VAL; } else { - dev_err(codec->dev, "PLL input clock %d above valid range\n", + dev_err(component->dev, "PLL input clock %d above valid range\n", da7218->mclk_rate); return -EINVAL; } @@ -1899,7 +1899,7 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, switch (source) { case DA7218_SYSCLK_MCLK: pll_ctrl |= DA7218_PLL_MODE_BYPASS; - snd_soc_update_bits(codec, DA7218_PLL_CTRL, + snd_soc_component_update_bits(component, DA7218_PLL_CTRL, DA7218_PLL_INDIV_MASK | DA7218_PLL_MODE_MASK, pll_ctrl); return 0; @@ -1910,7 +1910,7 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, pll_ctrl |= DA7218_PLL_MODE_SRM; break; default: - dev_err(codec->dev, "Invalid PLL config\n"); + dev_err(component->dev, "Invalid PLL config\n"); return -EINVAL; } @@ -1922,10 +1922,10 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, pll_frac_bot = (frac_div) & DA7218_BYTE_MASK; /* Write PLL config & dividers */ - snd_soc_write(codec, DA7218_PLL_FRAC_TOP, pll_frac_top); - snd_soc_write(codec, DA7218_PLL_FRAC_BOT, pll_frac_bot); - snd_soc_write(codec, DA7218_PLL_INTEGER, pll_integer); - snd_soc_update_bits(codec, DA7218_PLL_CTRL, + snd_soc_component_write(component, DA7218_PLL_FRAC_TOP, pll_frac_top); + snd_soc_component_write(component, DA7218_PLL_FRAC_BOT, pll_frac_bot); + snd_soc_component_write(component, DA7218_PLL_INTEGER, pll_integer); + snd_soc_component_update_bits(component, DA7218_PLL_CTRL, DA7218_PLL_MODE_MASK | DA7218_PLL_INDIV_MASK, pll_ctrl); @@ -1934,8 +1934,8 @@ static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, static int da7218_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); u8 dai_clk_mode = 0, dai_ctrl = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -2012,8 +2012,8 @@ static int da7218_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) /* By default 64 BCLKs per WCLK is supported */ dai_clk_mode |= DA7218_DAI_BCLKS_PER_WCLK_64; - snd_soc_write(codec, DA7218_DAI_CLK_MODE, dai_clk_mode); - snd_soc_update_bits(codec, DA7218_DAI_CTRL, DA7218_DAI_FORMAT_MASK, + snd_soc_component_write(component, DA7218_DAI_CLK_MODE, dai_clk_mode); + snd_soc_component_update_bits(component, DA7218_DAI_CTRL, DA7218_DAI_FORMAT_MASK, dai_ctrl); return 0; @@ -2023,16 +2023,16 @@ static int da7218_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 dai_bclks_per_wclk; u32 frame_size; /* No channels enabled so disable TDM, revert to 64-bit frames */ if (!tx_mask) { - snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL, + snd_soc_component_update_bits(component, DA7218_DAI_TDM_CTRL, DA7218_DAI_TDM_CH_EN_MASK | DA7218_DAI_TDM_MODE_EN_MASK, 0); - snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7218_DAI_CLK_MODE, DA7218_DAI_BCLKS_PER_WCLK_MASK, DA7218_DAI_BCLKS_PER_WCLK_64); return 0; @@ -2040,14 +2040,14 @@ static int da7218_set_dai_tdm_slot(struct snd_soc_dai *dai, /* Check we have valid slots */ if (fls(tx_mask) > DA7218_DAI_TDM_MAX_SLOTS) { - dev_err(codec->dev, "Invalid number of slots, max = %d\n", + dev_err(component->dev, "Invalid number of slots, max = %d\n", DA7218_DAI_TDM_MAX_SLOTS); return -EINVAL; } /* Check we have a valid offset given (first 2 bytes of rx_mask) */ if (rx_mask >> DA7218_2BYTE_SHIFT) { - dev_err(codec->dev, "Invalid slot offset, max = %d\n", + dev_err(component->dev, "Invalid slot offset, max = %d\n", DA7218_2BYTE_MASK); return -EINVAL; } @@ -2068,18 +2068,18 @@ static int da7218_set_dai_tdm_slot(struct snd_soc_dai *dai, dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_256; break; default: - dev_err(codec->dev, "Invalid frame size\n"); + dev_err(component->dev, "Invalid frame size\n"); return -EINVAL; } - snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7218_DAI_CLK_MODE, DA7218_DAI_BCLKS_PER_WCLK_MASK, dai_bclks_per_wclk); - snd_soc_write(codec, DA7218_DAI_OFFSET_LOWER, + snd_soc_component_write(component, DA7218_DAI_OFFSET_LOWER, (rx_mask & DA7218_BYTE_MASK)); - snd_soc_write(codec, DA7218_DAI_OFFSET_UPPER, + snd_soc_component_write(component, DA7218_DAI_OFFSET_UPPER, ((rx_mask >> DA7218_BYTE_SHIFT) & DA7218_BYTE_MASK)); - snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL, + snd_soc_component_update_bits(component, DA7218_DAI_TDM_CTRL, DA7218_DAI_TDM_CH_EN_MASK | DA7218_DAI_TDM_MODE_EN_MASK, (tx_mask << DA7218_DAI_TDM_CH_EN_SHIFT) | @@ -2092,7 +2092,7 @@ static int da7218_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 dai_ctrl = 0, fs; unsigned int channels; @@ -2115,7 +2115,7 @@ static int da7218_hw_params(struct snd_pcm_substream *substream, channels = params_channels(params); if ((channels < 1) || (channels > DA7218_DAI_CH_NUM_MAX)) { - dev_err(codec->dev, + dev_err(component->dev, "Invalid number of channels, only 1 to %d supported\n", DA7218_DAI_CH_NUM_MAX); return -EINVAL; @@ -2160,11 +2160,11 @@ static int da7218_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, DA7218_DAI_CTRL, + snd_soc_component_update_bits(component, DA7218_DAI_CTRL, DA7218_DAI_WORD_LENGTH_MASK | DA7218_DAI_CH_NUM_MASK, dai_ctrl); /* SRs tied for ADCs and DACs. */ - snd_soc_write(codec, DA7218_SR, + snd_soc_component_write(component, DA7218_SR, (fs << DA7218_SR_DAC_SHIFT) | (fs << DA7218_SR_ADC_SHIFT)); return 0; @@ -2208,15 +2208,15 @@ static struct snd_soc_dai_driver da7218_dai = { * HP Detect */ -int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +int da7218_hpldet(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); if (da7218->dev_id == DA7217_DEV_ID) return -EINVAL; da7218->jack = jack; - snd_soc_update_bits(codec, DA7218_HPLDET_JACK, + snd_soc_component_update_bits(component, DA7218_HPLDET_JACK, DA7218_HPLDET_JACK_EN_MASK, jack ? DA7218_HPLDET_JACK_EN_MASK : 0); @@ -2224,23 +2224,23 @@ int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack) } EXPORT_SYMBOL_GPL(da7218_hpldet); -static void da7218_micldet_irq(struct snd_soc_codec *codec) +static void da7218_micldet_irq(struct snd_soc_component *component) { char *envp[] = { "EVENT=MIC_LEVEL_DETECT", NULL, }; - kobject_uevent_env(&codec->dev->kobj, KOBJ_CHANGE, envp); + kobject_uevent_env(&component->dev->kobj, KOBJ_CHANGE, envp); } -static void da7218_hpldet_irq(struct snd_soc_codec *codec) +static void da7218_hpldet_irq(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); u8 jack_status; int report; - jack_status = snd_soc_read(codec, DA7218_EVENT_STATUS); + jack_status = snd_soc_component_read32(component, DA7218_EVENT_STATUS); if (jack_status & DA7218_HPLDET_JACK_STS_MASK) report = SND_JACK_HEADPHONE; @@ -2256,24 +2256,24 @@ static void da7218_hpldet_irq(struct snd_soc_codec *codec) static irqreturn_t da7218_irq_thread(int irq, void *data) { - struct snd_soc_codec *codec = data; + struct snd_soc_component *component = data; u8 status; /* Read IRQ status reg */ - status = snd_soc_read(codec, DA7218_EVENT); + status = snd_soc_component_read32(component, DA7218_EVENT); if (!status) return IRQ_NONE; /* Mic level detect */ if (status & DA7218_LVL_DET_EVENT_MASK) - da7218_micldet_irq(codec); + da7218_micldet_irq(component); /* HP detect */ if (status & DA7218_HPLDET_JACK_EVENT_MASK) - da7218_hpldet_irq(codec); + da7218_hpldet_irq(component); /* Clear interrupts */ - snd_soc_write(codec, DA7218_EVENT, status); + snd_soc_component_write(component, DA7218_EVENT, status); return IRQ_HANDLED; } @@ -2300,7 +2300,7 @@ static inline int da7218_of_get_id(struct device *dev) } static enum da7218_micbias_voltage - da7218_of_micbias_lvl(struct snd_soc_codec *codec, u32 val) + da7218_of_micbias_lvl(struct snd_soc_component *component, u32 val) { switch (val) { case 1200: @@ -2322,13 +2322,13 @@ static enum da7218_micbias_voltage case 3000: return DA7218_MICBIAS_3_0V; default: - dev_warn(codec->dev, "Invalid micbias level"); + dev_warn(component->dev, "Invalid micbias level"); return DA7218_MICBIAS_1_6V; } } static enum da7218_mic_amp_in_sel - da7218_of_mic_amp_in_sel(struct snd_soc_codec *codec, const char *str) + da7218_of_mic_amp_in_sel(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "diff")) { return DA7218_MIC_AMP_IN_SEL_DIFF; @@ -2337,39 +2337,39 @@ static enum da7218_mic_amp_in_sel } else if (!strcmp(str, "se_n")) { return DA7218_MIC_AMP_IN_SEL_SE_N; } else { - dev_warn(codec->dev, "Invalid mic input type selection"); + dev_warn(component->dev, "Invalid mic input type selection"); return DA7218_MIC_AMP_IN_SEL_DIFF; } } static enum da7218_dmic_data_sel - da7218_of_dmic_data_sel(struct snd_soc_codec *codec, const char *str) + da7218_of_dmic_data_sel(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "lrise_rfall")) { return DA7218_DMIC_DATA_LRISE_RFALL; } else if (!strcmp(str, "lfall_rrise")) { return DA7218_DMIC_DATA_LFALL_RRISE; } else { - dev_warn(codec->dev, "Invalid DMIC data type selection"); + dev_warn(component->dev, "Invalid DMIC data type selection"); return DA7218_DMIC_DATA_LRISE_RFALL; } } static enum da7218_dmic_samplephase - da7218_of_dmic_samplephase(struct snd_soc_codec *codec, const char *str) + da7218_of_dmic_samplephase(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "on_clkedge")) { return DA7218_DMIC_SAMPLE_ON_CLKEDGE; } else if (!strcmp(str, "between_clkedge")) { return DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE; } else { - dev_warn(codec->dev, "Invalid DMIC sample phase"); + dev_warn(component->dev, "Invalid DMIC sample phase"); return DA7218_DMIC_SAMPLE_ON_CLKEDGE; } } static enum da7218_dmic_clk_rate - da7218_of_dmic_clkrate(struct snd_soc_codec *codec, u32 val) + da7218_of_dmic_clkrate(struct snd_soc_component *component, u32 val) { switch (val) { case 1500000: @@ -2377,13 +2377,13 @@ static enum da7218_dmic_clk_rate case 3000000: return DA7218_DMIC_CLK_3_0MHZ; default: - dev_warn(codec->dev, "Invalid DMIC clock rate"); + dev_warn(component->dev, "Invalid DMIC clock rate"); return DA7218_DMIC_CLK_3_0MHZ; } } static enum da7218_hpldet_jack_rate - da7218_of_jack_rate(struct snd_soc_codec *codec, u32 val) + da7218_of_jack_rate(struct snd_soc_component *component, u32 val) { switch (val) { case 5: @@ -2403,13 +2403,13 @@ static enum da7218_hpldet_jack_rate case 640: return DA7218_HPLDET_JACK_RATE_640US; default: - dev_warn(codec->dev, "Invalid jack detect rate"); + dev_warn(component->dev, "Invalid jack detect rate"); return DA7218_HPLDET_JACK_RATE_40US; } } static enum da7218_hpldet_jack_debounce - da7218_of_jack_debounce(struct snd_soc_codec *codec, u32 val) + da7218_of_jack_debounce(struct snd_soc_component *component, u32 val) { switch (val) { case 0: @@ -2421,13 +2421,13 @@ static enum da7218_hpldet_jack_debounce case 4: return DA7218_HPLDET_JACK_DEBOUNCE_4; default: - dev_warn(codec->dev, "Invalid jack debounce"); + dev_warn(component->dev, "Invalid jack debounce"); return DA7218_HPLDET_JACK_DEBOUNCE_2; } } static enum da7218_hpldet_jack_thr - da7218_of_jack_thr(struct snd_soc_codec *codec, u32 val) + da7218_of_jack_thr(struct snd_soc_component *component, u32 val) { switch (val) { case 84: @@ -2439,76 +2439,76 @@ static enum da7218_hpldet_jack_thr case 96: return DA7218_HPLDET_JACK_THR_96PCT; default: - dev_warn(codec->dev, "Invalid jack threshold level"); + dev_warn(component->dev, "Invalid jack threshold level"); return DA7218_HPLDET_JACK_THR_84PCT; } } -static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) +static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); - struct device_node *np = codec->dev->of_node; + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); + struct device_node *np = component->dev->of_node; struct device_node *hpldet_np; struct da7218_pdata *pdata; struct da7218_hpldet_pdata *hpldet_pdata; const char *of_str; u32 of_val32; - pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL); + pdata = devm_kzalloc(component->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return NULL; if (of_property_read_u32(np, "dlg,micbias1-lvl-millivolt", &of_val32) >= 0) - pdata->micbias1_lvl = da7218_of_micbias_lvl(codec, of_val32); + pdata->micbias1_lvl = da7218_of_micbias_lvl(component, of_val32); else pdata->micbias1_lvl = DA7218_MICBIAS_1_6V; if (of_property_read_u32(np, "dlg,micbias2-lvl-millivolt", &of_val32) >= 0) - pdata->micbias2_lvl = da7218_of_micbias_lvl(codec, of_val32); + pdata->micbias2_lvl = da7218_of_micbias_lvl(component, of_val32); else pdata->micbias2_lvl = DA7218_MICBIAS_1_6V; if (!of_property_read_string(np, "dlg,mic1-amp-in-sel", &of_str)) pdata->mic1_amp_in_sel = - da7218_of_mic_amp_in_sel(codec, of_str); + da7218_of_mic_amp_in_sel(component, of_str); else pdata->mic1_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF; if (!of_property_read_string(np, "dlg,mic2-amp-in-sel", &of_str)) pdata->mic2_amp_in_sel = - da7218_of_mic_amp_in_sel(codec, of_str); + da7218_of_mic_amp_in_sel(component, of_str); else pdata->mic2_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF; if (!of_property_read_string(np, "dlg,dmic1-data-sel", &of_str)) - pdata->dmic1_data_sel = da7218_of_dmic_data_sel(codec, of_str); + pdata->dmic1_data_sel = da7218_of_dmic_data_sel(component, of_str); else pdata->dmic1_data_sel = DA7218_DMIC_DATA_LRISE_RFALL; if (!of_property_read_string(np, "dlg,dmic1-samplephase", &of_str)) pdata->dmic1_samplephase = - da7218_of_dmic_samplephase(codec, of_str); + da7218_of_dmic_samplephase(component, of_str); else pdata->dmic1_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE; if (of_property_read_u32(np, "dlg,dmic1-clkrate-hz", &of_val32) >= 0) - pdata->dmic1_clk_rate = da7218_of_dmic_clkrate(codec, of_val32); + pdata->dmic1_clk_rate = da7218_of_dmic_clkrate(component, of_val32); else pdata->dmic1_clk_rate = DA7218_DMIC_CLK_3_0MHZ; if (!of_property_read_string(np, "dlg,dmic2-data-sel", &of_str)) - pdata->dmic2_data_sel = da7218_of_dmic_data_sel(codec, of_str); + pdata->dmic2_data_sel = da7218_of_dmic_data_sel(component, of_str); else pdata->dmic2_data_sel = DA7218_DMIC_DATA_LRISE_RFALL; if (!of_property_read_string(np, "dlg,dmic2-samplephase", &of_str)) pdata->dmic2_samplephase = - da7218_of_dmic_samplephase(codec, of_str); + da7218_of_dmic_samplephase(component, of_str); else pdata->dmic2_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE; if (of_property_read_u32(np, "dlg,dmic2-clkrate-hz", &of_val32) >= 0) - pdata->dmic2_clk_rate = da7218_of_dmic_clkrate(codec, of_val32); + pdata->dmic2_clk_rate = da7218_of_dmic_clkrate(component, of_val32); else pdata->dmic2_clk_rate = DA7218_DMIC_CLK_3_0MHZ; @@ -2522,7 +2522,7 @@ static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) if (!hpldet_np) return pdata; - hpldet_pdata = devm_kzalloc(codec->dev, sizeof(*hpldet_pdata), + hpldet_pdata = devm_kzalloc(component->dev, sizeof(*hpldet_pdata), GFP_KERNEL); if (!hpldet_pdata) { of_node_put(hpldet_np); @@ -2533,14 +2533,14 @@ static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) if (of_property_read_u32(hpldet_np, "dlg,jack-rate-us", &of_val32) >= 0) hpldet_pdata->jack_rate = - da7218_of_jack_rate(codec, of_val32); + da7218_of_jack_rate(component, of_val32); else hpldet_pdata->jack_rate = DA7218_HPLDET_JACK_RATE_40US; if (of_property_read_u32(hpldet_np, "dlg,jack-debounce", &of_val32) >= 0) hpldet_pdata->jack_debounce = - da7218_of_jack_debounce(codec, of_val32); + da7218_of_jack_debounce(component, of_val32); else hpldet_pdata->jack_debounce = DA7218_HPLDET_JACK_DEBOUNCE_2; @@ -2548,7 +2548,7 @@ static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) if (of_property_read_u32(hpldet_np, "dlg,jack-threshold-pct", &of_val32) >= 0) hpldet_pdata->jack_thr = - da7218_of_jack_thr(codec, of_val32); + da7218_of_jack_thr(component, of_val32); else hpldet_pdata->jack_thr = DA7218_HPLDET_JACK_THR_84PCT; @@ -2572,10 +2572,10 @@ static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec) * Codec driver functions */ -static int da7218_set_bias_level(struct snd_soc_codec *codec, +static int da7218_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -2583,11 +2583,11 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_PREPARE: /* Enable MCLK for transition to ON state */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) { if (da7218->mclk) { ret = clk_prepare_enable(da7218->mclk); if (ret) { - dev_err(codec->dev, "Failed to enable mclk\n"); + dev_err(component->dev, "Failed to enable mclk\n"); return ret; } } @@ -2595,14 +2595,14 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Master bias */ - snd_soc_update_bits(codec, DA7218_REFERENCES, + snd_soc_component_update_bits(component, DA7218_REFERENCES, DA7218_BIAS_EN_MASK, DA7218_BIAS_EN_MASK); /* Internal LDO */ - snd_soc_update_bits(codec, DA7218_LDO_CTRL, + snd_soc_component_update_bits(component, DA7218_LDO_CTRL, DA7218_LDO_EN_MASK, DA7218_LDO_EN_MASK); } else { @@ -2615,11 +2615,11 @@ static int da7218_set_bias_level(struct snd_soc_codec *codec, /* Only disable if jack detection disabled */ if (!da7218->jack) { /* Internal LDO */ - snd_soc_update_bits(codec, DA7218_LDO_CTRL, + snd_soc_component_update_bits(component, DA7218_LDO_CTRL, DA7218_LDO_EN_MASK, 0); /* Master bias */ - snd_soc_update_bits(codec, DA7218_REFERENCES, + snd_soc_component_update_bits(component, DA7218_REFERENCES, DA7218_BIAS_EN_MASK, 0); } break; @@ -2634,9 +2634,9 @@ static const char *da7218_supply_names[DA7218_NUM_SUPPLIES] = { [DA7218_SUPPLY_VDDIO] = "VDDIO", }; -static int da7218_handle_supplies(struct snd_soc_codec *codec) +static int da7218_handle_supplies(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct regulator *vddio; u8 io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_2_5V_3_6V; int i, ret; @@ -2645,10 +2645,10 @@ static int da7218_handle_supplies(struct snd_soc_codec *codec) for (i = 0; i < DA7218_NUM_SUPPLIES; ++i) da7218->supplies[i].supply = da7218_supply_names[i]; - ret = devm_regulator_bulk_get(codec->dev, DA7218_NUM_SUPPLIES, + ret = devm_regulator_bulk_get(component->dev, DA7218_NUM_SUPPLIES, da7218->supplies); if (ret) { - dev_err(codec->dev, "Failed to get supplies\n"); + dev_err(component->dev, "Failed to get supplies\n"); return ret; } @@ -2656,29 +2656,29 @@ static int da7218_handle_supplies(struct snd_soc_codec *codec) vddio = da7218->supplies[DA7218_SUPPLY_VDDIO].consumer; ret = regulator_get_voltage(vddio); if (ret < 1500000) - dev_warn(codec->dev, "Invalid VDDIO voltage\n"); + dev_warn(component->dev, "Invalid VDDIO voltage\n"); else if (ret < 2500000) io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_1_5V_2_5V; /* Enable main supplies */ ret = regulator_bulk_enable(DA7218_NUM_SUPPLIES, da7218->supplies); if (ret) { - dev_err(codec->dev, "Failed to enable supplies\n"); + dev_err(component->dev, "Failed to enable supplies\n"); return ret; } /* Ensure device in active mode */ - snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, DA7218_SYSTEM_ACTIVE_MASK); + snd_soc_component_write(component, DA7218_SYSTEM_ACTIVE, DA7218_SYSTEM_ACTIVE_MASK); /* Update IO voltage level range */ - snd_soc_write(codec, DA7218_IO_CTRL, io_voltage_lvl); + snd_soc_component_write(component, DA7218_IO_CTRL, io_voltage_lvl); return 0; } -static void da7218_handle_pdata(struct snd_soc_codec *codec) +static void da7218_handle_pdata(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); struct da7218_pdata *pdata = da7218->pdata; if (pdata) { @@ -2719,14 +2719,14 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) break; } - snd_soc_write(codec, DA7218_MICBIAS_CTRL, micbias_lvl); + snd_soc_component_write(component, DA7218_MICBIAS_CTRL, micbias_lvl); /* Mic */ switch (pdata->mic1_amp_in_sel) { case DA7218_MIC_AMP_IN_SEL_DIFF: case DA7218_MIC_AMP_IN_SEL_SE_P: case DA7218_MIC_AMP_IN_SEL_SE_N: - snd_soc_write(codec, DA7218_MIC_1_SELECT, + snd_soc_component_write(component, DA7218_MIC_1_SELECT, pdata->mic1_amp_in_sel); break; } @@ -2735,7 +2735,7 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) case DA7218_MIC_AMP_IN_SEL_DIFF: case DA7218_MIC_AMP_IN_SEL_SE_P: case DA7218_MIC_AMP_IN_SEL_SE_N: - snd_soc_write(codec, DA7218_MIC_2_SELECT, + snd_soc_component_write(component, DA7218_MIC_2_SELECT, pdata->mic2_amp_in_sel); break; } @@ -2765,7 +2765,7 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) break; } - snd_soc_update_bits(codec, DA7218_DMIC_1_CTRL, + snd_soc_component_update_bits(component, DA7218_DMIC_1_CTRL, DA7218_DMIC_1_DATA_SEL_MASK | DA7218_DMIC_1_SAMPLEPHASE_MASK | DA7218_DMIC_1_CLK_RATE_MASK, dmic_cfg); @@ -2795,7 +2795,7 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) break; } - snd_soc_update_bits(codec, DA7218_DMIC_2_CTRL, + snd_soc_component_update_bits(component, DA7218_DMIC_2_CTRL, DA7218_DMIC_2_DATA_SEL_MASK | DA7218_DMIC_2_SAMPLEPHASE_MASK | DA7218_DMIC_2_CLK_RATE_MASK, dmic_cfg); @@ -2806,9 +2806,9 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) pdata->hp_diff_single_supply; if (da7218->hp_single_supply) { - snd_soc_write(codec, DA7218_HP_DIFF_UNLOCK, + snd_soc_component_write(component, DA7218_HP_DIFF_UNLOCK, DA7218_HP_DIFF_UNLOCK_VAL); - snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL, + snd_soc_component_update_bits(component, DA7218_HP_DIFF_CTRL, DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK, DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK); } @@ -2857,7 +2857,7 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) DA7218_HPLDET_JACK_THR_SHIFT); break; } - snd_soc_update_bits(codec, DA7218_HPLDET_JACK, + snd_soc_component_update_bits(component, DA7218_HPLDET_JACK, DA7218_HPLDET_JACK_RATE_MASK | DA7218_HPLDET_JACK_DEBOUNCE_MASK | DA7218_HPLDET_JACK_THR_MASK, @@ -2873,31 +2873,31 @@ static void da7218_handle_pdata(struct snd_soc_codec *codec) if (hpldet_pdata->discharge) hpldet_cfg |= DA7218_HPLDET_DISCHARGE_EN_MASK; - snd_soc_write(codec, DA7218_HPLDET_CTRL, hpldet_cfg); + snd_soc_component_write(component, DA7218_HPLDET_CTRL, hpldet_cfg); } } } -static int da7218_probe(struct snd_soc_codec *codec) +static int da7218_probe(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); int ret; /* Regulator configuration */ - ret = da7218_handle_supplies(codec); + ret = da7218_handle_supplies(component); if (ret) return ret; /* Handle DT/Platform data */ - if (codec->dev->of_node) - da7218->pdata = da7218_of_to_pdata(codec); + if (component->dev->of_node) + da7218->pdata = da7218_of_to_pdata(component); else - da7218->pdata = dev_get_platdata(codec->dev); + da7218->pdata = dev_get_platdata(component->dev); - da7218_handle_pdata(codec); + da7218_handle_pdata(component); /* Check if MCLK provided, if not the clock is NULL */ - da7218->mclk = devm_clk_get(codec->dev, "mclk"); + da7218->mclk = devm_clk_get(component->dev, "mclk"); if (IS_ERR(da7218->mclk)) { if (PTR_ERR(da7218->mclk) != -ENOENT) { ret = PTR_ERR(da7218->mclk); @@ -2908,74 +2908,74 @@ static int da7218_probe(struct snd_soc_codec *codec) } /* Default PC to free-running */ - snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK); + snd_soc_component_write(component, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK); /* * Default Output Filter mixers to off otherwise DAPM will power * Mic to HP passthrough paths by default at startup. */ - snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1L, 0); - snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1R, 0); + snd_soc_component_write(component, DA7218_DROUTING_OUTFILT_1L, 0); + snd_soc_component_write(component, DA7218_DROUTING_OUTFILT_1R, 0); /* Default CP to normal load, power mode */ - snd_soc_update_bits(codec, DA7218_CP_CTRL, + snd_soc_component_update_bits(component, DA7218_CP_CTRL, DA7218_CP_SMALL_SWITCH_FREQ_EN_MASK, 0); /* Default gain ramping */ - snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL, + snd_soc_component_update_bits(component, DA7218_MIXIN_1_CTRL, DA7218_MIXIN_1_AMP_RAMP_EN_MASK, DA7218_MIXIN_1_AMP_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL, + snd_soc_component_update_bits(component, DA7218_MIXIN_2_CTRL, DA7218_MIXIN_2_AMP_RAMP_EN_MASK, DA7218_MIXIN_2_AMP_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_1L_FILTER_CTRL, DA7218_IN_1L_RAMP_EN_MASK, DA7218_IN_1L_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_1R_FILTER_CTRL, DA7218_IN_1R_RAMP_EN_MASK, DA7218_IN_1R_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_2L_FILTER_CTRL, DA7218_IN_2L_RAMP_EN_MASK, DA7218_IN_2L_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_IN_2R_FILTER_CTRL, DA7218_IN_2R_RAMP_EN_MASK, DA7218_IN_2R_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_DGS_GAIN_CTRL, + snd_soc_component_update_bits(component, DA7218_DGS_GAIN_CTRL, DA7218_DGS_RAMP_EN_MASK, DA7218_DGS_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_OUT_1L_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_OUT_1L_FILTER_CTRL, DA7218_OUT_1L_RAMP_EN_MASK, DA7218_OUT_1L_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_OUT_1R_FILTER_CTRL, + snd_soc_component_update_bits(component, DA7218_OUT_1R_FILTER_CTRL, DA7218_OUT_1R_RAMP_EN_MASK, DA7218_OUT_1R_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7218_HP_L_CTRL, DA7218_HP_L_AMP_RAMP_EN_MASK, DA7218_HP_L_AMP_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7218_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7218_HP_R_CTRL, DA7218_HP_R_AMP_RAMP_EN_MASK, DA7218_HP_R_AMP_RAMP_EN_MASK); /* Default infinite tone gen, start/stop by Kcontrol */ - snd_soc_write(codec, DA7218_TONE_GEN_CYCLES, DA7218_BEEP_CYCLES_MASK); + snd_soc_component_write(component, DA7218_TONE_GEN_CYCLES, DA7218_BEEP_CYCLES_MASK); /* DA7217 specific config */ if (da7218->dev_id == DA7217_DEV_ID) { - snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL, + snd_soc_component_update_bits(component, DA7218_HP_DIFF_CTRL, DA7218_HP_AMP_DIFF_MODE_EN_MASK, DA7218_HP_AMP_DIFF_MODE_EN_MASK); /* Only DA7218 supports HP detect, mask off for DA7217 */ - snd_soc_write(codec, DA7218_EVENT_MASK, + snd_soc_component_write(component, DA7218_EVENT_MASK, DA7218_HPLDET_JACK_EVENT_IRQ_MSK_MASK); } if (da7218->irq) { - ret = devm_request_threaded_irq(codec->dev, da7218->irq, NULL, + ret = devm_request_threaded_irq(component->dev, da7218->irq, NULL, da7218_irq_thread, IRQF_TRIGGER_LOW | IRQF_ONESHOT, - "da7218", codec); + "da7218", component); if (ret != 0) { - dev_err(codec->dev, "Failed to request IRQ %d: %d\n", + dev_err(component->dev, "Failed to request IRQ %d: %d\n", da7218->irq, ret); goto err_disable_reg; } @@ -2990,39 +2990,37 @@ err_disable_reg: return ret; } -static int da7218_remove(struct snd_soc_codec *codec) +static void da7218_remove(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies); - - return 0; } #ifdef CONFIG_PM -static int da7218_suspend(struct snd_soc_codec *codec) +static int da7218_suspend(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); - da7218_set_bias_level(codec, SND_SOC_BIAS_OFF); + da7218_set_bias_level(component, SND_SOC_BIAS_OFF); /* Put device into standby mode if jack detection disabled */ if (!da7218->jack) - snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, 0); + snd_soc_component_write(component, DA7218_SYSTEM_ACTIVE, 0); return 0; } -static int da7218_resume(struct snd_soc_codec *codec) +static int da7218_resume(struct snd_soc_component *component) { - struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec); + struct da7218_priv *da7218 = snd_soc_component_get_drvdata(component); /* Put device into active mode if previously moved to standby */ if (!da7218->jack) - snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, + snd_soc_component_write(component, DA7218_SYSTEM_ACTIVE, DA7218_SYSTEM_ACTIVE_MASK); - da7218_set_bias_level(codec, SND_SOC_BIAS_STANDBY); + da7218_set_bias_level(component, SND_SOC_BIAS_STANDBY); return 0; } @@ -3031,21 +3029,22 @@ static int da7218_resume(struct snd_soc_codec *codec) #define da7218_resume NULL #endif -static const struct snd_soc_codec_driver soc_codec_dev_da7218 = { +static const struct snd_soc_component_driver soc_component_dev_da7218 = { .probe = da7218_probe, .remove = da7218_remove, .suspend = da7218_suspend, .resume = da7218_resume, .set_bias_level = da7218_set_bias_level, - - .component_driver = { - .controls = da7218_snd_controls, - .num_controls = ARRAY_SIZE(da7218_snd_controls), - .dapm_widgets = da7218_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da7218_dapm_widgets), - .dapm_routes = da7218_audio_map, - .num_dapm_routes = ARRAY_SIZE(da7218_audio_map), - }, + .controls = da7218_snd_controls, + .num_controls = ARRAY_SIZE(da7218_snd_controls), + .dapm_widgets = da7218_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da7218_dapm_widgets), + .dapm_routes = da7218_audio_map, + .num_dapm_routes = ARRAY_SIZE(da7218_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; @@ -3295,21 +3294,15 @@ static int da7218_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_da7218, &da7218_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da7218, &da7218_dai, 1); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register da7218 codec: %d\n", + dev_err(&i2c->dev, "Failed to register da7218 component: %d\n", ret); } return ret; } -static int da7218_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id da7218_i2c_id[] = { { "da7217", DA7217_DEV_ID }, { "da7218", DA7218_DEV_ID }, @@ -3323,7 +3316,6 @@ static struct i2c_driver da7218_i2c_driver = { .of_match_table = of_match_ptr(da7218_of_match), }, .probe = da7218_i2c_probe, - .remove = da7218_i2c_remove, .id_table = da7218_i2c_id, }; diff --git a/sound/soc/codecs/da7218.h b/sound/soc/codecs/da7218.h index 4f7ec21069a4..19e6cee2e42e 100644 --- a/sound/soc/codecs/da7218.h +++ b/sound/soc/codecs/da7218.h @@ -1410,6 +1410,6 @@ struct da7218_priv { }; /* HP detect control */ -int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +int da7218_hpldet(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif /* _DA7218_H */ diff --git a/sound/soc/codecs/da7219-aad.c b/sound/soc/codecs/da7219-aad.c index 1d1d10dd92ae..a49ab751a036 100644 --- a/sound/soc/codecs/da7219-aad.c +++ b/sound/soc/codecs/da7219-aad.c @@ -32,9 +32,9 @@ * Detection control */ -void da7219_aad_jack_det(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +void da7219_aad_jack_det(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); da7219->aad->jack = jack; da7219->aad->jack_inserted = false; @@ -43,7 +43,7 @@ void da7219_aad_jack_det(struct snd_soc_codec *codec, struct snd_soc_jack *jack) snd_soc_jack_report(jack, 0, DA7219_AAD_REPORT_ALL_MASK); /* Enable/Disable jack detection */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_ACCDET_EN_MASK, (jack ? DA7219_ACCDET_EN_MASK : 0)); } @@ -57,17 +57,17 @@ static void da7219_aad_btn_det_work(struct work_struct *work) { struct da7219_aad_priv *da7219_aad = container_of(work, struct da7219_aad_priv, btn_det_work); - struct snd_soc_codec *codec = da7219_aad->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = da7219_aad->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); u8 statusa, micbias_ctrl; bool micbias_up = false; int retries = 0; /* Drive headphones/lineout */ - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK, DA7219_HP_L_AMP_OE_MASK); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK, DA7219_HP_R_AMP_OE_MASK); @@ -76,7 +76,7 @@ static void da7219_aad_btn_det_work(struct work_struct *work) snd_soc_dapm_sync(dapm); do { - statusa = snd_soc_read(codec, DA7219_ACCDET_STATUS_A); + statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); if (statusa & DA7219_MICBIAS_UP_STS_MASK) micbias_up = true; else if (retries++ < DA7219_AAD_MICBIAS_CHK_RETRIES) @@ -84,7 +84,7 @@ static void da7219_aad_btn_det_work(struct work_struct *work) } while ((!micbias_up) && (retries < DA7219_AAD_MICBIAS_CHK_RETRIES)); if (retries >= DA7219_AAD_MICBIAS_CHK_RETRIES) - dev_warn(codec->dev, "Mic bias status check timed out"); + dev_warn(component->dev, "Mic bias status check timed out"); /* * Mic bias pulse required to enable mic, must be done before enabling @@ -92,16 +92,16 @@ static void da7219_aad_btn_det_work(struct work_struct *work) */ if (da7219_aad->micbias_pulse_lvl && da7219_aad->micbias_pulse_time) { /* Pulse higher level voltage */ - micbias_ctrl = snd_soc_read(codec, DA7219_MICBIAS_CTRL); - snd_soc_update_bits(codec, DA7219_MICBIAS_CTRL, + micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); + snd_soc_component_update_bits(component, DA7219_MICBIAS_CTRL, DA7219_MICBIAS1_LEVEL_MASK, da7219_aad->micbias_pulse_lvl); msleep(da7219_aad->micbias_pulse_time); - snd_soc_write(codec, DA7219_MICBIAS_CTRL, micbias_ctrl); + snd_soc_component_write(component, DA7219_MICBIAS_CTRL, micbias_ctrl); } - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_BUTTON_CONFIG_MASK, da7219_aad->btn_cfg); } @@ -110,9 +110,9 @@ static void da7219_aad_hptest_work(struct work_struct *work) { struct da7219_aad_priv *da7219_aad = container_of(work, struct da7219_aad_priv, hptest_work); - struct snd_soc_codec *codec = da7219_aad->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = da7219_aad->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u16 tonegen_freq_hptest; u8 pll_srm_sts, pll_ctrl, gain_ramp_ctrl, accdet_cfg8; @@ -127,7 +127,7 @@ static void da7219_aad_hptest_work(struct work_struct *work) if (da7219->mclk) { ret = clk_prepare_enable(da7219->mclk); if (ret) { - dev_err(codec->dev, "Failed to enable mclk - %d\n", ret); + dev_err(component->dev, "Failed to enable mclk - %d\n", ret); mutex_unlock(&da7219->pll_lock); mutex_unlock(&da7219->ctrl_lock); snd_soc_dapm_mutex_unlock(dapm); @@ -142,90 +142,90 @@ static void da7219_aad_hptest_work(struct work_struct *work) * If MCLK is present, but PLL is not enabled then we enable it here to * ensure a consistent detection procedure. */ - pll_srm_sts = snd_soc_read(codec, DA7219_PLL_SRM_STS); + pll_srm_sts = snd_soc_component_read32(component, DA7219_PLL_SRM_STS); if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) { tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ); - pll_ctrl = snd_soc_read(codec, DA7219_PLL_CTRL); + pll_ctrl = snd_soc_component_read32(component, DA7219_PLL_CTRL); if ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS) - da7219_set_pll(codec, DA7219_SYSCLK_PLL, + da7219_set_pll(component, DA7219_SYSCLK_PLL, DA7219_PLL_FREQ_OUT_98304); } else { tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ_INT_OSC); } /* Ensure gain ramping at fastest rate */ - gain_ramp_ctrl = snd_soc_read(codec, DA7219_GAIN_RAMP_CTRL); - snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8); + gain_ramp_ctrl = snd_soc_component_read32(component, DA7219_GAIN_RAMP_CTRL); + snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8); /* Bypass cache so it saves current settings */ regcache_cache_bypass(da7219->regmap, true); /* Make sure Tone Generator is disabled */ - snd_soc_write(codec, DA7219_TONE_GEN_CFG1, 0); + snd_soc_component_write(component, DA7219_TONE_GEN_CFG1, 0); /* Enable HPTest block, 1KOhms check */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_8, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_8, DA7219_HPTEST_EN_MASK | DA7219_HPTEST_RES_SEL_MASK, DA7219_HPTEST_EN_MASK | DA7219_HPTEST_RES_SEL_1KOHMS); /* Set gains to 0db */ - snd_soc_write(codec, DA7219_DAC_L_GAIN, DA7219_DAC_DIGITAL_GAIN_0DB); - snd_soc_write(codec, DA7219_DAC_R_GAIN, DA7219_DAC_DIGITAL_GAIN_0DB); - snd_soc_write(codec, DA7219_HP_L_GAIN, DA7219_HP_AMP_GAIN_0DB); - snd_soc_write(codec, DA7219_HP_R_GAIN, DA7219_HP_AMP_GAIN_0DB); + snd_soc_component_write(component, DA7219_DAC_L_GAIN, DA7219_DAC_DIGITAL_GAIN_0DB); + snd_soc_component_write(component, DA7219_DAC_R_GAIN, DA7219_DAC_DIGITAL_GAIN_0DB); + snd_soc_component_write(component, DA7219_HP_L_GAIN, DA7219_HP_AMP_GAIN_0DB); + snd_soc_component_write(component, DA7219_HP_R_GAIN, DA7219_HP_AMP_GAIN_0DB); /* Disable DAC filters, EQs and soft mute */ - snd_soc_update_bits(codec, DA7219_DAC_FILTERS1, DA7219_HPF_MODE_MASK, + snd_soc_component_update_bits(component, DA7219_DAC_FILTERS1, DA7219_HPF_MODE_MASK, 0); - snd_soc_update_bits(codec, DA7219_DAC_FILTERS4, DA7219_DAC_EQ_EN_MASK, + snd_soc_component_update_bits(component, DA7219_DAC_FILTERS4, DA7219_DAC_EQ_EN_MASK, 0); - snd_soc_update_bits(codec, DA7219_DAC_FILTERS5, + snd_soc_component_update_bits(component, DA7219_DAC_FILTERS5, DA7219_DAC_SOFTMUTE_EN_MASK, 0); /* Enable HP left & right paths */ - snd_soc_update_bits(codec, DA7219_CP_CTRL, DA7219_CP_EN_MASK, + snd_soc_component_update_bits(component, DA7219_CP_CTRL, DA7219_CP_EN_MASK, DA7219_CP_EN_MASK); - snd_soc_update_bits(codec, DA7219_DIG_ROUTING_DAC, + snd_soc_component_update_bits(component, DA7219_DIG_ROUTING_DAC, DA7219_DAC_L_SRC_MASK | DA7219_DAC_R_SRC_MASK, DA7219_DAC_L_SRC_TONEGEN | DA7219_DAC_R_SRC_TONEGEN); - snd_soc_update_bits(codec, DA7219_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA7219_DAC_L_CTRL, DA7219_DAC_L_EN_MASK | DA7219_DAC_L_MUTE_EN_MASK, DA7219_DAC_L_EN_MASK); - snd_soc_update_bits(codec, DA7219_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA7219_DAC_R_CTRL, DA7219_DAC_R_EN_MASK | DA7219_DAC_R_MUTE_EN_MASK, DA7219_DAC_R_EN_MASK); - snd_soc_update_bits(codec, DA7219_MIXOUT_L_SELECT, + snd_soc_component_update_bits(component, DA7219_MIXOUT_L_SELECT, DA7219_MIXOUT_L_MIX_SELECT_MASK, DA7219_MIXOUT_L_MIX_SELECT_MASK); - snd_soc_update_bits(codec, DA7219_MIXOUT_R_SELECT, + snd_soc_component_update_bits(component, DA7219_MIXOUT_R_SELECT, DA7219_MIXOUT_R_MIX_SELECT_MASK, DA7219_MIXOUT_R_MIX_SELECT_MASK); - snd_soc_update_bits(codec, DA7219_DROUTING_ST_OUTFILT_1L, + snd_soc_component_update_bits(component, DA7219_DROUTING_ST_OUTFILT_1L, DA7219_OUTFILT_ST_1L_SRC_MASK, DA7219_DMIX_ST_SRC_OUTFILT1L); - snd_soc_update_bits(codec, DA7219_DROUTING_ST_OUTFILT_1R, + snd_soc_component_update_bits(component, DA7219_DROUTING_ST_OUTFILT_1R, DA7219_OUTFILT_ST_1R_SRC_MASK, DA7219_DMIX_ST_SRC_OUTFILT1R); - snd_soc_update_bits(codec, DA7219_MIXOUT_L_CTRL, + snd_soc_component_update_bits(component, DA7219_MIXOUT_L_CTRL, DA7219_MIXOUT_L_AMP_EN_MASK, DA7219_MIXOUT_L_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_MIXOUT_R_CTRL, + snd_soc_component_update_bits(component, DA7219_MIXOUT_R_CTRL, DA7219_MIXOUT_R_AMP_EN_MASK, DA7219_MIXOUT_R_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK | DA7219_HP_L_AMP_EN_MASK, DA7219_HP_L_AMP_OE_MASK | DA7219_HP_L_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK | DA7219_HP_R_AMP_EN_MASK, DA7219_HP_R_AMP_OE_MASK | DA7219_HP_R_AMP_EN_MASK); msleep(DA7219_SETTLING_DELAY); - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_MUTE_EN_MASK | DA7219_HP_L_AMP_MIN_GAIN_EN_MASK, 0); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_MUTE_EN_MASK | DA7219_HP_R_AMP_MIN_GAIN_EN_MASK, 0); @@ -237,26 +237,26 @@ static void da7219_aad_hptest_work(struct work_struct *work) msleep(DA7219_AAD_HPTEST_INT_OSC_PATH_DELAY); /* Configure & start Tone Generator */ - snd_soc_write(codec, DA7219_TONE_GEN_ON_PER, DA7219_BEEP_ON_PER_MASK); + snd_soc_component_write(component, DA7219_TONE_GEN_ON_PER, DA7219_BEEP_ON_PER_MASK); regmap_raw_write(da7219->regmap, DA7219_TONE_GEN_FREQ1_L, &tonegen_freq_hptest, sizeof(tonegen_freq_hptest)); - snd_soc_update_bits(codec, DA7219_TONE_GEN_CFG2, + snd_soc_component_update_bits(component, DA7219_TONE_GEN_CFG2, DA7219_SWG_SEL_MASK | DA7219_TONE_GEN_GAIN_MASK, DA7219_SWG_SEL_SRAMP | DA7219_TONE_GEN_GAIN_MINUS_15DB); - snd_soc_write(codec, DA7219_TONE_GEN_CFG1, DA7219_START_STOPN_MASK); + snd_soc_component_write(component, DA7219_TONE_GEN_CFG1, DA7219_START_STOPN_MASK); msleep(DA7219_AAD_HPTEST_PERIOD); /* Grab comparator reading */ - accdet_cfg8 = snd_soc_read(codec, DA7219_ACCDET_CONFIG_8); + accdet_cfg8 = snd_soc_component_read32(component, DA7219_ACCDET_CONFIG_8); if (accdet_cfg8 & DA7219_HPTEST_COMP_MASK) report |= SND_JACK_HEADPHONE; else report |= SND_JACK_LINEOUT; /* Stop tone generator */ - snd_soc_write(codec, DA7219_TONE_GEN_CFG1, 0); + snd_soc_component_write(component, DA7219_TONE_GEN_CFG1, 0); msleep(DA7219_AAD_HPTEST_PERIOD); @@ -294,7 +294,7 @@ static void da7219_aad_hptest_work(struct work_struct *work) regcache_cache_bypass(da7219->regmap, false); /* Disable HPTest block */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_8, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_8, DA7219_HPTEST_EN_MASK, 0); /* @@ -305,18 +305,18 @@ static void da7219_aad_hptest_work(struct work_struct *work) msleep(DA7219_AAD_HPTEST_INT_OSC_PATH_DELAY); /* Restore gain ramping rate */ - snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL, gain_ramp_ctrl); + snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, gain_ramp_ctrl); /* Drive Headphones/lineout */ - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK, DA7219_HP_L_AMP_OE_MASK); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK, DA7219_HP_R_AMP_OE_MASK); /* Restore PLL to previous configuration, if re-configured */ if ((pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) && ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS)) - da7219_set_pll(codec, DA7219_SYSCLK_MCLK, 0); + da7219_set_pll(component, DA7219_SYSCLK_MCLK, 0); /* Remove MCLK, if previously enabled */ if (da7219->mclk) @@ -343,9 +343,9 @@ static void da7219_aad_hptest_work(struct work_struct *work) static irqreturn_t da7219_aad_irq_thread(int irq, void *data) { struct da7219_aad_priv *da7219_aad = data; - struct snd_soc_codec *codec = da7219_aad->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = da7219_aad->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u8 events[DA7219_AAD_IRQ_REG_MAX]; u8 statusa; int i, report = 0, mask = 0; @@ -358,13 +358,13 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data) return IRQ_NONE; /* Read status register for jack insertion & type status */ - statusa = snd_soc_read(codec, DA7219_ACCDET_STATUS_A); + statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); /* Clear events */ regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, events, DA7219_AAD_IRQ_REG_MAX); - dev_dbg(codec->dev, "IRQ events = 0x%x|0x%x, status = 0x%x\n", + dev_dbg(component->dev, "IRQ events = 0x%x|0x%x, status = 0x%x\n", events[DA7219_AAD_IRQ_REG_A], events[DA7219_AAD_IRQ_REG_B], statusa); @@ -430,13 +430,13 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data) da7219_aad->jack_inserted = false; /* Un-drive headphones/lineout */ - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK, 0); - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK, 0); /* Ensure button detection disabled */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_BUTTON_CONFIG_MASK, 0); /* Disable mic bias */ @@ -459,7 +459,7 @@ static irqreturn_t da7219_aad_irq_thread(int irq, void *data) */ static enum da7219_aad_micbias_pulse_lvl - da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_component *component, u32 val) { switch (val) { case 2800: @@ -467,13 +467,13 @@ static enum da7219_aad_micbias_pulse_lvl case 2900: return DA7219_AAD_MICBIAS_PULSE_LVL_2_9V; default: - dev_warn(codec->dev, "Invalid micbias pulse level"); + dev_warn(component->dev, "Invalid micbias pulse level"); return DA7219_AAD_MICBIAS_PULSE_LVL_OFF; } } static enum da7219_aad_btn_cfg - da7219_aad_fw_btn_cfg(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_btn_cfg(struct snd_soc_component *component, u32 val) { switch (val) { case 2: @@ -491,13 +491,13 @@ static enum da7219_aad_btn_cfg case 500: return DA7219_AAD_BTN_CFG_500MS; default: - dev_warn(codec->dev, "Invalid button config"); + dev_warn(component->dev, "Invalid button config"); return DA7219_AAD_BTN_CFG_10MS; } } static enum da7219_aad_mic_det_thr - da7219_aad_fw_mic_det_thr(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_mic_det_thr(struct snd_soc_component *component, u32 val) { switch (val) { case 200: @@ -509,13 +509,13 @@ static enum da7219_aad_mic_det_thr case 1000: return DA7219_AAD_MIC_DET_THR_1000_OHMS; default: - dev_warn(codec->dev, "Invalid mic detect threshold"); + dev_warn(component->dev, "Invalid mic detect threshold"); return DA7219_AAD_MIC_DET_THR_500_OHMS; } } static enum da7219_aad_jack_ins_deb - da7219_aad_fw_jack_ins_deb(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_jack_ins_deb(struct snd_soc_component *component, u32 val) { switch (val) { case 5: @@ -535,13 +535,13 @@ static enum da7219_aad_jack_ins_deb case 1000: return DA7219_AAD_JACK_INS_DEB_1S; default: - dev_warn(codec->dev, "Invalid jack insert debounce"); + dev_warn(component->dev, "Invalid jack insert debounce"); return DA7219_AAD_JACK_INS_DEB_20MS; } } static enum da7219_aad_jack_det_rate - da7219_aad_fw_jack_det_rate(struct snd_soc_codec *codec, const char *str) + da7219_aad_fw_jack_det_rate(struct snd_soc_component *component, const char *str) { if (!strcmp(str, "32ms_64ms")) { return DA7219_AAD_JACK_DET_RATE_32_64MS; @@ -552,13 +552,13 @@ static enum da7219_aad_jack_det_rate } else if (!strcmp(str, "256ms_512ms")) { return DA7219_AAD_JACK_DET_RATE_256_512MS; } else { - dev_warn(codec->dev, "Invalid jack detect rate"); + dev_warn(component->dev, "Invalid jack detect rate"); return DA7219_AAD_JACK_DET_RATE_256_512MS; } } static enum da7219_aad_jack_rem_deb - da7219_aad_fw_jack_rem_deb(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_jack_rem_deb(struct snd_soc_component *component, u32 val) { switch (val) { case 1: @@ -570,13 +570,13 @@ static enum da7219_aad_jack_rem_deb case 20: return DA7219_AAD_JACK_REM_DEB_20MS; default: - dev_warn(codec->dev, "Invalid jack removal debounce"); + dev_warn(component->dev, "Invalid jack removal debounce"); return DA7219_AAD_JACK_REM_DEB_1MS; } } static enum da7219_aad_btn_avg - da7219_aad_fw_btn_avg(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_btn_avg(struct snd_soc_component *component, u32 val) { switch (val) { case 1: @@ -588,13 +588,13 @@ static enum da7219_aad_btn_avg case 8: return DA7219_AAD_BTN_AVG_8; default: - dev_warn(codec->dev, "Invalid button average value"); + dev_warn(component->dev, "Invalid button average value"); return DA7219_AAD_BTN_AVG_2; } } static enum da7219_aad_adc_1bit_rpt - da7219_aad_fw_adc_1bit_rpt(struct snd_soc_codec *codec, u32 val) + da7219_aad_fw_adc_1bit_rpt(struct snd_soc_component *component, u32 val) { switch (val) { case 1: @@ -606,14 +606,14 @@ static enum da7219_aad_adc_1bit_rpt case 8: return DA7219_AAD_ADC_1BIT_RPT_8; default: - dev_warn(codec->dev, "Invalid ADC 1-bit repeat value"); + dev_warn(component->dev, "Invalid ADC 1-bit repeat value"); return DA7219_AAD_ADC_1BIT_RPT_1; } } -static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *codec) +static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_component *component) { - struct device *dev = codec->dev; + struct device *dev = component->dev; struct i2c_client *i2c = to_i2c_client(dev); struct fwnode_handle *aad_np; struct da7219_aad_pdata *aad_pdata; @@ -624,7 +624,7 @@ static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *cod if (!aad_np) return NULL; - aad_pdata = devm_kzalloc(codec->dev, sizeof(*aad_pdata), GFP_KERNEL); + aad_pdata = devm_kzalloc(dev, sizeof(*aad_pdata), GFP_KERNEL); if (!aad_pdata) return NULL; @@ -633,7 +633,7 @@ static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *cod if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", &fw_val32) >= 0) aad_pdata->micbias_pulse_lvl = - da7219_aad_fw_micbias_pulse_lvl(codec, fw_val32); + da7219_aad_fw_micbias_pulse_lvl(component, fw_val32); else aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; @@ -642,31 +642,31 @@ static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *cod aad_pdata->micbias_pulse_time = fw_val32; if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0) - aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(codec, fw_val32); + aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(component, fw_val32); else aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0) aad_pdata->mic_det_thr = - da7219_aad_fw_mic_det_thr(codec, fw_val32); + da7219_aad_fw_mic_det_thr(component, fw_val32); else aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) aad_pdata->jack_ins_deb = - da7219_aad_fw_jack_ins_deb(codec, fw_val32); + da7219_aad_fw_jack_ins_deb(component, fw_val32); else aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str)) aad_pdata->jack_det_rate = - da7219_aad_fw_jack_det_rate(codec, fw_str); + da7219_aad_fw_jack_det_rate(component, fw_str); else aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0) aad_pdata->jack_rem_deb = - da7219_aad_fw_jack_rem_deb(codec, fw_val32); + da7219_aad_fw_jack_rem_deb(component, fw_val32); else aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; @@ -691,22 +691,22 @@ static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_codec *cod aad_pdata->c_mic_btn_thr = 0x3E; if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0) - aad_pdata->btn_avg = da7219_aad_fw_btn_avg(codec, fw_val32); + aad_pdata->btn_avg = da7219_aad_fw_btn_avg(component, fw_val32); else aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0) aad_pdata->adc_1bit_rpt = - da7219_aad_fw_adc_1bit_rpt(codec, fw_val32); + da7219_aad_fw_adc_1bit_rpt(component, fw_val32); else aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; return aad_pdata; } -static void da7219_aad_handle_pdata(struct snd_soc_codec *codec) +static void da7219_aad_handle_pdata(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_aad_priv *da7219_aad = da7219->aad; struct da7219_pdata *pdata = da7219->pdata; @@ -752,7 +752,7 @@ static void da7219_aad_handle_pdata(struct snd_soc_codec *codec) DA7219_MIC_DET_THRESH_SHIFT); mask |= DA7219_MIC_DET_THRESH_MASK; } - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, mask, cfg); + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, mask, cfg); cfg = 0; mask = 0; @@ -787,15 +787,15 @@ static void da7219_aad_handle_pdata(struct snd_soc_codec *codec) DA7219_JACKDET_REM_DEB_SHIFT); mask |= DA7219_JACKDET_REM_DEB_MASK; } - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_2, mask, cfg); + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_2, mask, cfg); - snd_soc_write(codec, DA7219_ACCDET_CONFIG_3, + snd_soc_component_write(component, DA7219_ACCDET_CONFIG_3, aad_pdata->a_d_btn_thr); - snd_soc_write(codec, DA7219_ACCDET_CONFIG_4, + snd_soc_component_write(component, DA7219_ACCDET_CONFIG_4, aad_pdata->d_b_btn_thr); - snd_soc_write(codec, DA7219_ACCDET_CONFIG_5, + snd_soc_component_write(component, DA7219_ACCDET_CONFIG_5, aad_pdata->b_c_btn_thr); - snd_soc_write(codec, DA7219_ACCDET_CONFIG_6, + snd_soc_component_write(component, DA7219_ACCDET_CONFIG_6, aad_pdata->c_mic_btn_thr); cfg = 0; @@ -818,7 +818,7 @@ static void da7219_aad_handle_pdata(struct snd_soc_codec *codec) DA7219_ADC_1_BIT_REPEAT_SHIFT); mask |= DA7219_ADC_1_BIT_REPEAT_MASK; } - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_7, mask, cfg); + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_7, mask, cfg); } } @@ -827,16 +827,16 @@ static void da7219_aad_handle_pdata(struct snd_soc_codec *codec) * Suspend/Resume */ -void da7219_aad_suspend(struct snd_soc_codec *codec) +void da7219_aad_suspend(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_aad_priv *da7219_aad = da7219->aad; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); u8 micbias_ctrl; if (da7219_aad->jack) { /* Disable jack detection during suspend */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_ACCDET_EN_MASK, 0); /* @@ -846,7 +846,7 @@ void da7219_aad_suspend(struct snd_soc_codec *codec) * suspend then this will be dealt with through the IRQ handler. */ if (da7219_aad->jack_inserted) { - micbias_ctrl = snd_soc_read(codec, DA7219_MICBIAS_CTRL); + micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); if (micbias_ctrl & DA7219_MICBIAS1_EN_MASK) { snd_soc_dapm_disable_pin(dapm, "Mic Bias"); snd_soc_dapm_sync(dapm); @@ -856,11 +856,11 @@ void da7219_aad_suspend(struct snd_soc_codec *codec) } } -void da7219_aad_resume(struct snd_soc_codec *codec) +void da7219_aad_resume(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_aad_priv *da7219_aad = da7219->aad; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (da7219_aad->jack) { /* Re-enable micbias if previously enabled for 4-pole jack */ @@ -872,7 +872,7 @@ void da7219_aad_resume(struct snd_soc_codec *codec) } /* Re-enable jack detection */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_ACCDET_EN_MASK, DA7219_ACCDET_EN_MASK); } @@ -883,28 +883,28 @@ void da7219_aad_resume(struct snd_soc_codec *codec) * Init/Exit */ -int da7219_aad_init(struct snd_soc_codec *codec) +int da7219_aad_init(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_aad_priv *da7219_aad; u8 mask[DA7219_AAD_IRQ_REG_MAX]; int ret; - da7219_aad = devm_kzalloc(codec->dev, sizeof(*da7219_aad), GFP_KERNEL); + da7219_aad = devm_kzalloc(component->dev, sizeof(*da7219_aad), GFP_KERNEL); if (!da7219_aad) return -ENOMEM; da7219->aad = da7219_aad; - da7219_aad->codec = codec; + da7219_aad->component = component; /* Handle any DT/ACPI/platform data */ if (da7219->pdata && !da7219->pdata->aad_pdata) - da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(codec); + da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(component); - da7219_aad_handle_pdata(codec); + da7219_aad_handle_pdata(component); /* Disable button detection */ - snd_soc_update_bits(codec, DA7219_ACCDET_CONFIG_1, + snd_soc_component_update_bits(component, DA7219_ACCDET_CONFIG_1, DA7219_BUTTON_CONFIG_MASK, 0); INIT_WORK(&da7219_aad->btn_det_work, da7219_aad_btn_det_work); @@ -915,7 +915,7 @@ int da7219_aad_init(struct snd_soc_codec *codec) IRQF_TRIGGER_LOW | IRQF_ONESHOT, "da7219-aad", da7219_aad); if (ret) { - dev_err(codec->dev, "Failed to request IRQ: %d\n", ret); + dev_err(component->dev, "Failed to request IRQ: %d\n", ret); return ret; } @@ -928,9 +928,9 @@ int da7219_aad_init(struct snd_soc_codec *codec) } EXPORT_SYMBOL_GPL(da7219_aad_init); -void da7219_aad_exit(struct snd_soc_codec *codec) +void da7219_aad_exit(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_aad_priv *da7219_aad = da7219->aad; u8 mask[DA7219_AAD_IRQ_REG_MAX]; diff --git a/sound/soc/codecs/da7219-aad.h b/sound/soc/codecs/da7219-aad.h index 117a3d7ccd31..b9c4a27e8e61 100644 --- a/sound/soc/codecs/da7219-aad.h +++ b/sound/soc/codecs/da7219-aad.h @@ -189,7 +189,7 @@ enum da7219_aad_event_regs { /* Private data */ struct da7219_aad_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; int irq; u8 micbias_pulse_lvl; @@ -206,14 +206,14 @@ struct da7219_aad_priv { }; /* AAD control */ -void da7219_aad_jack_det(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +void da7219_aad_jack_det(struct snd_soc_component *component, struct snd_soc_jack *jack); /* Suspend/Resume */ -void da7219_aad_suspend(struct snd_soc_codec *codec); -void da7219_aad_resume(struct snd_soc_codec *codec); +void da7219_aad_suspend(struct snd_soc_component *component); +void da7219_aad_resume(struct snd_soc_component *component); /* Init/Exit */ -int da7219_aad_init(struct snd_soc_codec *codec); -void da7219_aad_exit(struct snd_soc_codec *codec); +int da7219_aad_init(struct snd_soc_component *component); +void da7219_aad_exit(struct snd_soc_component *component); #endif /* __DA7219_AAD_H */ diff --git a/sound/soc/codecs/da7219.c b/sound/soc/codecs/da7219.c index 6f088536df32..980a6a8bf56d 100644 --- a/sound/soc/codecs/da7219.c +++ b/sound/soc/codecs/da7219.c @@ -13,6 +13,8 @@ #include <linux/acpi.h> #include <linux/clk.h> +#include <linux/clkdev.h> +#include <linux/clk-provider.h> #include <linux/i2c.h> #include <linux/of_device.h> #include <linux/property.h> @@ -256,8 +258,8 @@ static const struct soc_enum da7219_cp_track_mode = static int da7219_volsw_locked_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&da7219->ctrl_lock); @@ -270,8 +272,8 @@ static int da7219_volsw_locked_get(struct snd_kcontrol *kcontrol, static int da7219_volsw_locked_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&da7219->ctrl_lock); @@ -284,8 +286,8 @@ static int da7219_volsw_locked_put(struct snd_kcontrol *kcontrol, static int da7219_enum_locked_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&da7219->ctrl_lock); @@ -298,8 +300,8 @@ static int da7219_enum_locked_get(struct snd_kcontrol *kcontrol, static int da7219_enum_locked_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&da7219->ctrl_lock); @@ -310,55 +312,55 @@ static int da7219_enum_locked_put(struct snd_kcontrol *kcontrol, } /* ALC */ -static void da7219_alc_calib(struct snd_soc_codec *codec) +static void da7219_alc_calib(struct snd_soc_component *component) { u8 mic_ctrl, mixin_ctrl, adc_ctrl, calib_ctrl; /* Save current state of mic control register */ - mic_ctrl = snd_soc_read(codec, DA7219_MIC_1_CTRL); + mic_ctrl = snd_soc_component_read32(component, DA7219_MIC_1_CTRL); /* Save current state of input mixer control register */ - mixin_ctrl = snd_soc_read(codec, DA7219_MIXIN_L_CTRL); + mixin_ctrl = snd_soc_component_read32(component, DA7219_MIXIN_L_CTRL); /* Save current state of input ADC control register */ - adc_ctrl = snd_soc_read(codec, DA7219_ADC_L_CTRL); + adc_ctrl = snd_soc_component_read32(component, DA7219_ADC_L_CTRL); /* Enable then Mute MIC PGAs */ - snd_soc_update_bits(codec, DA7219_MIC_1_CTRL, DA7219_MIC_1_AMP_EN_MASK, + snd_soc_component_update_bits(component, DA7219_MIC_1_CTRL, DA7219_MIC_1_AMP_EN_MASK, DA7219_MIC_1_AMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_MIC_1_CTRL, + snd_soc_component_update_bits(component, DA7219_MIC_1_CTRL, DA7219_MIC_1_AMP_MUTE_EN_MASK, DA7219_MIC_1_AMP_MUTE_EN_MASK); /* Enable input mixers unmuted */ - snd_soc_update_bits(codec, DA7219_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA7219_MIXIN_L_CTRL, DA7219_MIXIN_L_AMP_EN_MASK | DA7219_MIXIN_L_AMP_MUTE_EN_MASK, DA7219_MIXIN_L_AMP_EN_MASK); /* Enable input filters unmuted */ - snd_soc_update_bits(codec, DA7219_ADC_L_CTRL, + snd_soc_component_update_bits(component, DA7219_ADC_L_CTRL, DA7219_ADC_L_MUTE_EN_MASK | DA7219_ADC_L_EN_MASK, DA7219_ADC_L_EN_MASK); /* Perform auto calibration */ - snd_soc_update_bits(codec, DA7219_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7219_ALC_CTRL1, DA7219_ALC_AUTO_CALIB_EN_MASK, DA7219_ALC_AUTO_CALIB_EN_MASK); do { - calib_ctrl = snd_soc_read(codec, DA7219_ALC_CTRL1); + calib_ctrl = snd_soc_component_read32(component, DA7219_ALC_CTRL1); } while (calib_ctrl & DA7219_ALC_AUTO_CALIB_EN_MASK); /* If auto calibration fails, disable DC offset, hybrid ALC */ if (calib_ctrl & DA7219_ALC_CALIB_OVERFLOW_MASK) { - dev_warn(codec->dev, + dev_warn(component->dev, "ALC auto calibration failed with overflow\n"); - snd_soc_update_bits(codec, DA7219_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7219_ALC_CTRL1, DA7219_ALC_OFFSET_EN_MASK | DA7219_ALC_SYNC_MODE_MASK, 0); } else { /* Enable DC offset cancellation, hybrid mode */ - snd_soc_update_bits(codec, DA7219_ALC_CTRL1, + snd_soc_component_update_bits(component, DA7219_ALC_CTRL1, DA7219_ALC_OFFSET_EN_MASK | DA7219_ALC_SYNC_MODE_MASK, DA7219_ALC_OFFSET_EN_MASK | @@ -366,20 +368,20 @@ static void da7219_alc_calib(struct snd_soc_codec *codec) } /* Restore input filter control register to original state */ - snd_soc_write(codec, DA7219_ADC_L_CTRL, adc_ctrl); + snd_soc_component_write(component, DA7219_ADC_L_CTRL, adc_ctrl); /* Restore input mixer control registers to original state */ - snd_soc_write(codec, DA7219_MIXIN_L_CTRL, mixin_ctrl); + snd_soc_component_write(component, DA7219_MIXIN_L_CTRL, mixin_ctrl); /* Restore MIC control registers to original states */ - snd_soc_write(codec, DA7219_MIC_1_CTRL, mic_ctrl); + snd_soc_component_write(component, DA7219_MIC_1_CTRL, mic_ctrl); } static int da7219_mixin_gain_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; ret = snd_soc_put_volsw(kcontrol, ucontrol); @@ -389,7 +391,7 @@ static int da7219_mixin_gain_put(struct snd_kcontrol *kcontrol, * make sure calibrated offsets are updated. */ if ((ret == 1) && (da7219->alc_en)) - da7219_alc_calib(codec); + da7219_alc_calib(component); return ret; } @@ -397,13 +399,13 @@ static int da7219_mixin_gain_put(struct snd_kcontrol *kcontrol, static int da7219_alc_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); /* Force ALC offset calibration if enabling ALC */ if ((ucontrol->value.integer.value[0]) && (!da7219->alc_en)) { - da7219_alc_calib(codec); + da7219_alc_calib(component); da7219->alc_en = true; } else { da7219->alc_en = false; @@ -416,8 +418,8 @@ static int da7219_alc_sw_put(struct snd_kcontrol *kcontrol, static int da7219_tonegen_freq_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int reg = mixer_ctrl->reg; @@ -443,8 +445,8 @@ static int da7219_tonegen_freq_get(struct snd_kcontrol *kcontrol, static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mixer_ctrl = (struct soc_mixer_control *) kcontrol->private_value; unsigned int reg = mixer_ctrl->reg; @@ -769,32 +771,43 @@ static const struct snd_kcontrol_new da7219_st_out_filtr_mix_controls[] = { static int da7219_dai_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, pll_status; - int i = 0; + int i = 0, ret; bool srm_lock = false; switch (event) { case SND_SOC_DAPM_PRE_PMU: - if (da7219->master) + if (da7219->master) { /* Enable DAI clks for master mode */ - snd_soc_update_bits(codec, DA7219_DAI_CLK_MODE, - DA7219_DAI_CLK_EN_MASK, - DA7219_DAI_CLK_EN_MASK); + if (da7219->dai_clks) { + ret = clk_prepare_enable(da7219->dai_clks); + if (ret) { + dev_err(component->dev, + "Failed to enable dai_clks\n"); + return ret; + } + } else { + snd_soc_component_update_bits(component, + DA7219_DAI_CLK_MODE, + DA7219_DAI_CLK_EN_MASK, + DA7219_DAI_CLK_EN_MASK); + } + } /* PC synchronised to DAI */ - snd_soc_update_bits(codec, DA7219_PC_COUNT, + snd_soc_component_update_bits(component, DA7219_PC_COUNT, DA7219_PC_FREERUN_MASK, 0); /* Slave mode, if SRM not enabled no need for status checks */ - pll_ctrl = snd_soc_read(codec, DA7219_PLL_CTRL); + pll_ctrl = snd_soc_component_read32(component, DA7219_PLL_CTRL); if ((pll_ctrl & DA7219_PLL_MODE_MASK) != DA7219_PLL_MODE_SRM) return 0; /* Check SRM has locked */ do { - pll_status = snd_soc_read(codec, DA7219_PLL_SRM_STS); + pll_status = snd_soc_component_read32(component, DA7219_PLL_SRM_STS); if (pll_status & DA7219_PLL_SRM_STS_SRM_LOCK) { srm_lock = true; } else { @@ -804,19 +817,26 @@ static int da7219_dai_event(struct snd_soc_dapm_widget *w, } while ((i < DA7219_SRM_CHECK_RETRIES) & (!srm_lock)); if (!srm_lock) - dev_warn(codec->dev, "SRM failed to lock\n"); + dev_warn(component->dev, "SRM failed to lock\n"); return 0; case SND_SOC_DAPM_POST_PMD: /* PC free-running */ - snd_soc_update_bits(codec, DA7219_PC_COUNT, + snd_soc_component_update_bits(component, DA7219_PC_COUNT, DA7219_PC_FREERUN_MASK, DA7219_PC_FREERUN_MASK); /* Disable DAI clks if in master mode */ - if (da7219->master) - snd_soc_update_bits(codec, DA7219_DAI_CLK_MODE, - DA7219_DAI_CLK_EN_MASK, 0); + if (da7219->master) { + if (da7219->dai_clks) + clk_disable_unprepare(da7219->dai_clks); + else + snd_soc_component_update_bits(component, + DA7219_DAI_CLK_MODE, + DA7219_DAI_CLK_EN_MASK, + 0); + } + return 0; default: return -EINVAL; @@ -841,7 +861,7 @@ static int da7219_settling_event(struct snd_soc_dapm_widget *w, static int da7219_mixout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); u8 hp_ctrl, min_gain_mask; switch (w->reg) { @@ -860,7 +880,7 @@ static int da7219_mixout_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMD: /* Enable minimum gain on HP to avoid pops */ - snd_soc_update_bits(codec, hp_ctrl, min_gain_mask, + snd_soc_component_update_bits(component, hp_ctrl, min_gain_mask, min_gain_mask); msleep(DA7219_MIN_GAIN_DELAY); @@ -868,7 +888,7 @@ static int da7219_mixout_event(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMU: /* Remove minimum gain on HP */ - snd_soc_update_bits(codec, hp_ctrl, min_gain_mask, 0); + snd_soc_component_update_bits(component, hp_ctrl, min_gain_mask, 0); break; } @@ -879,22 +899,22 @@ static int da7219_mixout_event(struct snd_soc_dapm_widget *w, static int da7219_gain_ramp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMD: /* Ensure nominal gain ramping for DAPM sequence */ da7219->gain_ramp_ctrl = - snd_soc_read(codec, DA7219_GAIN_RAMP_CTRL); - snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL, + snd_soc_component_read32(component, DA7219_GAIN_RAMP_CTRL); + snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_NOMINAL); break; case SND_SOC_DAPM_POST_PMU: case SND_SOC_DAPM_POST_PMD: /* Restore previous gain ramp settings */ - snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL, + snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, da7219->gain_ramp_ctrl); break; } @@ -1116,8 +1136,8 @@ static const struct snd_soc_dapm_route da7219_audio_map[] = { static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret = 0; if ((da7219->clk_src == clk_id) && (da7219->mclk_rate == freq)) @@ -1133,12 +1153,12 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, switch (clk_id) { case DA7219_CLKSRC_MCLK_SQR: - snd_soc_update_bits(codec, DA7219_PLL_CTRL, + snd_soc_component_update_bits(component, DA7219_PLL_CTRL, DA7219_PLL_MCLK_SQR_EN_MASK, DA7219_PLL_MCLK_SQR_EN_MASK); break; case DA7219_CLKSRC_MCLK: - snd_soc_update_bits(codec, DA7219_PLL_CTRL, + snd_soc_component_update_bits(component, DA7219_PLL_CTRL, DA7219_PLL_MCLK_SQR_EN_MASK, 0); break; default: @@ -1167,9 +1187,9 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, return 0; } -int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) +int da7219_set_pll(struct snd_soc_component *component, int source, unsigned int fout) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u8 pll_ctrl, indiv_bits, indiv; u8 pll_frac_top, pll_frac_bot, pll_integer; @@ -1178,7 +1198,7 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) /* Verify 2MHz - 54MHz MCLK provided, and set input divider */ if (da7219->mclk_rate < 2000000) { - dev_err(codec->dev, "PLL input clock %d below valid range\n", + dev_err(component->dev, "PLL input clock %d below valid range\n", da7219->mclk_rate); return -EINVAL; } else if (da7219->mclk_rate <= 4500000) { @@ -1197,7 +1217,7 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) indiv_bits = DA7219_PLL_INDIV_36_TO_54_MHZ; indiv = DA7219_PLL_INDIV_36_TO_54_MHZ_VAL; } else { - dev_err(codec->dev, "PLL input clock %d above valid range\n", + dev_err(component->dev, "PLL input clock %d above valid range\n", da7219->mclk_rate); return -EINVAL; } @@ -1208,7 +1228,7 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) switch (source) { case DA7219_SYSCLK_MCLK: pll_ctrl |= DA7219_PLL_MODE_BYPASS; - snd_soc_update_bits(codec, DA7219_PLL_CTRL, + snd_soc_component_update_bits(component, DA7219_PLL_CTRL, DA7219_PLL_INDIV_MASK | DA7219_PLL_MODE_MASK, pll_ctrl); return 0; @@ -1219,7 +1239,7 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) pll_ctrl |= DA7219_PLL_MODE_SRM; break; default: - dev_err(codec->dev, "Invalid PLL config\n"); + dev_err(component->dev, "Invalid PLL config\n"); return -EINVAL; } @@ -1231,10 +1251,10 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) pll_frac_bot = (frac_div) & DA7219_BYTE_MASK; /* Write PLL config & dividers */ - snd_soc_write(codec, DA7219_PLL_FRAC_TOP, pll_frac_top); - snd_soc_write(codec, DA7219_PLL_FRAC_BOT, pll_frac_bot); - snd_soc_write(codec, DA7219_PLL_INTEGER, pll_integer); - snd_soc_update_bits(codec, DA7219_PLL_CTRL, + snd_soc_component_write(component, DA7219_PLL_FRAC_TOP, pll_frac_top); + snd_soc_component_write(component, DA7219_PLL_FRAC_BOT, pll_frac_bot); + snd_soc_component_write(component, DA7219_PLL_INTEGER, pll_integer); + snd_soc_component_update_bits(component, DA7219_PLL_CTRL, DA7219_PLL_INDIV_MASK | DA7219_PLL_MODE_MASK, pll_ctrl); @@ -1244,12 +1264,12 @@ int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout) static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int fref, unsigned int fout) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&da7219->pll_lock); - ret = da7219_set_pll(codec, source, fout); + ret = da7219_set_pll(component, source, fout); mutex_unlock(&da7219->pll_lock); return ret; @@ -1257,8 +1277,8 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, static int da7219_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u8 dai_clk_mode = 0, dai_ctrl = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1335,11 +1355,11 @@ static int da7219_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) /* By default 64 BCLKs per WCLK is supported */ dai_clk_mode |= DA7219_DAI_BCLKS_PER_WCLK_64; - snd_soc_update_bits(codec, DA7219_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7219_DAI_CLK_MODE, DA7219_DAI_BCLKS_PER_WCLK_MASK | DA7219_DAI_CLK_POL_MASK | DA7219_DAI_WCLK_POL_MASK, dai_clk_mode); - snd_soc_update_bits(codec, DA7219_DAI_CTRL, DA7219_DAI_FORMAT_MASK, + snd_soc_component_update_bits(component, DA7219_DAI_CTRL, DA7219_DAI_FORMAT_MASK, dai_ctrl); return 0; @@ -1349,18 +1369,18 @@ static int da7219_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); u8 dai_bclks_per_wclk; u16 offset; u32 frame_size; /* No channels enabled so disable TDM, revert to 64-bit frames */ if (!tx_mask) { - snd_soc_update_bits(codec, DA7219_DAI_TDM_CTRL, + snd_soc_component_update_bits(component, DA7219_DAI_TDM_CTRL, DA7219_DAI_TDM_CH_EN_MASK | DA7219_DAI_TDM_MODE_EN_MASK, 0); - snd_soc_update_bits(codec, DA7219_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7219_DAI_CLK_MODE, DA7219_DAI_BCLKS_PER_WCLK_MASK, DA7219_DAI_BCLKS_PER_WCLK_64); return 0; @@ -1368,14 +1388,14 @@ static int da7219_set_dai_tdm_slot(struct snd_soc_dai *dai, /* Check we have valid slots */ if (fls(tx_mask) > DA7219_DAI_TDM_MAX_SLOTS) { - dev_err(codec->dev, "Invalid number of slots, max = %d\n", + dev_err(component->dev, "Invalid number of slots, max = %d\n", DA7219_DAI_TDM_MAX_SLOTS); return -EINVAL; } /* Check we have a valid offset given */ if (rx_mask > DA7219_DAI_OFFSET_MAX) { - dev_err(codec->dev, "Invalid slot offset, max = %d\n", + dev_err(component->dev, "Invalid slot offset, max = %d\n", DA7219_DAI_OFFSET_MAX); return -EINVAL; } @@ -1396,11 +1416,11 @@ static int da7219_set_dai_tdm_slot(struct snd_soc_dai *dai, dai_bclks_per_wclk = DA7219_DAI_BCLKS_PER_WCLK_256; break; default: - dev_err(codec->dev, "Invalid frame size %d\n", frame_size); + dev_err(component->dev, "Invalid frame size %d\n", frame_size); return -EINVAL; } - snd_soc_update_bits(codec, DA7219_DAI_CLK_MODE, + snd_soc_component_update_bits(component, DA7219_DAI_CLK_MODE, DA7219_DAI_BCLKS_PER_WCLK_MASK, dai_bclks_per_wclk); @@ -1408,7 +1428,7 @@ static int da7219_set_dai_tdm_slot(struct snd_soc_dai *dai, regmap_bulk_write(da7219->regmap, DA7219_DAI_OFFSET_LOWER, &offset, sizeof(offset)); - snd_soc_update_bits(codec, DA7219_DAI_TDM_CTRL, + snd_soc_component_update_bits(component, DA7219_DAI_TDM_CTRL, DA7219_DAI_TDM_CH_EN_MASK | DA7219_DAI_TDM_MODE_EN_MASK, (tx_mask << DA7219_DAI_TDM_CH_EN_SHIFT) | @@ -1421,7 +1441,7 @@ static int da7219_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 dai_ctrl = 0, fs; unsigned int channels; @@ -1444,7 +1464,7 @@ static int da7219_hw_params(struct snd_pcm_substream *substream, channels = params_channels(params); if ((channels < 1) || (channels > DA7219_DAI_CH_NUM_MAX)) { - dev_err(codec->dev, + dev_err(component->dev, "Invalid number of channels, only 1 to %d supported\n", DA7219_DAI_CH_NUM_MAX); return -EINVAL; @@ -1489,11 +1509,11 @@ static int da7219_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, DA7219_DAI_CTRL, + snd_soc_component_update_bits(component, DA7219_DAI_CTRL, DA7219_DAI_WORD_LENGTH_MASK | DA7219_DAI_CH_NUM_MASK, dai_ctrl); - snd_soc_write(codec, DA7219_SR, fs); + snd_soc_component_write(component, DA7219_SR, fs); return 0; } @@ -1585,9 +1605,9 @@ static enum da7219_mic_amp_in_sel } } -static struct da7219_pdata *da7219_fw_to_pdata(struct snd_soc_codec *codec) +static struct da7219_pdata *da7219_fw_to_pdata(struct snd_soc_component *component) { - struct device *dev = codec->dev; + struct device *dev = component->dev; struct da7219_pdata *pdata; const char *of_str; u32 of_val32; @@ -1598,6 +1618,12 @@ static struct da7219_pdata *da7219_fw_to_pdata(struct snd_soc_codec *codec) pdata->wakeup_source = device_property_read_bool(dev, "wakeup-source"); + pdata->dai_clks_name = "da7219-dai-clks"; + if (device_property_read_string(dev, "clock-output-names", + &pdata->dai_clks_name)) + dev_warn(dev, "Using default clk name: %s\n", + pdata->dai_clks_name); + if (device_property_read_u32(dev, "dlg,micbias-lvl", &of_val32) >= 0) pdata->micbias_lvl = da7219_fw_micbias_lvl(dev, of_val32); else @@ -1616,10 +1642,10 @@ static struct da7219_pdata *da7219_fw_to_pdata(struct snd_soc_codec *codec) * Codec driver functions */ -static int da7219_set_bias_level(struct snd_soc_codec *codec, +static int da7219_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1627,11 +1653,11 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_PREPARE: /* Enable MCLK for transition to ON state */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) { if (da7219->mclk) { ret = clk_prepare_enable(da7219->mclk); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable mclk\n"); return ret; } @@ -1640,13 +1666,13 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) /* Master bias */ - snd_soc_update_bits(codec, DA7219_REFERENCES, + snd_soc_component_update_bits(component, DA7219_REFERENCES, DA7219_BIAS_EN_MASK, DA7219_BIAS_EN_MASK); - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_PREPARE) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_PREPARE) { /* Remove MCLK */ if (da7219->mclk) clk_disable_unprepare(da7219->mclk); @@ -1655,7 +1681,7 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_OFF: /* Only disable master bias if we're not a wake-up source */ if (!da7219->wakeup_source) - snd_soc_update_bits(codec, DA7219_REFERENCES, + snd_soc_component_update_bits(component, DA7219_REFERENCES, DA7219_BIAS_EN_MASK, 0); break; @@ -1670,9 +1696,9 @@ static const char *da7219_supply_names[DA7219_NUM_SUPPLIES] = { [DA7219_SUPPLY_VDDIO] = "VDDIO", }; -static int da7219_handle_supplies(struct snd_soc_codec *codec) +static int da7219_handle_supplies(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct regulator *vddio; u8 io_voltage_lvl = DA7219_IO_VOLTAGE_LEVEL_2_5V_3_6V; int i, ret; @@ -1681,10 +1707,10 @@ static int da7219_handle_supplies(struct snd_soc_codec *codec) for (i = 0; i < DA7219_NUM_SUPPLIES; ++i) da7219->supplies[i].supply = da7219_supply_names[i]; - ret = devm_regulator_bulk_get(codec->dev, DA7219_NUM_SUPPLIES, + ret = devm_regulator_bulk_get(component->dev, DA7219_NUM_SUPPLIES, da7219->supplies); if (ret) { - dev_err(codec->dev, "Failed to get supplies"); + dev_err(component->dev, "Failed to get supplies"); return ret; } @@ -1692,29 +1718,111 @@ static int da7219_handle_supplies(struct snd_soc_codec *codec) vddio = da7219->supplies[DA7219_SUPPLY_VDDIO].consumer; ret = regulator_get_voltage(vddio); if (ret < 1200000) - dev_warn(codec->dev, "Invalid VDDIO voltage\n"); + dev_warn(component->dev, "Invalid VDDIO voltage\n"); else if (ret < 2800000) io_voltage_lvl = DA7219_IO_VOLTAGE_LEVEL_1_2V_2_8V; /* Enable main supplies */ ret = regulator_bulk_enable(DA7219_NUM_SUPPLIES, da7219->supplies); if (ret) { - dev_err(codec->dev, "Failed to enable supplies"); + dev_err(component->dev, "Failed to enable supplies"); return ret; } /* Ensure device in active mode */ - snd_soc_write(codec, DA7219_SYSTEM_ACTIVE, DA7219_SYSTEM_ACTIVE_MASK); + snd_soc_component_write(component, DA7219_SYSTEM_ACTIVE, DA7219_SYSTEM_ACTIVE_MASK); /* Update IO voltage level range */ - snd_soc_write(codec, DA7219_IO_CTRL, io_voltage_lvl); + snd_soc_component_write(component, DA7219_IO_CTRL, io_voltage_lvl); return 0; } -static void da7219_handle_pdata(struct snd_soc_codec *codec) +#ifdef CONFIG_COMMON_CLK +static int da7219_dai_clks_prepare(struct clk_hw *hw) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = + container_of(hw, struct da7219_priv, dai_clks_hw); + struct snd_soc_component *component = da7219->aad->component; + + snd_soc_component_update_bits(component, DA7219_DAI_CLK_MODE, + DA7219_DAI_CLK_EN_MASK, + DA7219_DAI_CLK_EN_MASK); + + return 0; +} + +static void da7219_dai_clks_unprepare(struct clk_hw *hw) +{ + struct da7219_priv *da7219 = + container_of(hw, struct da7219_priv, dai_clks_hw); + struct snd_soc_component *component = da7219->aad->component; + + snd_soc_component_update_bits(component, DA7219_DAI_CLK_MODE, + DA7219_DAI_CLK_EN_MASK, 0); +} + +static int da7219_dai_clks_is_prepared(struct clk_hw *hw) +{ + struct da7219_priv *da7219 = + container_of(hw, struct da7219_priv, dai_clks_hw); + struct snd_soc_component *component = da7219->aad->component; + u8 clk_reg; + + clk_reg = snd_soc_component_read32(component, DA7219_DAI_CLK_MODE); + + return !!(clk_reg & DA7219_DAI_CLK_EN_MASK); +} + +static const struct clk_ops da7219_dai_clks_ops = { + .prepare = da7219_dai_clks_prepare, + .unprepare = da7219_dai_clks_unprepare, + .is_prepared = da7219_dai_clks_is_prepared, +}; + +static void da7219_register_dai_clks(struct snd_soc_component *component) +{ + struct device *dev = component->dev; + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); + struct da7219_pdata *pdata = da7219->pdata; + struct clk_init_data init = {}; + struct clk *dai_clks; + struct clk_lookup *dai_clks_lookup; + + init.parent_names = NULL; + init.num_parents = 0; + init.name = pdata->dai_clks_name; + init.ops = &da7219_dai_clks_ops; + da7219->dai_clks_hw.init = &init; + + dai_clks = devm_clk_register(dev, &da7219->dai_clks_hw); + if (IS_ERR(dai_clks)) { + dev_warn(dev, "Failed to register DAI clocks: %ld\n", + PTR_ERR(dai_clks)); + return; + } + da7219->dai_clks = dai_clks; + + /* If we're using DT, then register as provider accordingly */ + if (dev->of_node) { + devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, + &da7219->dai_clks_hw); + } else { + dai_clks_lookup = clkdev_create(dai_clks, pdata->dai_clks_name, + "%s", dev_name(dev)); + if (!dai_clks_lookup) + dev_warn(dev, "Failed to create DAI clkdev"); + else + da7219->dai_clks_lookup = dai_clks_lookup; + } +} +#else +static inline void da7219_register_dai_clks(struct snd_soc_component *component) {} +#endif /* CONFIG_COMMON_CLK */ + +static void da7219_handle_pdata(struct snd_soc_component *component) +{ + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); struct da7219_pdata *pdata = da7219->pdata; if (pdata) { @@ -1722,6 +1830,8 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec) da7219->wakeup_source = pdata->wakeup_source; + da7219_register_dai_clks(component); + /* Mic Bias voltages */ switch (pdata->micbias_lvl) { case DA7219_MICBIAS_1_6V: @@ -1735,14 +1845,14 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec) break; } - snd_soc_write(codec, DA7219_MICBIAS_CTRL, micbias_lvl); + snd_soc_component_write(component, DA7219_MICBIAS_CTRL, micbias_lvl); /* Mic */ switch (pdata->mic_amp_in_sel) { case DA7219_MIC_AMP_IN_SEL_DIFF: case DA7219_MIC_AMP_IN_SEL_SE_P: case DA7219_MIC_AMP_IN_SEL_SE_N: - snd_soc_write(codec, DA7219_MIC_1_SELECT, + snd_soc_component_write(component, DA7219_MIC_1_SELECT, pdata->mic_amp_in_sel); break; } @@ -1753,9 +1863,9 @@ static struct reg_sequence da7219_rev_aa_patch[] = { { DA7219_REFERENCES, 0x08 }, }; -static int da7219_probe(struct snd_soc_codec *codec) +static int da7219_probe(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); unsigned int rev; int ret; @@ -1763,13 +1873,13 @@ static int da7219_probe(struct snd_soc_codec *codec) mutex_init(&da7219->pll_lock); /* Regulator configuration */ - ret = da7219_handle_supplies(codec); + ret = da7219_handle_supplies(component); if (ret) return ret; ret = regmap_read(da7219->regmap, DA7219_CHIP_REVISION, &rev); if (ret) { - dev_err(codec->dev, "Failed to read chip revision: %d\n", ret); + dev_err(component->dev, "Failed to read chip revision: %d\n", ret); goto err_disable_reg; } @@ -1778,7 +1888,7 @@ static int da7219_probe(struct snd_soc_codec *codec) ret = regmap_register_patch(da7219->regmap, da7219_rev_aa_patch, ARRAY_SIZE(da7219_rev_aa_patch)); if (ret) { - dev_err(codec->dev, "Failed to register AA patch: %d\n", + dev_err(component->dev, "Failed to register AA patch: %d\n", ret); goto err_disable_reg; } @@ -1788,14 +1898,14 @@ static int da7219_probe(struct snd_soc_codec *codec) } /* Handle DT/ACPI/Platform data */ - da7219->pdata = dev_get_platdata(codec->dev); + da7219->pdata = dev_get_platdata(component->dev); if (!da7219->pdata) - da7219->pdata = da7219_fw_to_pdata(codec); + da7219->pdata = da7219_fw_to_pdata(component); - da7219_handle_pdata(codec); + da7219_handle_pdata(component); /* Check if MCLK provided */ - da7219->mclk = devm_clk_get(codec->dev, "mclk"); + da7219->mclk = devm_clk_get(component->dev, "mclk"); if (IS_ERR(da7219->mclk)) { if (PTR_ERR(da7219->mclk) != -ENOENT) { ret = PTR_ERR(da7219->mclk); @@ -1806,39 +1916,39 @@ static int da7219_probe(struct snd_soc_codec *codec) } /* Default PC counter to free-running */ - snd_soc_update_bits(codec, DA7219_PC_COUNT, DA7219_PC_FREERUN_MASK, + snd_soc_component_update_bits(component, DA7219_PC_COUNT, DA7219_PC_FREERUN_MASK, DA7219_PC_FREERUN_MASK); /* Default gain ramping */ - snd_soc_update_bits(codec, DA7219_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA7219_MIXIN_L_CTRL, DA7219_MIXIN_L_AMP_RAMP_EN_MASK, DA7219_MIXIN_L_AMP_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_ADC_L_CTRL, DA7219_ADC_L_RAMP_EN_MASK, + snd_soc_component_update_bits(component, DA7219_ADC_L_CTRL, DA7219_ADC_L_RAMP_EN_MASK, DA7219_ADC_L_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_DAC_L_CTRL, DA7219_DAC_L_RAMP_EN_MASK, + snd_soc_component_update_bits(component, DA7219_DAC_L_CTRL, DA7219_DAC_L_RAMP_EN_MASK, DA7219_DAC_L_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_DAC_R_CTRL, DA7219_DAC_R_RAMP_EN_MASK, + snd_soc_component_update_bits(component, DA7219_DAC_R_CTRL, DA7219_DAC_R_RAMP_EN_MASK, DA7219_DAC_R_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_RAMP_EN_MASK, DA7219_HP_L_AMP_RAMP_EN_MASK); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_RAMP_EN_MASK, DA7219_HP_R_AMP_RAMP_EN_MASK); /* Default minimum gain on HP to avoid pops during DAPM sequencing */ - snd_soc_update_bits(codec, DA7219_HP_L_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_MIN_GAIN_EN_MASK, DA7219_HP_L_AMP_MIN_GAIN_EN_MASK); - snd_soc_update_bits(codec, DA7219_HP_R_CTRL, + snd_soc_component_update_bits(component, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_MIN_GAIN_EN_MASK, DA7219_HP_R_AMP_MIN_GAIN_EN_MASK); /* Default infinite tone gen, start/stop by Kcontrol */ - snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK); + snd_soc_component_write(component, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK); /* Initialise AAD block */ - ret = da7219_aad_init(codec); + ret = da7219_aad_init(component); if (ret) goto err_disable_reg; @@ -1850,39 +1960,44 @@ err_disable_reg: return ret; } -static int da7219_remove(struct snd_soc_codec *codec) +static void da7219_remove(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); - da7219_aad_exit(codec); + da7219_aad_exit(component); + +#ifdef CONFIG_COMMON_CLK + if (da7219->dai_clks_lookup) + clkdev_drop(da7219->dai_clks_lookup); +#endif /* Supplies */ - return regulator_bulk_disable(DA7219_NUM_SUPPLIES, da7219->supplies); + regulator_bulk_disable(DA7219_NUM_SUPPLIES, da7219->supplies); } #ifdef CONFIG_PM -static int da7219_suspend(struct snd_soc_codec *codec) +static int da7219_suspend(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); /* Suspend AAD if we're not a wake-up source */ if (!da7219->wakeup_source) - da7219_aad_suspend(codec); + da7219_aad_suspend(component); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); return 0; } -static int da7219_resume(struct snd_soc_codec *codec) +static int da7219_resume(struct snd_soc_component *component) { - struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); + struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); /* Resume AAD if previously suspended */ if (!da7219->wakeup_source) - da7219_aad_resume(codec); + da7219_aad_resume(component); return 0; } @@ -1891,21 +2006,22 @@ static int da7219_resume(struct snd_soc_codec *codec) #define da7219_resume NULL #endif -static const struct snd_soc_codec_driver soc_codec_dev_da7219 = { +static const struct snd_soc_component_driver soc_component_dev_da7219 = { .probe = da7219_probe, .remove = da7219_remove, .suspend = da7219_suspend, .resume = da7219_resume, .set_bias_level = da7219_set_bias_level, - - .component_driver = { - .controls = da7219_snd_controls, - .num_controls = ARRAY_SIZE(da7219_snd_controls), - .dapm_widgets = da7219_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da7219_dapm_widgets), - .dapm_routes = da7219_audio_map, - .num_dapm_routes = ARRAY_SIZE(da7219_audio_map), - }, + .controls = da7219_snd_controls, + .num_controls = ARRAY_SIZE(da7219_snd_controls), + .dapm_widgets = da7219_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da7219_dapm_widgets), + .dapm_routes = da7219_audio_map, + .num_dapm_routes = ARRAY_SIZE(da7219_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; @@ -2090,7 +2206,7 @@ static int da7219_i2c_probe(struct i2c_client *i2c, } } - /* Soft reset codec */ + /* Soft reset component */ regmap_write_bits(da7219->regmap, DA7219_ACCDET_CONFIG_1, DA7219_ACCDET_EN_MASK, 0); regmap_write_bits(da7219->regmap, DA7219_CIF_CTRL, @@ -2101,10 +2217,11 @@ static int da7219_i2c_probe(struct i2c_client *i2c, regcache_cache_bypass(da7219->regmap, false); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da7219, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da7219, &da7219_dai, 1); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register da7219 codec: %d\n", + dev_err(&i2c->dev, "Failed to register da7219 component: %d\n", ret); } return ret; @@ -2112,7 +2229,6 @@ static int da7219_i2c_probe(struct i2c_client *i2c, static int da7219_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/da7219.h b/sound/soc/codecs/da7219.h index 8d6c3c8c8026..1b00023e33cd 100644 --- a/sound/soc/codecs/da7219.h +++ b/sound/soc/codecs/da7219.h @@ -14,6 +14,9 @@ #ifndef __DA7219_H #define __DA7219_H +#include <linux/clk.h> +#include <linux/clkdev.h> +#include <linux/clk-provider.h> #include <linux/regmap.h> #include <linux/regulator/consumer.h> #include <sound/da7219.h> @@ -813,6 +816,12 @@ struct da7219_priv { struct mutex ctrl_lock; struct mutex pll_lock; +#ifdef CONFIG_COMMON_CLK + struct clk_hw dai_clks_hw; +#endif + struct clk_lookup *dai_clks_lookup; + struct clk *dai_clks; + struct clk *mclk; unsigned int mclk_rate; int clk_src; @@ -822,6 +831,6 @@ struct da7219_priv { u8 gain_ramp_ctrl; }; -int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout); +int da7219_set_pll(struct snd_soc_component *component, int source, unsigned int fout); #endif /* __DA7219_H */ diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c index 83db4d23c90b..de275df8f4ee 100644 --- a/sound/soc/codecs/da732x.c +++ b/sound/soc/codecs/da732x.c @@ -168,7 +168,7 @@ static const struct reg_default da732x_reg_cache[] = { { DA732X_REG_UNLOCK , 0x00 }, }; -static inline int da732x_get_input_div(struct snd_soc_codec *codec, int sysclk) +static inline int da732x_get_input_div(struct snd_soc_component *component, int sysclk) { int val; int ret; @@ -192,28 +192,28 @@ static inline int da732x_get_input_div(struct snd_soc_codec *codec, int sysclk) return -EINVAL; } - snd_soc_write(codec, DA732X_REG_PLL_CTRL, val); + snd_soc_component_write(component, DA732X_REG_PLL_CTRL, val); return ret; } -static void da732x_set_charge_pump(struct snd_soc_codec *codec, int state) +static void da732x_set_charge_pump(struct snd_soc_component *component, int state) { switch (state) { case DA732X_ENABLE_CP: - snd_soc_write(codec, DA732X_REG_CLK_EN2, DA732X_CP_CLK_EN); - snd_soc_write(codec, DA732X_REG_CP_HP2, DA732X_HP_CP_EN | + snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_EN); + snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_EN | DA732X_HP_CP_REG | DA732X_HP_CP_PULSESKIP); - snd_soc_write(codec, DA732X_REG_CP_CTRL1, DA732X_CP_EN | + snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA732X_CP_EN | DA732X_CP_CTRL_CPVDD1); - snd_soc_write(codec, DA732X_REG_CP_CTRL2, + snd_soc_component_write(component, DA732X_REG_CP_CTRL2, DA732X_CP_MANAGE_MAGNITUDE | DA732X_CP_BOOST); - snd_soc_write(codec, DA732X_REG_CP_CTRL3, DA732X_CP_1MHZ); + snd_soc_component_write(component, DA732X_REG_CP_CTRL3, DA732X_CP_1MHZ); break; case DA732X_DISABLE_CP: - snd_soc_write(codec, DA732X_REG_CLK_EN2, DA732X_CP_CLK_DIS); - snd_soc_write(codec, DA732X_REG_CP_HP2, DA732X_HP_CP_DIS); - snd_soc_write(codec, DA732X_REG_CP_CTRL1, DA723X_CP_DIS); + snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_DIS); + snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_DIS); + snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA723X_CP_DIS); break; default: pr_err("Wrong charge pump state\n"); @@ -331,7 +331,7 @@ static SOC_ENUM_SINGLE_DECL(da732x_adc2_voice_filter_enum, static int da732x_hpf_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value; unsigned int reg = enum_ctrl->reg; unsigned int sel = ucontrol->value.enumerated.item[0]; @@ -351,7 +351,7 @@ static int da732x_hpf_set(struct snd_kcontrol *kcontrol, return -EINVAL; } - snd_soc_update_bits(codec, reg, DA732X_HPF_MASK, bits); + snd_soc_component_update_bits(component, reg, DA732X_HPF_MASK, bits); return 0; } @@ -359,12 +359,12 @@ static int da732x_hpf_set(struct snd_kcontrol *kcontrol, static int da732x_hpf_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value; unsigned int reg = enum_ctrl->reg; int val; - val = snd_soc_read(codec, reg) & DA732X_HPF_MASK; + val = snd_soc_component_read32(component, reg) & DA732X_HPF_MASK; switch (val) { case DA732X_HPF_VOICE_EN: @@ -609,18 +609,18 @@ static const struct snd_kcontrol_new da732x_snd_controls[] = { static int da732x_adc_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: switch (w->reg) { case DA732X_REG_ADC1_PD: - snd_soc_update_bits(codec, DA732X_REG_CLK_EN3, + snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, DA732X_ADCA_BB_CLK_EN, DA732X_ADCA_BB_CLK_EN); break; case DA732X_REG_ADC2_PD: - snd_soc_update_bits(codec, DA732X_REG_CLK_EN3, + snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, DA732X_ADCC_BB_CLK_EN, DA732X_ADCC_BB_CLK_EN); break; @@ -628,24 +628,24 @@ static int da732x_adc_event(struct snd_soc_dapm_widget *w, return -EINVAL; } - snd_soc_update_bits(codec, w->reg, DA732X_ADC_RST_MASK, + snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK, DA732X_ADC_SET_ACT); - snd_soc_update_bits(codec, w->reg, DA732X_ADC_PD_MASK, + snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK, DA732X_ADC_ON); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, DA732X_ADC_PD_MASK, + snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK, DA732X_ADC_OFF); - snd_soc_update_bits(codec, w->reg, DA732X_ADC_RST_MASK, + snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK, DA732X_ADC_SET_RST); switch (w->reg) { case DA732X_REG_ADC1_PD: - snd_soc_update_bits(codec, DA732X_REG_CLK_EN3, + snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, DA732X_ADCA_BB_CLK_EN, 0); break; case DA732X_REG_ADC2_PD: - snd_soc_update_bits(codec, DA732X_REG_CLK_EN3, + snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, DA732X_ADCC_BB_CLK_EN, 0); break; default: @@ -663,16 +663,16 @@ static int da732x_adc_event(struct snd_soc_dapm_widget *w, static int da732x_out_pga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift) | DA732X_OUT_HIZ_EN, (1 << w->shift) | DA732X_OUT_HIZ_EN); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift) | DA732X_OUT_HIZ_EN, (1 << w->shift) | DA732X_OUT_HIZ_DIS); break; @@ -949,7 +949,7 @@ static int da732x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u32 aif = 0; u32 reg_aif; u32 fs; @@ -1011,15 +1011,15 @@ static int da732x_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, reg_aif, DA732X_AIF_WORD_MASK, aif); - snd_soc_update_bits(codec, DA732X_REG_CLK_CTRL, DA732X_SR1_MASK, fs); + snd_soc_component_update_bits(component, reg_aif, DA732X_AIF_WORD_MASK, aif); + snd_soc_component_update_bits(component, DA732X_REG_CLK_CTRL, DA732X_SR1_MASK, fs); return 0; } static int da732x_set_dai_fmt(struct snd_soc_dai *dai, u32 fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u32 aif_mclk, pc_count; u32 reg_aif1, aif1; u32 reg_aif3, aif3; @@ -1107,29 +1107,29 @@ static int da732x_set_dai_fmt(struct snd_soc_dai *dai, u32 fmt) return -EINVAL; } - snd_soc_write(codec, DA732X_REG_AIF_MCLK, aif_mclk); - snd_soc_update_bits(codec, reg_aif1, DA732X_AIF1_CLK_MASK, aif1); - snd_soc_update_bits(codec, reg_aif3, DA732X_AIF_BCLK_INV | + snd_soc_component_write(component, DA732X_REG_AIF_MCLK, aif_mclk); + snd_soc_component_update_bits(component, reg_aif1, DA732X_AIF1_CLK_MASK, aif1); + snd_soc_component_update_bits(component, reg_aif3, DA732X_AIF_BCLK_INV | DA732X_AIF_WCLK_INV | DA732X_AIF_MODE_MASK, aif3); - snd_soc_write(codec, DA732X_REG_PC_CTRL, pc_count); + snd_soc_component_write(component, DA732X_REG_PC_CTRL, pc_count); return 0; } -static int da732x_set_dai_pll(struct snd_soc_codec *codec, int pll_id, +static int da732x_set_dai_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct da732x_priv *da732x = snd_soc_codec_get_drvdata(codec); + struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); int fref, indiv; u8 div_lo, div_mid, div_hi; u64 frac_div; /* Disable PLL */ if (freq_out == 0) { - snd_soc_update_bits(codec, DA732X_REG_PLL_CTRL, + snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, DA732X_PLL_EN, 0); da732x->pll_en = false; return 0; @@ -1147,17 +1147,17 @@ static int da732x_set_dai_pll(struct snd_soc_codec *codec, int pll_id, case 24576000: case 45160000: case 49152000: - snd_soc_write(codec, DA732X_REG_PLL_CTRL, + snd_soc_component_write(component, DA732X_REG_PLL_CTRL, DA732X_PLL_BYPASS); return 0; default: - dev_err(codec->dev, + dev_err(component->dev, "Cannot use PLL Bypass, invalid SYSCLK rate\n"); return -EINVAL; } } - indiv = da732x_get_input_div(codec, da732x->sysclk); + indiv = da732x_get_input_div(component, da732x->sysclk); if (indiv < 0) return indiv; @@ -1168,11 +1168,11 @@ static int da732x_set_dai_pll(struct snd_soc_codec *codec, int pll_id, div_mid = (frac_div >> DA732X_1BYTE_SHIFT) & DA732X_U8_MASK; div_lo = (frac_div) & DA732X_U8_MASK; - snd_soc_write(codec, DA732X_REG_PLL_DIV_LO, div_lo); - snd_soc_write(codec, DA732X_REG_PLL_DIV_MID, div_mid); - snd_soc_write(codec, DA732X_REG_PLL_DIV_HI, div_hi); + snd_soc_component_write(component, DA732X_REG_PLL_DIV_LO, div_lo); + snd_soc_component_write(component, DA732X_REG_PLL_DIV_MID, div_mid); + snd_soc_component_write(component, DA732X_REG_PLL_DIV_HI, div_hi); - snd_soc_update_bits(codec, DA732X_REG_PLL_CTRL, DA732X_PLL_EN, + snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, DA732X_PLL_EN, DA732X_PLL_EN); da732x->pll_en = true; @@ -1183,8 +1183,8 @@ static int da732x_set_dai_pll(struct snd_soc_codec *codec, int pll_id, static int da732x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct da732x_priv *da732x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); da732x->sysclk = freq; @@ -1268,21 +1268,21 @@ static const struct regmap_config da732x_regmap = { }; -static void da732x_dac_offset_adjust(struct snd_soc_codec *codec) +static void da732x_dac_offset_adjust(struct snd_soc_component *component) { u8 offset[DA732X_HP_DACS]; u8 sign[DA732X_HP_DACS]; u8 step = DA732X_DAC_OFFSET_STEP; /* Initialize DAC offset calibration circuits and registers */ - snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, DA732X_HP_DAC_OFFSET_TRIM_VAL); - snd_soc_write(codec, DA732X_REG_HPR_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, DA732X_HP_DAC_OFFSET_TRIM_VAL); - snd_soc_write(codec, DA732X_REG_HPL_DAC_OFF_CNTL, + snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL, DA732X_HP_DAC_OFF_CALIBRATION | DA732X_HP_DAC_OFF_SCALE_STEPS); - snd_soc_write(codec, DA732X_REG_HPR_DAC_OFF_CNTL, + snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL, DA732X_HP_DAC_OFF_CALIBRATION | DA732X_HP_DAC_OFF_SCALE_STEPS); @@ -1290,9 +1290,9 @@ static void da732x_dac_offset_adjust(struct snd_soc_codec *codec) msleep(DA732X_WAIT_FOR_STABILIZATION); /* Check DAC offset sign */ - sign[DA732X_HPL_DAC] = (snd_soc_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) & + sign[DA732X_HPL_DAC] = (snd_soc_component_read32(component, DA732X_REG_HPL_DAC_OFF_CNTL) & DA732X_HP_DAC_OFF_CNTL_COMPO); - sign[DA732X_HPR_DAC] = (snd_soc_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) & + sign[DA732X_HPR_DAC] = (snd_soc_component_read32(component, DA732X_REG_HPR_DAC_OFF_CNTL) & DA732X_HP_DAC_OFF_CNTL_COMPO); /* Binary search DAC offset values (both channels at once) */ @@ -1302,17 +1302,17 @@ static void da732x_dac_offset_adjust(struct snd_soc_codec *codec) do { offset[DA732X_HPL_DAC] |= step; offset[DA732X_HPR_DAC] |= step; - snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK); - snd_soc_write(codec, DA732X_REG_HPR_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK); msleep(DA732X_WAIT_FOR_STABILIZATION); - if ((snd_soc_read(codec, DA732X_REG_HPL_DAC_OFF_CNTL) & + if ((snd_soc_component_read32(component, DA732X_REG_HPL_DAC_OFF_CNTL) & DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPL_DAC]) offset[DA732X_HPL_DAC] &= ~step; - if ((snd_soc_read(codec, DA732X_REG_HPR_DAC_OFF_CNTL) & + if ((snd_soc_component_read32(component, DA732X_REG_HPR_DAC_OFF_CNTL) & DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPR_DAC]) offset[DA732X_HPR_DAC] &= ~step; @@ -1320,19 +1320,19 @@ static void da732x_dac_offset_adjust(struct snd_soc_codec *codec) } while (step); /* Write final DAC offsets to registers */ - snd_soc_write(codec, DA732X_REG_HPL_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK); - snd_soc_write(codec, DA732X_REG_HPR_DAC_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK); /* End DAC calibration mode */ - snd_soc_write(codec, DA732X_REG_HPL_DAC_OFF_CNTL, + snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL, DA732X_HP_DAC_OFF_SCALE_STEPS); - snd_soc_write(codec, DA732X_REG_HPR_DAC_OFF_CNTL, + snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL, DA732X_HP_DAC_OFF_SCALE_STEPS); } -static void da732x_output_offset_adjust(struct snd_soc_codec *codec) +static void da732x_output_offset_adjust(struct snd_soc_component *component) { u8 offset[DA732X_HP_AMPS]; u8 sign[DA732X_HP_AMPS]; @@ -1342,26 +1342,26 @@ static void da732x_output_offset_adjust(struct snd_soc_codec *codec) offset[DA732X_HPR_AMP] = DA732X_HP_OUT_TRIM_VAL; /* Initialize output offset calibration circuits and registers */ - snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); - snd_soc_write(codec, DA732X_REG_HPR_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); - snd_soc_write(codec, DA732X_REG_HPL, + snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); + snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); + snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN); - snd_soc_write(codec, DA732X_REG_HPR, + snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN); /* Wait for voltage stabilization */ msleep(DA732X_WAIT_FOR_STABILIZATION); /* Check output offset sign */ - sign[DA732X_HPL_AMP] = snd_soc_read(codec, DA732X_REG_HPL) & + sign[DA732X_HPL_AMP] = snd_soc_component_read32(component, DA732X_REG_HPL) & DA732X_HP_OUT_COMPO; - sign[DA732X_HPR_AMP] = snd_soc_read(codec, DA732X_REG_HPR) & + sign[DA732X_HPR_AMP] = snd_soc_component_read32(component, DA732X_REG_HPR) & DA732X_HP_OUT_COMPO; - snd_soc_write(codec, DA732X_REG_HPL, DA732X_HP_OUT_COMP | + snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_COMP | (sign[DA732X_HPL_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) | DA732X_HP_OUT_EN); - snd_soc_write(codec, DA732X_REG_HPR, DA732X_HP_OUT_COMP | + snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_COMP | (sign[DA732X_HPR_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) | DA732X_HP_OUT_EN); @@ -1369,17 +1369,17 @@ static void da732x_output_offset_adjust(struct snd_soc_codec *codec) do { offset[DA732X_HPL_AMP] |= step; offset[DA732X_HPR_AMP] |= step; - snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]); - snd_soc_write(codec, DA732X_REG_HPR_OUT_OFFSET, + snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, offset[DA732X_HPR_AMP]); msleep(DA732X_WAIT_FOR_STABILIZATION); - if ((snd_soc_read(codec, DA732X_REG_HPL) & + if ((snd_soc_component_read32(component, DA732X_REG_HPL) & DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPL_AMP]) offset[DA732X_HPL_AMP] &= ~step; - if ((snd_soc_read(codec, DA732X_REG_HPR) & + if ((snd_soc_component_read32(component, DA732X_REG_HPR) & DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPR_AMP]) offset[DA732X_HPR_AMP] &= ~step; @@ -1387,80 +1387,80 @@ static void da732x_output_offset_adjust(struct snd_soc_codec *codec) } while (step); /* Write final DAC offsets to registers */ - snd_soc_write(codec, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]); - snd_soc_write(codec, DA732X_REG_HPR_OUT_OFFSET, offset[DA732X_HPR_AMP]); + snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]); + snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, offset[DA732X_HPR_AMP]); } -static void da732x_hp_dc_offset_cancellation(struct snd_soc_codec *codec) +static void da732x_hp_dc_offset_cancellation(struct snd_soc_component *component) { /* Make sure that we have Soft Mute enabled */ - snd_soc_write(codec, DA732X_REG_DAC1_SOFTMUTE, DA732X_SOFTMUTE_EN | + snd_soc_component_write(component, DA732X_REG_DAC1_SOFTMUTE, DA732X_SOFTMUTE_EN | DA732X_GAIN_RAMPED | DA732X_16_SAMPLES); - snd_soc_write(codec, DA732X_REG_DAC1_SEL, DA732X_DACL_EN | + snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACL_EN | DA732X_DACR_EN | DA732X_DACL_SDM | DA732X_DACR_SDM | DA732X_DACL_MUTE | DA732X_DACR_MUTE); - snd_soc_write(codec, DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN | + snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN | DA732X_HP_OUT_MUTE | DA732X_HP_OUT_EN); - snd_soc_write(codec, DA732X_REG_HPR, DA732X_HP_OUT_EN | + snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_EN | DA732X_HP_OUT_MUTE | DA732X_HP_OUT_DAC_EN); - da732x_dac_offset_adjust(codec); - da732x_output_offset_adjust(codec); + da732x_dac_offset_adjust(component); + da732x_output_offset_adjust(component); - snd_soc_write(codec, DA732X_REG_DAC1_SEL, DA732X_DACS_DIS); - snd_soc_write(codec, DA732X_REG_HPL, DA732X_HP_DIS); - snd_soc_write(codec, DA732X_REG_HPR, DA732X_HP_DIS); + snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACS_DIS); + snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_DIS); + snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_DIS); } -static int da732x_set_bias_level(struct snd_soc_codec *codec, +static int da732x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct da732x_priv *da732x = snd_soc_codec_get_drvdata(codec); + struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: - snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, + snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, DA732X_BIAS_BOOST_MASK, DA732X_BIAS_BOOST_100PC); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Init Codec */ - snd_soc_write(codec, DA732X_REG_REF1, + snd_soc_component_write(component, DA732X_REG_REF1, DA732X_VMID_FASTCHG); - snd_soc_write(codec, DA732X_REG_BIAS_EN, + snd_soc_component_write(component, DA732X_REG_BIAS_EN, DA732X_BIAS_EN); mdelay(DA732X_STARTUP_DELAY); /* Disable Fast Charge and enable DAC ref voltage */ - snd_soc_write(codec, DA732X_REG_REF1, + snd_soc_component_write(component, DA732X_REG_REF1, DA732X_REFBUFX2_EN); /* Enable bypass DSP routing */ - snd_soc_write(codec, DA732X_REG_DATA_ROUTE, + snd_soc_component_write(component, DA732X_REG_DATA_ROUTE, DA732X_BYPASS_DSP); /* Enable Digital subsystem */ - snd_soc_write(codec, DA732X_REG_DSP_CTRL, + snd_soc_component_write(component, DA732X_REG_DSP_CTRL, DA732X_DIGITAL_EN); - snd_soc_write(codec, DA732X_REG_SPARE1_OUT, + snd_soc_component_write(component, DA732X_REG_SPARE1_OUT, DA732X_HP_DRIVER_EN | DA732X_HP_GATE_LOW | DA732X_HP_LOOP_GAIN_CTRL); - snd_soc_write(codec, DA732X_REG_HP_LIN1_GNDSEL, + snd_soc_component_write(component, DA732X_REG_HP_LIN1_GNDSEL, DA732X_HP_OUT_GNDSEL); - da732x_set_charge_pump(codec, DA732X_ENABLE_CP); + da732x_set_charge_pump(component, DA732X_ENABLE_CP); - snd_soc_write(codec, DA732X_REG_CLK_EN1, + snd_soc_component_write(component, DA732X_REG_CLK_EN1, DA732X_SYS3_CLK_EN | DA732X_PC_CLK_EN); /* Enable Zero Crossing */ - snd_soc_write(codec, DA732X_REG_INP_ZC_EN, + snd_soc_component_write(component, DA732X_REG_INP_ZC_EN, DA732X_MIC1_PRE_ZC_EN | DA732X_MIC1_ZC_EN | DA732X_MIC2_PRE_ZC_EN | @@ -1469,28 +1469,28 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec, DA732X_AUXR_ZC_EN | DA732X_MIC3_PRE_ZC_EN | DA732X_MIC3_ZC_EN); - snd_soc_write(codec, DA732X_REG_OUT_ZC_EN, + snd_soc_component_write(component, DA732X_REG_OUT_ZC_EN, DA732X_HPL_ZC_EN | DA732X_HPR_ZC_EN | DA732X_LIN2_ZC_EN | DA732X_LIN3_ZC_EN | DA732X_LIN4_ZC_EN); - da732x_hp_dc_offset_cancellation(codec); + da732x_hp_dc_offset_cancellation(component); regcache_cache_only(da732x->regmap, false); regcache_sync(da732x->regmap); } else { - snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, + snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, DA732X_BIAS_BOOST_MASK, DA732X_BIAS_BOOST_50PC); - snd_soc_update_bits(codec, DA732X_REG_PLL_CTRL, + snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, DA732X_PLL_EN, 0); da732x->pll_en = false; } break; case SND_SOC_BIAS_OFF: regcache_cache_only(da732x->regmap, true); - da732x_set_charge_pump(codec, DA732X_DISABLE_CP); - snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, DA732X_BIAS_EN, + da732x_set_charge_pump(component, DA732X_DISABLE_CP); + snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, DA732X_BIAS_EN, DA732X_BIAS_DIS); da732x->pll_en = false; break; @@ -1499,17 +1499,19 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec, return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_da732x = { +static const struct snd_soc_component_driver soc_component_dev_da732x = { .set_bias_level = da732x_set_bias_level, - .component_driver = { - .controls = da732x_snd_controls, - .num_controls = ARRAY_SIZE(da732x_snd_controls), - .dapm_widgets = da732x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da732x_dapm_widgets), - .dapm_routes = da732x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes), - }, + .controls = da732x_snd_controls, + .num_controls = ARRAY_SIZE(da732x_snd_controls), + .dapm_widgets = da732x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da732x_dapm_widgets), + .dapm_routes = da732x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes), .set_pll = da732x_set_dai_pll, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int da732x_i2c_probe(struct i2c_client *i2c, @@ -1543,10 +1545,11 @@ static int da732x_i2c_probe(struct i2c_client *i2c, (reg & DA732X_ID_MAJOR_MASK) >> 4, (reg & DA732X_ID_MINOR_MASK)); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da732x, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da732x, da732x_dai, ARRAY_SIZE(da732x_dai)); if (ret != 0) - dev_err(&i2c->dev, "Failed to register codec.\n"); + dev_err(&i2c->dev, "Failed to register component.\n"); err: return ret; @@ -1554,8 +1557,6 @@ err: static int da732x_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); - return 0; } diff --git a/sound/soc/codecs/da9055.c b/sound/soc/codecs/da9055.c index bd7faaee5802..afdf90c78884 100644 --- a/sound/soc/codecs/da9055.c +++ b/sound/soc/codecs/da9055.c @@ -451,7 +451,7 @@ static const char * const da9055_hold_time_txt[] = { static SOC_ENUM_SINGLE_DECL(da9055_hold_time, DA9055_ALC_CTRL3, 0, da9055_hold_time_txt); -static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) +static int da9055_get_alc_data(struct snd_soc_component *component, u8 reg_val) { int mid_data, top_data; int sum = 0; @@ -460,17 +460,17 @@ static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) for (iteration = 0; iteration < DA9055_ALC_AVG_ITERATIONS; iteration++) { /* Select the left or right channel and capture data */ - snd_soc_write(codec, DA9055_ALC_CIC_OP_LVL_CTRL, reg_val); + snd_soc_component_write(component, DA9055_ALC_CIC_OP_LVL_CTRL, reg_val); /* Select middle 8 bits for read back from data register */ - snd_soc_write(codec, DA9055_ALC_CIC_OP_LVL_CTRL, + snd_soc_component_write(component, DA9055_ALC_CIC_OP_LVL_CTRL, reg_val | DA9055_ALC_DATA_MIDDLE); - mid_data = snd_soc_read(codec, DA9055_ALC_CIC_OP_LVL_DATA); + mid_data = snd_soc_component_read32(component, DA9055_ALC_CIC_OP_LVL_DATA); /* Select top 8 bits for read back from data register */ - snd_soc_write(codec, DA9055_ALC_CIC_OP_LVL_CTRL, + snd_soc_component_write(component, DA9055_ALC_CIC_OP_LVL_CTRL, reg_val | DA9055_ALC_DATA_TOP); - top_data = snd_soc_read(codec, DA9055_ALC_CIC_OP_LVL_DATA); + top_data = snd_soc_component_read32(component, DA9055_ALC_CIC_OP_LVL_DATA); sum += ((mid_data << 8) | (top_data << 16)); } @@ -481,7 +481,7 @@ static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) static int da9055_put_alc_sw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); u8 reg_val, adc_left, adc_right, mic_left, mic_right; int avg_left_data, avg_right_data, offset_l, offset_r; @@ -492,31 +492,31 @@ static int da9055_put_alc_sw(struct snd_kcontrol *kcontrol, */ /* Save current values from Mic control registers */ - mic_left = snd_soc_read(codec, DA9055_MIC_L_CTRL); - mic_right = snd_soc_read(codec, DA9055_MIC_R_CTRL); + mic_left = snd_soc_component_read32(component, DA9055_MIC_L_CTRL); + mic_right = snd_soc_component_read32(component, DA9055_MIC_R_CTRL); /* Mute Mic PGA Left and Right */ - snd_soc_update_bits(codec, DA9055_MIC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_MIC_L_CTRL, DA9055_MIC_L_MUTE_EN, DA9055_MIC_L_MUTE_EN); - snd_soc_update_bits(codec, DA9055_MIC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_MIC_R_CTRL, DA9055_MIC_R_MUTE_EN, DA9055_MIC_R_MUTE_EN); /* Save current values from ADC control registers */ - adc_left = snd_soc_read(codec, DA9055_ADC_L_CTRL); - adc_right = snd_soc_read(codec, DA9055_ADC_R_CTRL); + adc_left = snd_soc_component_read32(component, DA9055_ADC_L_CTRL); + adc_right = snd_soc_component_read32(component, DA9055_ADC_R_CTRL); /* Enable ADC Left and Right */ - snd_soc_update_bits(codec, DA9055_ADC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_ADC_L_CTRL, DA9055_ADC_L_EN, DA9055_ADC_L_EN); - snd_soc_update_bits(codec, DA9055_ADC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_ADC_R_CTRL, DA9055_ADC_R_EN, DA9055_ADC_R_EN); /* Calculate average for Left and Right data */ /* Left Data */ - avg_left_data = da9055_get_alc_data(codec, + avg_left_data = da9055_get_alc_data(component, DA9055_ALC_CIC_OP_CHANNEL_LEFT); /* Right Data */ - avg_right_data = da9055_get_alc_data(codec, + avg_right_data = da9055_get_alc_data(component, DA9055_ALC_CIC_OP_CHANNEL_RIGHT); /* Calculate DC offset */ @@ -524,22 +524,22 @@ static int da9055_put_alc_sw(struct snd_kcontrol *kcontrol, offset_r = -avg_right_data; reg_val = (offset_l & DA9055_ALC_OFFSET_15_8) >> 8; - snd_soc_write(codec, DA9055_ALC_OFFSET_OP2M_L, reg_val); + snd_soc_component_write(component, DA9055_ALC_OFFSET_OP2M_L, reg_val); reg_val = (offset_l & DA9055_ALC_OFFSET_17_16) >> 16; - snd_soc_write(codec, DA9055_ALC_OFFSET_OP2U_L, reg_val); + snd_soc_component_write(component, DA9055_ALC_OFFSET_OP2U_L, reg_val); reg_val = (offset_r & DA9055_ALC_OFFSET_15_8) >> 8; - snd_soc_write(codec, DA9055_ALC_OFFSET_OP2M_R, reg_val); + snd_soc_component_write(component, DA9055_ALC_OFFSET_OP2M_R, reg_val); reg_val = (offset_r & DA9055_ALC_OFFSET_17_16) >> 16; - snd_soc_write(codec, DA9055_ALC_OFFSET_OP2U_R, reg_val); + snd_soc_component_write(component, DA9055_ALC_OFFSET_OP2U_R, reg_val); /* Restore original values of ADC control registers */ - snd_soc_write(codec, DA9055_ADC_L_CTRL, adc_left); - snd_soc_write(codec, DA9055_ADC_R_CTRL, adc_right); + snd_soc_component_write(component, DA9055_ADC_L_CTRL, adc_left); + snd_soc_component_write(component, DA9055_ADC_R_CTRL, adc_right); /* Restore original values of Mic control registers */ - snd_soc_write(codec, DA9055_MIC_L_CTRL, mic_left); - snd_soc_write(codec, DA9055_MIC_R_CTRL, mic_right); + snd_soc_component_write(component, DA9055_MIC_L_CTRL, mic_left); + snd_soc_component_write(component, DA9055_MIC_R_CTRL, mic_right); } return snd_soc_put_volsw(kcontrol, ucontrol); @@ -1052,8 +1052,8 @@ static int da9055_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct da9055_priv *da9055 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct da9055_priv *da9055 = snd_soc_component_get_drvdata(component); u8 aif_ctrl, fs; u32 sysclk; @@ -1075,7 +1075,7 @@ static int da9055_hw_params(struct snd_pcm_substream *substream, } /* Set AIF format */ - snd_soc_update_bits(codec, DA9055_AIF_CTRL, DA9055_AIF_WORD_LENGTH_MASK, + snd_soc_component_update_bits(component, DA9055_AIF_CTRL, DA9055_AIF_WORD_LENGTH_MASK, aif_ctrl); switch (params_rate(params)) { @@ -1125,7 +1125,7 @@ static int da9055_hw_params(struct snd_pcm_substream *substream, if (da9055->mclk_rate) { /* PLL Mode, Write actual FS */ - snd_soc_write(codec, DA9055_SR, fs); + snd_soc_component_write(component, DA9055_SR, fs); } else { /* * Non-PLL Mode @@ -1134,24 +1134,24 @@ static int da9055_hw_params(struct snd_pcm_substream *substream, * to derive its sys clk. As sys clk has to be 256 * Fs, we * need to write constant sample rate i.e. 48KHz. */ - snd_soc_write(codec, DA9055_SR, DA9055_SR_48000); + snd_soc_component_write(component, DA9055_SR, DA9055_SR_48000); } if (da9055->mclk_rate && (da9055->mclk_rate != sysclk)) { /* PLL Mode */ if (!da9055->master) { /* PLL slave mode, enable PLL and also SRM */ - snd_soc_update_bits(codec, DA9055_PLL_CTRL, + snd_soc_component_update_bits(component, DA9055_PLL_CTRL, DA9055_PLL_EN | DA9055_PLL_SRM_EN, DA9055_PLL_EN | DA9055_PLL_SRM_EN); } else { /* PLL master mode, only enable PLL */ - snd_soc_update_bits(codec, DA9055_PLL_CTRL, + snd_soc_component_update_bits(component, DA9055_PLL_CTRL, DA9055_PLL_EN, DA9055_PLL_EN); } } else { /* Non PLL Mode, disable PLL */ - snd_soc_update_bits(codec, DA9055_PLL_CTRL, DA9055_PLL_EN, 0); + snd_soc_component_update_bits(component, DA9055_PLL_CTRL, DA9055_PLL_EN, 0); } return 0; @@ -1160,8 +1160,8 @@ static int da9055_hw_params(struct snd_pcm_substream *substream, /* Set DAI mode and Format */ static int da9055_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da9055_priv *da9055 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da9055_priv *da9055 = snd_soc_component_get_drvdata(component); u8 aif_clk_mode, aif_ctrl, mode; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1180,7 +1180,7 @@ static int da9055_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) } /* Don't allow change of mode if PLL is enabled */ - if ((snd_soc_read(codec, DA9055_PLL_CTRL) & DA9055_PLL_EN) && + if ((snd_soc_component_read32(component, DA9055_PLL_CTRL) & DA9055_PLL_EN) && (da9055->master != mode)) return -EINVAL; @@ -1207,27 +1207,27 @@ static int da9055_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) /* By default only 32 BCLK per WCLK is supported */ aif_clk_mode |= DA9055_AIF_BCLKS_PER_WCLK_32; - snd_soc_update_bits(codec, DA9055_AIF_CLK_MODE, + snd_soc_component_update_bits(component, DA9055_AIF_CLK_MODE, (DA9055_AIF_CLK_MODE_MASK | DA9055_AIF_BCLK_MASK), aif_clk_mode); - snd_soc_update_bits(codec, DA9055_AIF_CTRL, DA9055_AIF_FORMAT_MASK, + snd_soc_component_update_bits(component, DA9055_AIF_CTRL, DA9055_AIF_FORMAT_MASK, aif_ctrl); return 0; } static int da9055_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) { - snd_soc_update_bits(codec, DA9055_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_L_CTRL, DA9055_DAC_L_MUTE_EN, DA9055_DAC_L_MUTE_EN); - snd_soc_update_bits(codec, DA9055_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_R_CTRL, DA9055_DAC_R_MUTE_EN, DA9055_DAC_R_MUTE_EN); } else { - snd_soc_update_bits(codec, DA9055_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_L_CTRL, DA9055_DAC_L_MUTE_EN, 0); - snd_soc_update_bits(codec, DA9055_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_R_CTRL, DA9055_DAC_R_MUTE_EN, 0); } @@ -1240,8 +1240,8 @@ static int da9055_mute(struct snd_soc_dai *dai, int mute) static int da9055_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da9055_priv *da9055 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da9055_priv *da9055 = snd_soc_component_get_drvdata(component); switch (clk_id) { case DA9055_CLKSRC_MCLK: @@ -1283,13 +1283,13 @@ static int da9055_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int da9055_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int fref, unsigned int fout) { - struct snd_soc_codec *codec = codec_dai->codec; - struct da9055_priv *da9055 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct da9055_priv *da9055 = snd_soc_component_get_drvdata(component); u8 pll_frac_top, pll_frac_bot, pll_integer, cnt; /* Disable PLL before setting the divisors */ - snd_soc_update_bits(codec, DA9055_PLL_CTRL, DA9055_PLL_EN, 0); + snd_soc_component_update_bits(component, DA9055_PLL_CTRL, DA9055_PLL_EN, 0); /* In slave mode, there is only one set of divisors */ if (!da9055->master && (fout != 2822400)) @@ -1312,9 +1312,9 @@ static int da9055_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, goto pll_err; /* Write PLL dividers */ - snd_soc_write(codec, DA9055_PLL_FRAC_TOP, pll_frac_top); - snd_soc_write(codec, DA9055_PLL_FRAC_BOT, pll_frac_bot); - snd_soc_write(codec, DA9055_PLL_INTEGER, pll_integer); + snd_soc_component_write(component, DA9055_PLL_FRAC_TOP, pll_frac_top); + snd_soc_component_write(component, DA9055_PLL_FRAC_BOT, pll_frac_bot); + snd_soc_component_write(component, DA9055_PLL_INTEGER, pll_integer); return 0; pll_err: @@ -1353,7 +1353,7 @@ static struct snd_soc_dai_driver da9055_dai = { .symmetric_rates = 1, }; -static int da9055_set_bias_level(struct snd_soc_codec *codec, +static int da9055_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { @@ -1361,48 +1361,48 @@ static int da9055_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Enable VMID reference & master bias */ - snd_soc_update_bits(codec, DA9055_REFERENCES, + snd_soc_component_update_bits(component, DA9055_REFERENCES, DA9055_VMID_EN | DA9055_BIAS_EN, DA9055_VMID_EN | DA9055_BIAS_EN); } break; case SND_SOC_BIAS_OFF: /* Disable VMID reference & master bias */ - snd_soc_update_bits(codec, DA9055_REFERENCES, + snd_soc_component_update_bits(component, DA9055_REFERENCES, DA9055_VMID_EN | DA9055_BIAS_EN, 0); break; } return 0; } -static int da9055_probe(struct snd_soc_codec *codec) +static int da9055_probe(struct snd_soc_component *component) { - struct da9055_priv *da9055 = snd_soc_codec_get_drvdata(codec); + struct da9055_priv *da9055 = snd_soc_component_get_drvdata(component); /* Enable all Gain Ramps */ - snd_soc_update_bits(codec, DA9055_AUX_L_CTRL, + snd_soc_component_update_bits(component, DA9055_AUX_L_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_AUX_R_CTRL, + snd_soc_component_update_bits(component, DA9055_AUX_R_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXIN_L_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_MIXIN_R_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXIN_R_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_ADC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_ADC_L_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_ADC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_ADC_R_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_DAC_L_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_L_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_DAC_R_CTRL, + snd_soc_component_update_bits(component, DA9055_DAC_R_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_HP_L_CTRL, + snd_soc_component_update_bits(component, DA9055_HP_L_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_HP_R_CTRL, + snd_soc_component_update_bits(component, DA9055_HP_R_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); - snd_soc_update_bits(codec, DA9055_LINE_CTRL, + snd_soc_component_update_bits(component, DA9055_LINE_CTRL, DA9055_GAIN_RAMPING_EN, DA9055_GAIN_RAMPING_EN); /* @@ -1412,28 +1412,28 @@ static int da9055_probe(struct snd_soc_codec *codec) * being managed by DAPM while other (non power related) bits are * enabled here */ - snd_soc_update_bits(codec, DA9055_MIXIN_L_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXIN_L_CTRL, DA9055_MIXIN_L_MIX_EN, DA9055_MIXIN_L_MIX_EN); - snd_soc_update_bits(codec, DA9055_MIXIN_R_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXIN_R_CTRL, DA9055_MIXIN_R_MIX_EN, DA9055_MIXIN_R_MIX_EN); - snd_soc_update_bits(codec, DA9055_MIXOUT_L_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXOUT_L_CTRL, DA9055_MIXOUT_L_MIX_EN, DA9055_MIXOUT_L_MIX_EN); - snd_soc_update_bits(codec, DA9055_MIXOUT_R_CTRL, + snd_soc_component_update_bits(component, DA9055_MIXOUT_R_CTRL, DA9055_MIXOUT_R_MIX_EN, DA9055_MIXOUT_R_MIX_EN); /* Set this as per your system configuration */ - snd_soc_write(codec, DA9055_PLL_CTRL, DA9055_PLL_INDIV_10_20_MHZ); + snd_soc_component_write(component, DA9055_PLL_CTRL, DA9055_PLL_INDIV_10_20_MHZ); /* Set platform data values */ if (da9055->pdata) { /* set mic bias source */ if (da9055->pdata->micbias_source) { - snd_soc_update_bits(codec, DA9055_MIXIN_R_SELECT, + snd_soc_component_update_bits(component, DA9055_MIXIN_R_SELECT, DA9055_MICBIAS2_EN, DA9055_MICBIAS2_EN); } else { - snd_soc_update_bits(codec, DA9055_MIXIN_R_SELECT, + snd_soc_component_update_bits(component, DA9055_MIXIN_R_SELECT, DA9055_MICBIAS2_EN, 0); } /* set mic bias voltage */ @@ -1442,7 +1442,7 @@ static int da9055_probe(struct snd_soc_codec *codec) case DA9055_MICBIAS_2_1V: case DA9055_MICBIAS_1_8V: case DA9055_MICBIAS_1_6V: - snd_soc_update_bits(codec, DA9055_MIC_CONFIG, + snd_soc_component_update_bits(component, DA9055_MIC_CONFIG, DA9055_MICBIAS_LEVEL_MASK, (da9055->pdata->micbias) << 4); break; @@ -1451,18 +1451,19 @@ static int da9055_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_da9055 = { +static const struct snd_soc_component_driver soc_component_dev_da9055 = { .probe = da9055_probe, .set_bias_level = da9055_set_bias_level, - - .component_driver = { - .controls = da9055_snd_controls, - .num_controls = ARRAY_SIZE(da9055_snd_controls), - .dapm_widgets = da9055_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(da9055_dapm_widgets), - .dapm_routes = da9055_audio_map, - .num_dapm_routes = ARRAY_SIZE(da9055_audio_map), - }, + .controls = da9055_snd_controls, + .num_controls = ARRAY_SIZE(da9055_snd_controls), + .dapm_widgets = da9055_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(da9055_dapm_widgets), + .dapm_routes = da9055_audio_map, + .num_dapm_routes = ARRAY_SIZE(da9055_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config da9055_regmap_config = { @@ -1499,21 +1500,15 @@ static int da9055_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_da9055, &da9055_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_da9055, &da9055_dai, 1); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register da9055 codec: %d\n", + dev_err(&i2c->dev, "Failed to register da9055 component: %d\n", ret); } return ret; } -static int da9055_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - /* * DO NOT change the device Ids. The naming is intentionally specific as both * the CODEC and PMIC parts of this chip are instantiated separately as I2C @@ -1540,7 +1535,6 @@ static struct i2c_driver da9055_i2c_driver = { .of_match_table = of_match_ptr(da9055_of_match), }, .probe = da9055_i2c_probe, - .remove = da9055_remove, .id_table = da9055_i2c_id, }; diff --git a/sound/soc/codecs/dmic.c b/sound/soc/codecs/dmic.c index cf83c423394d..8c4926df9286 100644 --- a/sound/soc/codecs/dmic.c +++ b/sound/soc/codecs/dmic.c @@ -19,6 +19,7 @@ * */ +#include <linux/delay.h> #include <linux/gpio.h> #include <linux/gpio/consumer.h> #include <linux/platform_device.h> @@ -29,34 +30,33 @@ #include <sound/soc.h> #include <sound/soc-dapm.h> -static int dmic_daiops_trigger(struct snd_pcm_substream *substream, - int cmd, struct snd_soc_dai *dai) -{ - struct gpio_desc *dmic_en = snd_soc_dai_get_drvdata(dai); +struct dmic { + struct gpio_desc *gpio_en; + int wakeup_delay; +}; + +static int dmic_aif_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) { + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct dmic *dmic = snd_soc_component_get_drvdata(component); - if (!dmic_en) - return 0; + switch (event) { + case SND_SOC_DAPM_POST_PMU: + if (dmic->gpio_en) + gpiod_set_value(dmic->gpio_en, 1); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - gpiod_set_value(dmic_en, 1); + if (dmic->wakeup_delay) + msleep(dmic->wakeup_delay); break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - gpiod_set_value(dmic_en, 0); + case SND_SOC_DAPM_POST_PMD: + if (dmic->gpio_en) + gpiod_set_value(dmic->gpio_en, 0); break; } return 0; } -static const struct snd_soc_dai_ops dmic_dai_ops = { - .trigger = dmic_daiops_trigger, -}; - static struct snd_soc_dai_driver dmic_dai = { .name = "dmic-hifi", .capture = { @@ -68,26 +68,33 @@ static struct snd_soc_dai_driver dmic_dai = { | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE, }, - .ops = &dmic_dai_ops, }; -static int dmic_codec_probe(struct snd_soc_codec *codec) +static int dmic_component_probe(struct snd_soc_component *component) { - struct gpio_desc *dmic_en; + struct dmic *dmic; + + dmic = devm_kzalloc(component->dev, sizeof(*dmic), GFP_KERNEL); + if (!dmic) + return -ENOMEM; - dmic_en = devm_gpiod_get_optional(codec->dev, - "dmicen", GPIOD_OUT_LOW); - if (IS_ERR(dmic_en)) - return PTR_ERR(dmic_en); + dmic->gpio_en = devm_gpiod_get_optional(component->dev, + "dmicen", GPIOD_OUT_LOW); + if (IS_ERR(dmic->gpio_en)) + return PTR_ERR(dmic->gpio_en); - snd_soc_codec_set_drvdata(codec, dmic_en); + device_property_read_u32(component->dev, "wakeup-delay-ms", + &dmic->wakeup_delay); + + snd_soc_component_set_drvdata(component, dmic); return 0; } static const struct snd_soc_dapm_widget dmic_dapm_widgets[] = { - SND_SOC_DAPM_AIF_OUT("DMIC AIF", "Capture", 0, - SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT_E("DMIC AIF", "Capture", 0, + SND_SOC_NOPM, 0, 0, dmic_aif_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_INPUT("DMic"), }; @@ -95,14 +102,16 @@ static const struct snd_soc_dapm_route intercon[] = { {"DMIC AIF", NULL, "DMic"}, }; -static const struct snd_soc_codec_driver soc_dmic = { - .probe = dmic_codec_probe, - .component_driver = { - .dapm_widgets = dmic_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(dmic_dapm_widgets), - .dapm_routes = intercon, - .num_dapm_routes = ARRAY_SIZE(intercon), - }, +static const struct snd_soc_component_driver soc_dmic = { + .probe = dmic_component_probe, + .dapm_widgets = dmic_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(dmic_dapm_widgets), + .dapm_routes = intercon, + .num_dapm_routes = ARRAY_SIZE(intercon), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int dmic_dev_probe(struct platform_device *pdev) @@ -129,16 +138,10 @@ static int dmic_dev_probe(struct platform_device *pdev) } } - return snd_soc_register_codec(&pdev->dev, + return devm_snd_soc_register_component(&pdev->dev, &soc_dmic, dai_drv, 1); } -static int dmic_dev_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - MODULE_ALIAS("platform:dmic-codec"); static const struct of_device_id dmic_dev_match[] = { @@ -152,7 +155,6 @@ static struct platform_driver dmic_driver = { .of_match_table = dmic_dev_match, }, .probe = dmic_dev_probe, - .remove = dmic_dev_remove, }; module_platform_driver(dmic_driver); diff --git a/sound/soc/codecs/es7134.c b/sound/soc/codecs/es7134.c index 3869025754d8..58515bb1a303 100644 --- a/sound/soc/codecs/es7134.c +++ b/sound/soc/codecs/es7134.c @@ -69,28 +69,24 @@ static const struct snd_soc_dapm_route es7134_dapm_routes[] = { { "AOUTR", NULL, "DAC" }, }; -static const struct snd_soc_codec_driver es7134_codec_driver = { - .component_driver = { - .dapm_widgets = es7134_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(es7134_dapm_widgets), - .dapm_routes = es7134_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(es7134_dapm_routes), - }, +static const struct snd_soc_component_driver es7134_component_driver = { + .dapm_widgets = es7134_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(es7134_dapm_widgets), + .dapm_routes = es7134_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(es7134_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int es7134_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &es7134_codec_driver, + return devm_snd_soc_register_component(&pdev->dev, + &es7134_component_driver, &es7134_dai, 1); } -static int es7134_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - #ifdef CONFIG_OF static const struct of_device_id es7134_ids[] = { { .compatible = "everest,es7134", }, @@ -106,7 +102,6 @@ static struct platform_driver es7134_driver = { .of_match_table = of_match_ptr(es7134_ids), }, .probe = es7134_probe, - .remove = es7134_remove, }; module_platform_driver(es7134_driver); diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c index da2d353af5ba..e97d12d578b0 100644 --- a/sound/soc/codecs/es8316.c +++ b/sound/soc/codecs/es8316.c @@ -356,8 +356,8 @@ static const struct snd_soc_dapm_route es8316_dapm_routes[] = { static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component); int i; int count = 0; @@ -385,19 +385,19 @@ static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 serdata1 = 0; u8 serdata2 = 0; u8 clksw; u8 mask; if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(codec->dev, "Codec driver only supports slave mode\n"); + dev_err(component->dev, "Codec driver only supports slave mode\n"); return -EINVAL; } if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) { - dev_err(codec->dev, "Codec driver only supports I2S format\n"); + dev_err(component->dev, "Codec driver only supports I2S format\n"); return -EINVAL; } @@ -420,15 +420,15 @@ static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai, } mask = ES8316_SERDATA1_MASTER | ES8316_SERDATA1_BCLK_INV; - snd_soc_update_bits(codec, ES8316_SERDATA1, mask, serdata1); + snd_soc_component_update_bits(component, ES8316_SERDATA1, mask, serdata1); mask = ES8316_SERDATA2_FMT_MASK | ES8316_SERDATA2_ADCLRP; - snd_soc_update_bits(codec, ES8316_SERDATA_ADC, mask, serdata2); - snd_soc_update_bits(codec, ES8316_SERDATA_DAC, mask, serdata2); + snd_soc_component_update_bits(component, ES8316_SERDATA_ADC, mask, serdata2); + snd_soc_component_update_bits(component, ES8316_SERDATA_DAC, mask, serdata2); /* Enable BCLK and MCLK inputs in slave mode */ clksw = ES8316_CLKMGR_CLKSW_MCLK_ON | ES8316_CLKMGR_CLKSW_BCLK_ON; - snd_soc_update_bits(codec, ES8316_CLKMGR_CLKSW, clksw, clksw); + snd_soc_component_update_bits(component, ES8316_CLKMGR_CLKSW, clksw, clksw); return 0; } @@ -436,11 +436,11 @@ static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai, static int es8316_pcm_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component); if (es8316->sysclk == 0) { - dev_err(codec->dev, "No sysclk provided\n"); + dev_err(component->dev, "No sysclk provided\n"); return -EINVAL; } @@ -458,13 +458,12 @@ static int es8316_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->codec; - struct es8316_priv *es8316 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component); u8 wordlen = 0; if (!es8316->sysclk) { - dev_err(codec->dev, "No MCLK configured\n"); + dev_err(component->dev, "No MCLK configured\n"); return -EINVAL; } @@ -485,16 +484,16 @@ static int es8316_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, ES8316_SERDATA_DAC, + snd_soc_component_update_bits(component, ES8316_SERDATA_DAC, ES8316_SERDATA2_LEN_MASK, wordlen); - snd_soc_update_bits(codec, ES8316_SERDATA_ADC, + snd_soc_component_update_bits(component, ES8316_SERDATA_ADC, ES8316_SERDATA2_LEN_MASK, wordlen); return 0; } static int es8316_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, ES8316_DAC_SET1, 0x20, + snd_soc_component_update_bits(dai->component, ES8316_DAC_SET1, 0x20, mute ? 0x20 : 0); return 0; } @@ -530,42 +529,41 @@ static struct snd_soc_dai_driver es8316_dai = { .symmetric_rates = 1, }; -static int es8316_probe(struct snd_soc_codec *codec) +static int es8316_probe(struct snd_soc_component *component) { /* Reset codec and enable current state machine */ - snd_soc_write(codec, ES8316_RESET, 0x3f); + snd_soc_component_write(component, ES8316_RESET, 0x3f); usleep_range(5000, 5500); - snd_soc_write(codec, ES8316_RESET, ES8316_RESET_CSM_ON); + snd_soc_component_write(component, ES8316_RESET, ES8316_RESET_CSM_ON); msleep(30); /* * Documentation is unclear, but this value from the vendor driver is * needed otherwise audio output is silent. */ - snd_soc_write(codec, ES8316_SYS_VMIDSEL, 0xff); + snd_soc_component_write(component, ES8316_SYS_VMIDSEL, 0xff); /* * Documentation for this register is unclear and incomplete, * but here is a vendor-provided value that improves volume * and quality for Intel CHT platforms. */ - snd_soc_write(codec, ES8316_CLKMGR_ADCOSR, 0x32); + snd_soc_component_write(component, ES8316_CLKMGR_ADCOSR, 0x32); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_es8316 = { - .probe = es8316_probe, - .idle_bias_off = true, - - .component_driver = { - .controls = es8316_snd_controls, - .num_controls = ARRAY_SIZE(es8316_snd_controls), - .dapm_widgets = es8316_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(es8316_dapm_widgets), - .dapm_routes = es8316_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(es8316_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_es8316 = { + .probe = es8316_probe, + .controls = es8316_snd_controls, + .num_controls = ARRAY_SIZE(es8316_snd_controls), + .dapm_widgets = es8316_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(es8316_dapm_widgets), + .dapm_routes = es8316_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(es8316_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config es8316_regmap = { @@ -592,16 +590,11 @@ static int es8316_i2c_probe(struct i2c_client *i2c_client, if (IS_ERR(regmap)) return PTR_ERR(regmap); - return snd_soc_register_codec(&i2c_client->dev, &soc_codec_dev_es8316, + return devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_es8316, &es8316_dai, 1); } -static int es8316_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id es8316_i2c_id[] = { {"es8316", 0 }, {} @@ -627,7 +620,6 @@ static struct i2c_driver es8316_i2c_driver = { .of_match_table = of_match_ptr(es8316_of_match), }, .probe = es8316_i2c_probe, - .remove = es8316_i2c_remove, .id_table = es8316_i2c_id, }; module_i2c_driver(es8316_i2c_driver); diff --git a/sound/soc/codecs/es8328-i2c.c b/sound/soc/codecs/es8328-i2c.c index 318ab28c5351..19baa3260f85 100644 --- a/sound/soc/codecs/es8328-i2c.c +++ b/sound/soc/codecs/es8328-i2c.c @@ -39,19 +39,12 @@ static int es8328_i2c_probe(struct i2c_client *i2c, devm_regmap_init_i2c(i2c, &es8328_regmap_config)); } -static int es8328_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - return 0; -} - static struct i2c_driver es8328_i2c_driver = { .driver = { .name = "es8328", .of_match_table = es8328_of_match, }, .probe = es8328_i2c_probe, - .remove = es8328_i2c_remove, .id_table = es8328_id, }; diff --git a/sound/soc/codecs/es8328-spi.c b/sound/soc/codecs/es8328-spi.c index 8fbd935e1c76..d242bd1f7dcc 100644 --- a/sound/soc/codecs/es8328-spi.c +++ b/sound/soc/codecs/es8328-spi.c @@ -28,19 +28,12 @@ static int es8328_spi_probe(struct spi_device *spi) devm_regmap_init_spi(spi, &es8328_regmap_config)); } -static int es8328_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver es8328_spi_driver = { .driver = { .name = "es8328", .of_match_table = es8328_of_match, }, .probe = es8328_spi_probe, - .remove = es8328_spi_remove, }; module_spi_driver(es8328_spi_driver); diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c index bcdb8914ec16..e9fc2fd97d2f 100644 --- a/sound/soc/codecs/es8328.c +++ b/sound/soc/codecs/es8328.c @@ -116,9 +116,9 @@ static const struct { { 48000, ES8328_DACCONTROL6_DEEMPH_48k }, }; -static int es8328_set_deemph(struct snd_soc_codec *codec) +static int es8328_set_deemph(struct snd_soc_component *component) { - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); int val, i, best; /* @@ -138,17 +138,17 @@ static int es8328_set_deemph(struct snd_soc_codec *codec) val = ES8328_DACCONTROL6_DEEMPH_OFF; } - dev_dbg(codec->dev, "Set deemphasis %d\n", val); + dev_dbg(component->dev, "Set deemphasis %d\n", val); - return snd_soc_update_bits(codec, ES8328_DACCONTROL6, + return snd_soc_component_update_bits(component, ES8328_DACCONTROL6, ES8328_DACCONTROL6_DEEMPH_MASK, val); } static int es8328_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = es8328->deemph; return 0; @@ -157,15 +157,15 @@ static int es8328_get_deemph(struct snd_kcontrol *kcontrol, static int es8328_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); unsigned int deemph = ucontrol->value.integer.value[0]; int ret; if (deemph > 1) return -EINVAL; - ret = es8328_set_deemph(codec); + ret = es8328_set_deemph(component); if (ret < 0) return ret; @@ -455,7 +455,7 @@ static const struct snd_soc_dapm_route es8328_dapm_routes[] = { static int es8328_mute(struct snd_soc_dai *dai, int mute) { - return snd_soc_update_bits(dai->codec, ES8328_DACCONTROL3, + return snd_soc_component_update_bits(dai->component, ES8328_DACCONTROL3, ES8328_DACCONTROL3_DACMUTE, mute ? ES8328_DACCONTROL3_DACMUTE : 0); } @@ -463,8 +463,8 @@ static int es8328_mute(struct snd_soc_dai *dai, int mute) static int es8328_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); if (es8328->master && es8328->sysclk_constraints) snd_pcm_hw_constraint_list(substream->runtime, 0, @@ -478,8 +478,8 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); int i; int reg; int wl; @@ -492,7 +492,7 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, if (es8328->master) { if (!es8328->sysclk_constraints) { - dev_err(codec->dev, "No MCLK configured\n"); + dev_err(component->dev, "No MCLK configured\n"); return -EINVAL; } @@ -502,7 +502,7 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, break; if (i == es8328->sysclk_constraints->count) { - dev_err(codec->dev, + dev_err(component->dev, "LRCLK %d unsupported with current clock\n", params_rate(params)); return -EINVAL; @@ -513,7 +513,7 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, es8328->mclkdiv2 = 0; } - snd_soc_update_bits(codec, ES8328_MASTERMODE, + snd_soc_component_update_bits(component, ES8328_MASTERMODE, ES8328_MASTERMODE_MCLKDIV2, es8328->mclkdiv2 ? ES8328_MASTERMODE_MCLKDIV2 : 0); @@ -538,25 +538,25 @@ static int es8328_hw_params(struct snd_pcm_substream *substream, } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - snd_soc_update_bits(codec, ES8328_DACCONTROL1, + snd_soc_component_update_bits(component, ES8328_DACCONTROL1, ES8328_DACCONTROL1_DACWL_MASK, wl << ES8328_DACCONTROL1_DACWL_SHIFT); es8328->playback_fs = params_rate(params); - es8328_set_deemph(codec); + es8328_set_deemph(component); } else - snd_soc_update_bits(codec, ES8328_ADCCONTROL4, + snd_soc_component_update_bits(component, ES8328_ADCCONTROL4, ES8328_ADCCONTROL4_ADCWL_MASK, wl << ES8328_ADCCONTROL4_ADCWL_SHIFT); - return snd_soc_update_bits(codec, reg, ES8328_RATEMASK, ratio); + return snd_soc_component_update_bits(component, reg, ES8328_RATEMASK, ratio); } static int es8328_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); int mclkdiv2 = 0; switch (freq) { @@ -589,22 +589,22 @@ static int es8328_set_sysclk(struct snd_soc_dai *codec_dai, static int es8328_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct es8328_priv *es8328 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct es8328_priv *es8328 = snd_soc_component_get_drvdata(component); u8 dac_mode = 0; u8 adc_mode = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: /* Master serial port mode, with BCLK generated automatically */ - snd_soc_update_bits(codec, ES8328_MASTERMODE, + snd_soc_component_update_bits(component, ES8328_MASTERMODE, ES8328_MASTERMODE_MSC, ES8328_MASTERMODE_MSC); es8328->master = true; break; case SND_SOC_DAIFMT_CBS_CFS: /* Slave serial port mode */ - snd_soc_update_bits(codec, ES8328_MASTERMODE, + snd_soc_component_update_bits(component, ES8328_MASTERMODE, ES8328_MASTERMODE_MSC, 0); es8328->master = false; break; @@ -634,15 +634,15 @@ static int es8328_set_dai_fmt(struct snd_soc_dai *codec_dai, if ((fmt & SND_SOC_DAIFMT_INV_MASK) != SND_SOC_DAIFMT_NB_NF) return -EINVAL; - snd_soc_update_bits(codec, ES8328_DACCONTROL1, + snd_soc_component_update_bits(component, ES8328_DACCONTROL1, ES8328_DACCONTROL1_DACFORMAT_MASK, dac_mode); - snd_soc_update_bits(codec, ES8328_ADCCONTROL4, + snd_soc_component_update_bits(component, ES8328_ADCCONTROL4, ES8328_ADCCONTROL4_ADCFORMAT_MASK, adc_mode); return 0; } -static int es8328_set_bias_level(struct snd_soc_codec *codec, +static int es8328_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { @@ -651,8 +651,8 @@ static int es8328_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: /* VREF, VMID=2x50k, digital enabled */ - snd_soc_write(codec, ES8328_CHIPPOWER, 0); - snd_soc_update_bits(codec, ES8328_CONTROL1, + snd_soc_component_write(component, ES8328_CHIPPOWER, 0); + snd_soc_component_update_bits(component, ES8328_CONTROL1, ES8328_CONTROL1_VMIDSEL_MASK | ES8328_CONTROL1_ENREF, ES8328_CONTROL1_VMIDSEL_50k | @@ -660,8 +660,8 @@ static int es8328_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_update_bits(codec, ES8328_CONTROL1, + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_update_bits(component, ES8328_CONTROL1, ES8328_CONTROL1_VMIDSEL_MASK | ES8328_CONTROL1_ENREF, ES8328_CONTROL1_VMIDSEL_5k | @@ -671,12 +671,12 @@ static int es8328_set_bias_level(struct snd_soc_codec *codec, msleep(100); } - snd_soc_write(codec, ES8328_CONTROL2, + snd_soc_component_write(component, ES8328_CONTROL2, ES8328_CONTROL2_OVERCURRENT_ON | ES8328_CONTROL2_THERMAL_SHUTDOWN_ON); /* VREF, VMID=2*500k, digital stopped */ - snd_soc_update_bits(codec, ES8328_CONTROL1, + snd_soc_component_update_bits(component, ES8328_CONTROL1, ES8328_CONTROL1_VMIDSEL_MASK | ES8328_CONTROL1_ENREF, ES8328_CONTROL1_VMIDSEL_500k | @@ -684,7 +684,7 @@ static int es8328_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, ES8328_CONTROL1, + snd_soc_component_update_bits(component, ES8328_CONTROL1, ES8328_CONTROL1_VMIDSEL_MASK | ES8328_CONTROL1_ENREF, 0); @@ -721,80 +721,80 @@ static struct snd_soc_dai_driver es8328_dai = { .symmetric_rates = 1, }; -static int es8328_suspend(struct snd_soc_codec *codec) +static int es8328_suspend(struct snd_soc_component *component) { struct es8328_priv *es8328; int ret; - es8328 = snd_soc_codec_get_drvdata(codec); + es8328 = snd_soc_component_get_drvdata(component); clk_disable_unprepare(es8328->clk); ret = regulator_bulk_disable(ARRAY_SIZE(es8328->supplies), es8328->supplies); if (ret) { - dev_err(codec->dev, "unable to disable regulators\n"); + dev_err(component->dev, "unable to disable regulators\n"); return ret; } return 0; } -static int es8328_resume(struct snd_soc_codec *codec) +static int es8328_resume(struct snd_soc_component *component) { - struct regmap *regmap = dev_get_regmap(codec->dev, NULL); + struct regmap *regmap = dev_get_regmap(component->dev, NULL); struct es8328_priv *es8328; int ret; - es8328 = snd_soc_codec_get_drvdata(codec); + es8328 = snd_soc_component_get_drvdata(component); ret = clk_prepare_enable(es8328->clk); if (ret) { - dev_err(codec->dev, "unable to enable clock\n"); + dev_err(component->dev, "unable to enable clock\n"); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(es8328->supplies), es8328->supplies); if (ret) { - dev_err(codec->dev, "unable to enable regulators\n"); + dev_err(component->dev, "unable to enable regulators\n"); return ret; } regcache_mark_dirty(regmap); ret = regcache_sync(regmap); if (ret) { - dev_err(codec->dev, "unable to sync regcache\n"); + dev_err(component->dev, "unable to sync regcache\n"); return ret; } return 0; } -static int es8328_codec_probe(struct snd_soc_codec *codec) +static int es8328_component_probe(struct snd_soc_component *component) { struct es8328_priv *es8328; int ret; - es8328 = snd_soc_codec_get_drvdata(codec); + es8328 = snd_soc_component_get_drvdata(component); ret = regulator_bulk_enable(ARRAY_SIZE(es8328->supplies), es8328->supplies); if (ret) { - dev_err(codec->dev, "unable to enable regulators\n"); + dev_err(component->dev, "unable to enable regulators\n"); return ret; } /* Setup clocks */ - es8328->clk = devm_clk_get(codec->dev, NULL); + es8328->clk = devm_clk_get(component->dev, NULL); if (IS_ERR(es8328->clk)) { - dev_err(codec->dev, "codec clock missing or invalid\n"); + dev_err(component->dev, "codec clock missing or invalid\n"); ret = PTR_ERR(es8328->clk); goto clk_fail; } ret = clk_prepare_enable(es8328->clk); if (ret) { - dev_err(codec->dev, "unable to prepare codec clk\n"); + dev_err(component->dev, "unable to prepare codec clk\n"); goto clk_fail; } @@ -806,19 +806,17 @@ clk_fail: return ret; } -static int es8328_remove(struct snd_soc_codec *codec) +static void es8328_remove(struct snd_soc_component *component) { struct es8328_priv *es8328; - es8328 = snd_soc_codec_get_drvdata(codec); + es8328 = snd_soc_component_get_drvdata(component); if (es8328->clk) clk_disable_unprepare(es8328->clk); regulator_bulk_disable(ARRAY_SIZE(es8328->supplies), es8328->supplies); - - return 0; } const struct regmap_config es8328_regmap_config = { @@ -830,22 +828,23 @@ const struct regmap_config es8328_regmap_config = { }; EXPORT_SYMBOL_GPL(es8328_regmap_config); -static const struct snd_soc_codec_driver es8328_codec_driver = { - .probe = es8328_codec_probe, - .suspend = es8328_suspend, - .resume = es8328_resume, - .remove = es8328_remove, - .set_bias_level = es8328_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = es8328_snd_controls, - .num_controls = ARRAY_SIZE(es8328_snd_controls), - .dapm_widgets = es8328_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(es8328_dapm_widgets), - .dapm_routes = es8328_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(es8328_dapm_routes), - }, +static const struct snd_soc_component_driver es8328_component_driver = { + .probe = es8328_component_probe, + .remove = es8328_remove, + .suspend = es8328_suspend, + .resume = es8328_resume, + .set_bias_level = es8328_set_bias_level, + .controls = es8328_snd_controls, + .num_controls = ARRAY_SIZE(es8328_snd_controls), + .dapm_widgets = es8328_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(es8328_dapm_widgets), + .dapm_routes = es8328_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(es8328_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; int es8328_probe(struct device *dev, struct regmap *regmap) @@ -875,8 +874,8 @@ int es8328_probe(struct device *dev, struct regmap *regmap) dev_set_drvdata(dev, es8328); - return snd_soc_register_codec(dev, - &es8328_codec_driver, &es8328_dai, 1); + return devm_snd_soc_register_component(dev, + &es8328_component_driver, &es8328_dai, 1); } EXPORT_SYMBOL_GPL(es8328_probe); diff --git a/sound/soc/codecs/gtm601.c b/sound/soc/codecs/gtm601.c index 926b1a4e37d4..c11ed60ccefb 100644 --- a/sound/soc/codecs/gtm601.c +++ b/sound/soc/codecs/gtm601.c @@ -19,7 +19,6 @@ #include <linux/device.h> #include <sound/core.h> #include <sound/pcm.h> -#include <sound/ac97_codec.h> #include <sound/initval.h> #include <sound/soc.h> @@ -51,25 +50,21 @@ static struct snd_soc_dai_driver gtm601_dai = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_gtm601 = { - .component_driver = { - .dapm_widgets = gtm601_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(gtm601_dapm_widgets), - .dapm_routes = gtm601_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(gtm601_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_gtm601 = { + .dapm_widgets = gtm601_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(gtm601_dapm_widgets), + .dapm_routes = gtm601_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(gtm601_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int gtm601_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_gtm601, >m601_dai, 1); -} - -static int gtm601_platform_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_gtm601, >m601_dai, 1); } #if defined(CONFIG_OF) @@ -86,7 +81,6 @@ static struct platform_driver gtm601_codec_driver = { .of_match_table = of_match_ptr(gtm601_codec_of_match), }, .probe = gtm601_platform_probe, - .remove = gtm601_platform_remove, }; module_platform_driver(gtm601_codec_driver); diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c index dba6f4c5074a..84f7a7a36e4b 100644 --- a/sound/soc/codecs/hdac_hdmi.c +++ b/sound/soc/codecs/hdac_hdmi.c @@ -718,10 +718,22 @@ static struct hdac_hdmi_pcm *hdac_hdmi_get_pcm(struct hdac_ext_device *edev, static void hdac_hdmi_set_power_state(struct hdac_ext_device *edev, hda_nid_t nid, unsigned int pwr_state) { + int count; + unsigned int state; + if (get_wcaps(&edev->hdev, nid) & AC_WCAP_POWER) { - if (!snd_hdac_check_power_state(&edev->hdev, nid, pwr_state)) - snd_hdac_codec_write(&edev->hdev, nid, 0, - AC_VERB_SET_POWER_STATE, pwr_state); + if (!snd_hdac_check_power_state(&edev->hdev, nid, pwr_state)) { + for (count = 0; count < 10; count++) { + snd_hdac_codec_read(&edev->hdev, nid, 0, + AC_VERB_SET_POWER_STATE, + pwr_state); + state = snd_hdac_sync_power_state(&edev->hdev, + nid, pwr_state); + if (!(state & AC_PWRST_ERROR)) + break; + } + } + } } @@ -1536,7 +1548,7 @@ static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe) struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev); struct hdac_hdmi_pin *pin = NULL; struct hdac_hdmi_port *hport = NULL; - struct snd_soc_codec *codec = edev->scodec; + struct snd_soc_component *component = edev->scodec; int i; /* Don't know how this mapping is derived */ @@ -1551,7 +1563,7 @@ static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe) * connection states are updated in anyway at the end of the resume, * we can skip it when received during PM process. */ - if (snd_power_get_state(codec->component.card->snd_card) != + if (snd_power_get_state(component->card->snd_card) != SNDRV_CTL_POWER_D0) return; @@ -1609,10 +1621,10 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card, char kc_name[NAME_SIZE], xname[NAME_SIZE]; char *name; int i = 0, j; - struct snd_soc_codec *codec = edev->scodec; + struct snd_soc_component *component = edev->scodec; struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev); - kc = devm_kcalloc(codec->dev, hdmi->num_ports, + kc = devm_kcalloc(component->dev, hdmi->num_ports, sizeof(*kc), GFP_KERNEL); if (!kc) @@ -1622,11 +1634,11 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card, for (j = 0; j < pin->num_ports; j++) { snprintf(xname, sizeof(xname), "hif%d-%d Jack", pin->nid, pin->ports[j].id); - name = devm_kstrdup(codec->dev, xname, GFP_KERNEL); + name = devm_kstrdup(component->dev, xname, GFP_KERNEL); if (!name) return -ENOMEM; snprintf(kc_name, sizeof(kc_name), "%s Switch", xname); - kc[i].name = devm_kstrdup(codec->dev, kc_name, + kc[i].name = devm_kstrdup(component->dev, kc_name, GFP_KERNEL); if (!kc[i].name) return -ENOMEM; @@ -1644,10 +1656,10 @@ static int create_fill_jack_kcontrols(struct snd_soc_card *card, return snd_soc_add_card_controls(card, kc, i); } -int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec, +int hdac_hdmi_jack_port_init(struct snd_soc_component *component, struct snd_soc_dapm_context *dapm) { - struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec); + struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component); struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev); struct hdac_hdmi_pin *pin; struct snd_soc_dapm_widget *widgets; @@ -1722,8 +1734,8 @@ EXPORT_SYMBOL_GPL(hdac_hdmi_jack_port_init); int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int device, struct snd_soc_jack *jack) { - struct snd_soc_codec *codec = dai->codec; - struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component); struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev); struct hdac_hdmi_pcm *pcm; struct snd_pcm *snd_pcm; @@ -1784,16 +1796,16 @@ static void hdac_hdmi_present_sense_all_pins(struct hdac_ext_device *edev, } } -static int hdmi_codec_probe(struct snd_soc_codec *codec) +static int hdmi_codec_probe(struct snd_soc_component *component) { - struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec); + struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component); struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(&edev->hdev); struct snd_soc_dapm_context *dapm = - snd_soc_component_get_dapm(&codec->component); + snd_soc_component_get_dapm(component); struct hdac_ext_link *hlink = NULL; int ret; - edev->scodec = codec; + edev->scodec = component; /* * hold the ref while we probe, also no need to drop the ref on @@ -1834,12 +1846,11 @@ static int hdmi_codec_probe(struct snd_soc_codec *codec) return 0; } -static int hdmi_codec_remove(struct snd_soc_codec *codec) +static void hdmi_codec_remove(struct snd_soc_component *component) { - struct hdac_ext_device *edev = snd_soc_codec_get_drvdata(codec); + struct hdac_ext_device *edev = snd_soc_component_get_drvdata(component); pm_runtime_disable(&edev->hdev.dev); - return 0; } #ifdef CONFIG_PM @@ -1891,10 +1902,12 @@ static void hdmi_codec_complete(struct device *dev) #define hdmi_codec_complete NULL #endif -static const struct snd_soc_codec_driver hdmi_hda_codec = { - .probe = hdmi_codec_probe, - .remove = hdmi_codec_remove, - .idle_bias_off = true, +static const struct snd_soc_component_driver hdmi_hda_codec = { + .probe = hdmi_codec_probe, + .remove = hdmi_codec_remove, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static void hdac_hdmi_get_chmap(struct hdac_device *hdev, int pcm_idx, @@ -2042,7 +2055,7 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev) snd_hdac_refresh_widgets(hdev, true); /* ASoC specific initialization */ - ret = snd_soc_register_codec(&hdev->dev, &hdmi_hda_codec, + ret = devm_snd_soc_register_component(&hdev->dev, &hdmi_hda_codec, hdmi_dais, num_dais); snd_hdac_ext_bus_link_put(edev->ebus, hlink); @@ -2059,8 +2072,6 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev) struct hdac_hdmi_port *port, *port_next; int i; - snd_soc_unregister_codec(&edev->hdev.dev); - list_for_each_entry_safe(pcm, pcm_next, &hdmi->pcm_list, head) { pcm->cvt = NULL; if (list_empty(&pcm->port_list)) diff --git a/sound/soc/codecs/hdac_hdmi.h b/sound/soc/codecs/hdac_hdmi.h index b5b57a5cbbfd..4fa2fc9ee893 100644 --- a/sound/soc/codecs/hdac_hdmi.h +++ b/sound/soc/codecs/hdac_hdmi.h @@ -5,6 +5,6 @@ int hdac_hdmi_jack_init(struct snd_soc_dai *dai, int pcm, struct snd_soc_jack *jack); -int hdac_hdmi_jack_port_init(struct snd_soc_codec *codec, +int hdac_hdmi_jack_port_init(struct snd_soc_component *component, struct snd_soc_dapm_context *dapm); #endif /* __HDAC_HDMI_H__ */ diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c index 5672e516bec3..6fa11888672d 100644 --- a/sound/soc/codecs/hdmi-codec.c +++ b/sound/soc/codecs/hdmi-codec.c @@ -730,14 +730,16 @@ static int hdmi_of_xlate_dai_id(struct snd_soc_component *component, return ret; } -static const struct snd_soc_codec_driver hdmi_codec = { - .component_driver = { - .dapm_widgets = hdmi_widgets, - .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), - .dapm_routes = hdmi_routes, - .num_dapm_routes = ARRAY_SIZE(hdmi_routes), - .of_xlate_dai_id = hdmi_of_xlate_dai_id, - }, +static const struct snd_soc_component_driver hdmi_driver = { + .dapm_widgets = hdmi_widgets, + .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), + .dapm_routes = hdmi_routes, + .num_dapm_routes = ARRAY_SIZE(hdmi_routes), + .of_xlate_dai_id = hdmi_of_xlate_dai_id, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int hdmi_codec_probe(struct platform_device *pdev) @@ -784,10 +786,10 @@ static int hdmi_codec_probe(struct platform_device *pdev) if (hcd->spdif) hcp->daidrv[i] = hdmi_spdif_dai; - ret = snd_soc_register_codec(dev, &hdmi_codec, hcp->daidrv, + ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv, dai_count); if (ret) { - dev_err(dev, "%s: snd_soc_register_codec() failed (%d)\n", + dev_err(dev, "%s: snd_soc_register_component() failed (%d)\n", __func__, ret); return ret; } @@ -796,24 +798,11 @@ static int hdmi_codec_probe(struct platform_device *pdev) return 0; } -static int hdmi_codec_remove(struct platform_device *pdev) -{ - struct device *dev = &pdev->dev; - struct hdmi_codec_priv *hcp; - - hcp = dev_get_drvdata(dev); - kfree(hcp->chmap_info); - snd_soc_unregister_codec(dev); - - return 0; -} - static struct platform_driver hdmi_codec_driver = { .driver = { .name = HDMI_CODEC_DRV_NAME, }, .probe = hdmi_codec_probe, - .remove = hdmi_codec_remove, }; module_platform_driver(hdmi_codec_driver); diff --git a/sound/soc/codecs/ics43432.c b/sound/soc/codecs/ics43432.c index 651206273f36..148d6d6b2a2b 100644 --- a/sound/soc/codecs/ics43432.c +++ b/sound/soc/codecs/ics43432.c @@ -37,21 +37,20 @@ static struct snd_soc_dai_driver ics43432_dai = { }, }; -static const struct snd_soc_codec_driver ics43432_codec_driver = { +static const struct snd_soc_component_driver ics43432_component_driver = { + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int ics43432_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &ics43432_codec_driver, + return devm_snd_soc_register_component(&pdev->dev, + &ics43432_component_driver, &ics43432_dai, 1); } -static int ics43432_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - #ifdef CONFIG_OF static const struct of_device_id ics43432_ids[] = { { .compatible = "invensense,ics43432", }, @@ -66,7 +65,6 @@ static struct platform_driver ics43432_driver = { .of_match_table = of_match_ptr(ics43432_ids), }, .probe = ics43432_probe, - .remove = ics43432_remove, }; module_platform_driver(ics43432_driver); diff --git a/sound/soc/codecs/inno_rk3036.c b/sound/soc/codecs/inno_rk3036.c index 6b59b6f08298..85a336ba75f6 100644 --- a/sound/soc/codecs/inno_rk3036.c +++ b/sound/soc/codecs/inno_rk3036.c @@ -196,10 +196,10 @@ static const struct snd_soc_dapm_route rk3036_codec_dapm_routes[] = { static int rk3036_codec_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int reg01_val = 0, reg02_val = 0, reg03_val = 0; - dev_dbg(codec->dev, "rk3036_codec dai set fmt : %08x\n", fmt); + dev_dbg(component->dev, "rk3036_codec dai set fmt : %08x\n", fmt); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: @@ -211,7 +211,7 @@ static int rk3036_codec_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) INNO_R01_I2SMODE_MASTER; break; default: - dev_err(codec->dev, "invalid fmt\n"); + dev_err(component->dev, "invalid fmt\n"); return -EINVAL; } @@ -229,7 +229,7 @@ static int rk3036_codec_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) reg02_val |= INNO_R02_DACM_LJM; break; default: - dev_err(codec->dev, "set dai format failed\n"); + dev_err(component->dev, "set dai format failed\n"); return -EINVAL; } @@ -251,15 +251,15 @@ static int rk3036_codec_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) reg03_val |= INNO_R03_BCP_REVERSAL; break; default: - dev_err(codec->dev, "set dai format failed\n"); + dev_err(component->dev, "set dai format failed\n"); return -EINVAL; } - snd_soc_update_bits(codec, INNO_R01, INNO_R01_I2SMODE_MSK | + snd_soc_component_update_bits(component, INNO_R01, INNO_R01_I2SMODE_MSK | INNO_R01_PINDIR_MSK, reg01_val); - snd_soc_update_bits(codec, INNO_R02, INNO_R02_LRCP_MSK | + snd_soc_component_update_bits(component, INNO_R02, INNO_R02_LRCP_MSK | INNO_R02_DACM_MSK, reg02_val); - snd_soc_update_bits(codec, INNO_R03, INNO_R03_BCP_MSK, reg03_val); + snd_soc_component_update_bits(component, INNO_R03, INNO_R03_BCP_MSK, reg03_val); return 0; } @@ -268,7 +268,7 @@ static int rk3036_codec_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int reg02_val = 0, reg03_val = 0; switch (params_format(hw_params)) { @@ -291,9 +291,9 @@ static int rk3036_codec_dai_hw_params(struct snd_pcm_substream *substream, reg02_val |= INNO_R02_LRCP_NORMAL; reg03_val |= INNO_R03_FWL_32BIT | INNO_R03_DACR_WORK; - snd_soc_update_bits(codec, INNO_R02, INNO_R02_LRCP_MSK | + snd_soc_component_update_bits(component, INNO_R02, INNO_R02_LRCP_MSK | INNO_R02_VWL_MSK, reg02_val); - snd_soc_update_bits(codec, INNO_R03, INNO_R03_DACR_MSK | + snd_soc_component_update_bits(component, INNO_R03, INNO_R03_DACR_MSK | INNO_R03_FWL_MSK, reg03_val); return 0; } @@ -330,43 +330,42 @@ static struct snd_soc_dai_driver rk3036_codec_dai_driver[] = { }, }; -static void rk3036_codec_reset(struct snd_soc_codec *codec) +static void rk3036_codec_reset(struct snd_soc_component *component) { - snd_soc_write(codec, INNO_R00, + snd_soc_component_write(component, INNO_R00, INNO_R00_CSR_RESET | INNO_R00_CDCR_RESET); - snd_soc_write(codec, INNO_R00, + snd_soc_component_write(component, INNO_R00, INNO_R00_CSR_WORK | INNO_R00_CDCR_WORK); } -static int rk3036_codec_probe(struct snd_soc_codec *codec) +static int rk3036_codec_probe(struct snd_soc_component *component) { - rk3036_codec_reset(codec); + rk3036_codec_reset(component); return 0; } -static int rk3036_codec_remove(struct snd_soc_codec *codec) +static void rk3036_codec_remove(struct snd_soc_component *component) { - rk3036_codec_reset(codec); - return 0; + rk3036_codec_reset(component); } -static int rk3036_codec_set_bias_level(struct snd_soc_codec *codec, +static int rk3036_codec_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_STANDBY: /* set a big current for capacitor charging. */ - snd_soc_write(codec, INNO_R10, INNO_R10_MAX_CUR); + snd_soc_component_write(component, INNO_R10, INNO_R10_MAX_CUR); /* start precharge */ - snd_soc_write(codec, INNO_R06, INNO_R06_DAC_PRECHARGE); + snd_soc_component_write(component, INNO_R06, INNO_R06_DAC_PRECHARGE); break; case SND_SOC_BIAS_OFF: /* set a big current for capacitor discharging. */ - snd_soc_write(codec, INNO_R10, INNO_R10_MAX_CUR); + snd_soc_component_write(component, INNO_R10, INNO_R10_MAX_CUR); /* start discharge. */ - snd_soc_write(codec, INNO_R06, INNO_R06_DAC_DISCHARGE); + snd_soc_component_write(component, INNO_R06, INNO_R06_DAC_DISCHARGE); break; default: @@ -376,18 +375,20 @@ static int rk3036_codec_set_bias_level(struct snd_soc_codec *codec, return 0; } -static const struct snd_soc_codec_driver rk3036_codec_driver = { +static const struct snd_soc_component_driver rk3036_codec_driver = { .probe = rk3036_codec_probe, .remove = rk3036_codec_remove, .set_bias_level = rk3036_codec_set_bias_level, - .component_driver = { - .controls = rk3036_codec_dapm_controls, - .num_controls = ARRAY_SIZE(rk3036_codec_dapm_controls), - .dapm_routes = rk3036_codec_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rk3036_codec_dapm_routes), - .dapm_widgets = rk3036_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rk3036_codec_dapm_widgets), - }, + .controls = rk3036_codec_dapm_controls, + .num_controls = ARRAY_SIZE(rk3036_codec_dapm_controls), + .dapm_routes = rk3036_codec_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rk3036_codec_dapm_routes), + .dapm_widgets = rk3036_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rk3036_codec_dapm_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rk3036_codec_regmap_config = { @@ -449,7 +450,7 @@ static int rk3036_codec_platform_probe(struct platform_device *pdev) priv->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, priv); - ret = snd_soc_register_codec(&pdev->dev, &rk3036_codec_driver, + ret = devm_snd_soc_register_component(&pdev->dev, &rk3036_codec_driver, rk3036_codec_dai_driver, ARRAY_SIZE(rk3036_codec_dai_driver)); if (ret) { @@ -464,7 +465,6 @@ static int rk3036_codec_platform_remove(struct platform_device *pdev) { struct rk3036_codec_priv *priv = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); clk_disable_unprepare(priv->pclk); return 0; diff --git a/sound/soc/codecs/isabelle.c b/sound/soc/codecs/isabelle.c index 5ca99280ae00..166420376e67 100644 --- a/sound/soc/codecs/isabelle.c +++ b/sound/soc/codecs/isabelle.c @@ -867,7 +867,7 @@ static const struct snd_soc_dapm_route isabelle_intercon[] = { static int isabelle_hs_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, ISABELLE_DAC1_SOFTRAMP_REG, + snd_soc_component_update_bits(dai->component, ISABELLE_DAC1_SOFTRAMP_REG, BIT(4), (mute ? BIT(4) : 0)); return 0; @@ -875,7 +875,7 @@ static int isabelle_hs_mute(struct snd_soc_dai *dai, int mute) static int isabelle_hf_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, ISABELLE_DAC2_SOFTRAMP_REG, + snd_soc_component_update_bits(dai->component, ISABELLE_DAC2_SOFTRAMP_REG, BIT(4), (mute ? BIT(4) : 0)); return 0; @@ -883,13 +883,13 @@ static int isabelle_hf_mute(struct snd_soc_dai *dai, int mute) static int isabelle_line_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, ISABELLE_DAC3_SOFTRAMP_REG, + snd_soc_component_update_bits(dai->component, ISABELLE_DAC3_SOFTRAMP_REG, BIT(4), (mute ? BIT(4) : 0)); return 0; } -static int isabelle_set_bias_level(struct snd_soc_codec *codec, +static int isabelle_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { @@ -899,12 +899,12 @@ static int isabelle_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, ISABELLE_PWR_EN_REG, + snd_soc_component_update_bits(component, ISABELLE_PWR_EN_REG, ISABELLE_CHIP_EN, BIT(0)); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, ISABELLE_PWR_EN_REG, + snd_soc_component_update_bits(component, ISABELLE_PWR_EN_REG, ISABELLE_CHIP_EN, 0); break; } @@ -916,7 +916,7 @@ static int isabelle_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 aif = 0; unsigned int fs_val = 0; @@ -952,7 +952,7 @@ static int isabelle_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, ISABELLE_FS_RATE_CFG_REG, + snd_soc_component_update_bits(component, ISABELLE_FS_RATE_CFG_REG, ISABELLE_FS_RATE_MASK, fs_val); /* bit size */ @@ -967,7 +967,7 @@ static int isabelle_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, ISABELLE_INTF_CFG_REG, + snd_soc_component_update_bits(component, ISABELLE_INTF_CFG_REG, ISABELLE_AIF_LENGTH_MASK, aif); return 0; @@ -975,7 +975,7 @@ static int isabelle_hw_params(struct snd_pcm_substream *substream, static int isabelle_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; unsigned int aif_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1003,7 +1003,7 @@ static int isabelle_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, ISABELLE_INTF_CFG_REG, + snd_soc_component_update_bits(component, ISABELLE_INTF_CFG_REG, (ISABELLE_AIF_MS | ISABELLE_AIF_FMT_MASK), aif_val); return 0; @@ -1087,17 +1087,17 @@ static struct snd_soc_dai_driver isabelle_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_isabelle = { - .set_bias_level = isabelle_set_bias_level, - .component_driver = { - .controls = isabelle_snd_controls, - .num_controls = ARRAY_SIZE(isabelle_snd_controls), - .dapm_widgets = isabelle_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(isabelle_dapm_widgets), - .dapm_routes = isabelle_intercon, - .num_dapm_routes = ARRAY_SIZE(isabelle_intercon), - }, - .idle_bias_off = true, +static const struct snd_soc_component_driver soc_component_dev_isabelle = { + .set_bias_level = isabelle_set_bias_level, + .controls = isabelle_snd_controls, + .num_controls = ARRAY_SIZE(isabelle_snd_controls), + .dapm_widgets = isabelle_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(isabelle_dapm_widgets), + .dapm_routes = isabelle_intercon, + .num_dapm_routes = ARRAY_SIZE(isabelle_intercon), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config isabelle_regmap_config = { @@ -1125,23 +1125,17 @@ static int isabelle_i2c_probe(struct i2c_client *i2c, } i2c_set_clientdata(i2c, isabelle_regmap); - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_isabelle, isabelle_dai, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_isabelle, isabelle_dai, ARRAY_SIZE(isabelle_dai)); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } return ret; } -static int isabelle_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id isabelle_i2c_id[] = { { "isabelle", 0 }, { } @@ -1153,7 +1147,6 @@ static struct i2c_driver isabelle_i2c_driver = { .name = "isabelle", }, .probe = isabelle_i2c_probe, - .remove = isabelle_i2c_remove, .id_table = isabelle_i2c_id, }; diff --git a/sound/soc/codecs/jz4740.c b/sound/soc/codecs/jz4740.c index 6324ccdc8a5c..9395b583432c 100644 --- a/sound/soc/codecs/jz4740.c +++ b/sound/soc/codecs/jz4740.c @@ -157,7 +157,7 @@ static const struct snd_soc_dapm_route jz4740_codec_dapm_routes[] = { static int jz4740_codec_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(dai->codec); + struct jz4740_codec *jz4740_codec = snd_soc_component_get_drvdata(dai->component); uint32_t val; switch (params_rate(params)) { @@ -236,10 +236,10 @@ static void jz4740_codec_wakeup(struct regmap *regmap) regcache_sync(regmap); } -static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, +static int jz4740_codec_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); + struct jz4740_codec *jz4740_codec = snd_soc_component_get_drvdata(component); struct regmap *regmap = jz4740_codec->regmap; unsigned int mask; unsigned int value; @@ -257,7 +257,7 @@ static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: /* The only way to clear the suspend flag is to reset the codec */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) jz4740_codec_wakeup(regmap); mask = JZ4740_CODEC_1_VREF_DISABLE | @@ -283,9 +283,9 @@ static int jz4740_codec_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int jz4740_codec_dev_probe(struct snd_soc_codec *codec) +static int jz4740_codec_dev_probe(struct snd_soc_component *component) { - struct jz4740_codec *jz4740_codec = snd_soc_codec_get_drvdata(codec); + struct jz4740_codec *jz4740_codec = snd_soc_component_get_drvdata(component); regmap_update_bits(jz4740_codec->regmap, JZ4740_REG_CODEC_1, JZ4740_CODEC_1_SW2_ENABLE, JZ4740_CODEC_1_SW2_ENABLE); @@ -293,19 +293,21 @@ static int jz4740_codec_dev_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_jz4740_codec = { - .probe = jz4740_codec_dev_probe, - .set_bias_level = jz4740_codec_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = jz4740_codec_controls, - .num_controls = ARRAY_SIZE(jz4740_codec_controls), - .dapm_widgets = jz4740_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(jz4740_codec_dapm_widgets), - .dapm_routes = jz4740_codec_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(jz4740_codec_dapm_routes), - }, +static const struct snd_soc_component_driver soc_codec_dev_jz4740_codec = { + .probe = jz4740_codec_dev_probe, + .set_bias_level = jz4740_codec_set_bias_level, + .controls = jz4740_codec_controls, + .num_controls = ARRAY_SIZE(jz4740_codec_controls), + .dapm_widgets = jz4740_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(jz4740_codec_dapm_widgets), + .dapm_routes = jz4740_codec_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(jz4740_codec_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, + }; static const struct regmap_config jz4740_codec_regmap_config = { @@ -343,7 +345,7 @@ static int jz4740_codec_probe(struct platform_device *pdev) platform_set_drvdata(pdev, jz4740_codec); - ret = snd_soc_register_codec(&pdev->dev, + ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_jz4740_codec, &jz4740_codec_dai, 1); if (ret) dev_err(&pdev->dev, "Failed to register codec\n"); @@ -351,16 +353,8 @@ static int jz4740_codec_probe(struct platform_device *pdev) return ret; } -static int jz4740_codec_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - - return 0; -} - static struct platform_driver jz4740_codec_driver = { .probe = jz4740_codec_probe, - .remove = jz4740_codec_remove, .driver = { .name = "jz4740-codec", }, diff --git a/sound/soc/codecs/lm49453.c b/sound/soc/codecs/lm49453.c index 41e09d1287b8..59a646cc03d4 100644 --- a/sound/soc/codecs/lm49453.c +++ b/sound/soc/codecs/lm49453.c @@ -1110,7 +1110,7 @@ static int lm49453_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 clk_div = 0; /* Setting DAC clock dividers based on substream sample rate. */ @@ -1134,15 +1134,15 @@ static int lm49453_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_write(codec, LM49453_P0_ADC_CLK_DIV_REG, clk_div); - snd_soc_write(codec, LM49453_P0_DAC_HP_CLK_DIV_REG, clk_div); + snd_soc_component_write(component, LM49453_P0_ADC_CLK_DIV_REG, clk_div); + snd_soc_component_write(component, LM49453_P0_DAC_HP_CLK_DIV_REG, clk_div); return 0; } static int lm49453_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u16 aif_val; int mode = 0; @@ -1185,11 +1185,11 @@ static int lm49453_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, LM49453_P0_AUDIO_PORT1_BASIC_REG, + snd_soc_component_update_bits(component, LM49453_P0_AUDIO_PORT1_BASIC_REG, LM49453_AUDIO_PORT1_BASIC_FMT_MASK|BIT(0)|BIT(5), (aif_val | mode | clk_phase)); - snd_soc_write(codec, LM49453_P0_AUDIO_PORT1_RX_MSB_REG, clk_shift); + snd_soc_component_write(component, LM49453_P0_AUDIO_PORT1_RX_MSB_REG, clk_shift); return 0; } @@ -1197,7 +1197,7 @@ static int lm49453_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int lm49453_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 pll_clk = 0; switch (freq) { @@ -1216,50 +1216,50 @@ static int lm49453_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, return -EINVAL; } - snd_soc_update_bits(codec, LM49453_P0_PMC_SETUP_REG, BIT(4), pll_clk); + snd_soc_component_update_bits(component, LM49453_P0_PMC_SETUP_REG, BIT(4), pll_clk); return 0; } static int lm49453_hp_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, LM49453_P0_DAC_DSP_REG, BIT(1)|BIT(0), + snd_soc_component_update_bits(dai->component, LM49453_P0_DAC_DSP_REG, BIT(1)|BIT(0), (mute ? (BIT(1)|BIT(0)) : 0)); return 0; } static int lm49453_lo_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, LM49453_P0_DAC_DSP_REG, BIT(3)|BIT(2), + snd_soc_component_update_bits(dai->component, LM49453_P0_DAC_DSP_REG, BIT(3)|BIT(2), (mute ? (BIT(3)|BIT(2)) : 0)); return 0; } static int lm49453_ls_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, LM49453_P0_DAC_DSP_REG, BIT(5)|BIT(4), + snd_soc_component_update_bits(dai->component, LM49453_P0_DAC_DSP_REG, BIT(5)|BIT(4), (mute ? (BIT(5)|BIT(4)) : 0)); return 0; } static int lm49453_ep_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, LM49453_P0_DAC_DSP_REG, BIT(4), + snd_soc_component_update_bits(dai->component, LM49453_P0_DAC_DSP_REG, BIT(4), (mute ? BIT(4) : 0)); return 0; } static int lm49453_ha_mute(struct snd_soc_dai *dai, int mute) { - snd_soc_update_bits(dai->codec, LM49453_P0_DAC_DSP_REG, BIT(7)|BIT(6), + snd_soc_component_update_bits(dai->component, LM49453_P0_DAC_DSP_REG, BIT(7)|BIT(6), (mute ? (BIT(7)|BIT(6)) : 0)); return 0; } -static int lm49453_set_bias_level(struct snd_soc_codec *codec, +static int lm49453_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct lm49453_priv *lm49453 = snd_soc_codec_get_drvdata(codec); + struct lm49453_priv *lm49453 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -1267,15 +1267,15 @@ static int lm49453_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) regcache_sync(lm49453->regmap); - snd_soc_update_bits(codec, LM49453_P0_PMC_SETUP_REG, + snd_soc_component_update_bits(component, LM49453_P0_PMC_SETUP_REG, LM49453_PMC_SETUP_CHIP_EN, LM49453_CHIP_EN); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, LM49453_P0_PMC_SETUP_REG, + snd_soc_component_update_bits(component, LM49453_P0_PMC_SETUP_REG, LM49453_PMC_SETUP_CHIP_EN, 0); break; } @@ -1389,17 +1389,17 @@ static struct snd_soc_dai_driver lm49453_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_lm49453 = { - .set_bias_level = lm49453_set_bias_level, - .component_driver = { - .controls = lm49453_snd_controls, - .num_controls = ARRAY_SIZE(lm49453_snd_controls), - .dapm_widgets = lm49453_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(lm49453_dapm_widgets), - .dapm_routes = lm49453_audio_map, - .num_dapm_routes = ARRAY_SIZE(lm49453_audio_map), - }, - .idle_bias_off = true, +static const struct snd_soc_component_driver soc_component_dev_lm49453 = { + .set_bias_level = lm49453_set_bias_level, + .controls = lm49453_snd_controls, + .num_controls = ARRAY_SIZE(lm49453_snd_controls), + .dapm_widgets = lm49453_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(lm49453_dapm_widgets), + .dapm_routes = lm49453_audio_map, + .num_dapm_routes = ARRAY_SIZE(lm49453_audio_map), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config lm49453_regmap_config = { @@ -1434,18 +1434,17 @@ static int lm49453_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_lm49453, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_lm49453, lm49453_dai, ARRAY_SIZE(lm49453_dai)); if (ret < 0) - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } static int lm49453_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/max9759.c b/sound/soc/codecs/max9759.c new file mode 100644 index 000000000000..ecfb4a80424b --- /dev/null +++ b/sound/soc/codecs/max9759.c @@ -0,0 +1,207 @@ +// SPDX-Licence-Identifier: GPL-2.0 +/* + * MAX9759 Amplifier Driver + * + * Copyright (c) 2017 BayLibre, SAS. + * Author: Neil Armstrong <narmstrong@baylibre.com> + */ + +#include <linux/gpio/consumer.h> +#include <linux/module.h> +#include <sound/soc.h> +#include <sound/soc-dapm.h> +#include <sound/tlv.h> + +#define DRV_NAME "max9759" + +struct max9759 { + struct gpio_desc *gpiod_shutdown; + struct gpio_desc *gpiod_mute; + struct gpio_descs *gpiod_gain; + bool is_mute; + unsigned int gain; +}; + +static int pga_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *control, int event) +{ + struct snd_soc_component *c = snd_soc_dapm_to_component(w->dapm); + struct max9759 *priv = snd_soc_component_get_drvdata(c); + + if (SND_SOC_DAPM_EVENT_ON(event)) + gpiod_set_value_cansleep(priv->gpiod_shutdown, 0); + else + gpiod_set_value_cansleep(priv->gpiod_shutdown, 1); + + return 0; +} + +/* From 6dB to 24dB in steps of 6dB */ +static const DECLARE_TLV_DB_SCALE(speaker_gain_tlv, 600, 600, 0); + +static int speaker_gain_control_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol); + struct max9759 *priv = snd_soc_component_get_drvdata(c); + + ucontrol->value.integer.value[0] = priv->gain; + + return 0; +} + +static const bool speaker_gain_table[4][2] = { + /* G1, G2 */ + {true, true}, /* +6dB */ + {false, true}, /* +12dB */ + {true, false}, /* +18dB */ + {false, false}, /* +24dB */ +}; + +static int speaker_gain_control_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol); + struct max9759 *priv = snd_soc_component_get_drvdata(c); + + if (ucontrol->value.integer.value[0] > 3) + return -EINVAL; + + priv->gain = ucontrol->value.integer.value[0]; + + /* G1 */ + gpiod_set_value_cansleep(priv->gpiod_gain->desc[0], + speaker_gain_table[priv->gain][0]); + /* G2 */ + gpiod_set_value_cansleep(priv->gpiod_gain->desc[1], + speaker_gain_table[priv->gain][1]); + + return 1; +} + +static int speaker_mute_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol); + struct max9759 *priv = snd_soc_component_get_drvdata(c); + + ucontrol->value.integer.value[0] = !priv->is_mute; + + return 0; +} + +static int speaker_mute_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol); + struct max9759 *priv = snd_soc_component_get_drvdata(c); + + priv->is_mute = !ucontrol->value.integer.value[0]; + + gpiod_set_value_cansleep(priv->gpiod_mute, priv->is_mute); + + return 1; +} + +static const struct snd_kcontrol_new max9759_dapm_controls[] = { + SOC_SINGLE_EXT_TLV("Speaker Gain Volume", 0, 0, 3, 0, + speaker_gain_control_get, speaker_gain_control_put, + speaker_gain_tlv), + SOC_SINGLE_BOOL_EXT("Playback Switch", 0, + speaker_mute_get, speaker_mute_put), +}; + +static const struct snd_soc_dapm_widget max9759_dapm_widgets[] = { + SND_SOC_DAPM_INPUT("INL"), + SND_SOC_DAPM_INPUT("INR"), + SND_SOC_DAPM_PGA_E("PGA", SND_SOC_NOPM, 0, 0, NULL, 0, pga_event, + (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)), + SND_SOC_DAPM_OUTPUT("OUTL"), + SND_SOC_DAPM_OUTPUT("OUTR"), +}; + +static const struct snd_soc_dapm_route max9759_dapm_routes[] = { + { "PGA", NULL, "INL" }, + { "PGA", NULL, "INR" }, + { "OUTL", NULL, "PGA" }, + { "OUTR", NULL, "PGA" }, +}; + +static const struct snd_soc_component_driver max9759_component_driver = { + .controls = max9759_dapm_controls, + .num_controls = ARRAY_SIZE(max9759_dapm_controls), + .dapm_widgets = max9759_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max9759_dapm_widgets), + .dapm_routes = max9759_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(max9759_dapm_routes), +}; + +static int max9759_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct max9759 *priv; + int err; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + platform_set_drvdata(pdev, priv); + + priv->gpiod_shutdown = devm_gpiod_get(dev, "shutdown", GPIOD_OUT_HIGH); + if (IS_ERR(priv->gpiod_shutdown)) { + err = PTR_ERR(priv->gpiod_shutdown); + if (err != -EPROBE_DEFER) + dev_err(dev, "Failed to get 'shutdown' gpio: %d", err); + return err; + } + + priv->gpiod_mute = devm_gpiod_get(dev, "mute", GPIOD_OUT_HIGH); + if (IS_ERR(priv->gpiod_mute)) { + err = PTR_ERR(priv->gpiod_mute); + if (err != -EPROBE_DEFER) + dev_err(dev, "Failed to get 'mute' gpio: %d", err); + return err; + } + priv->is_mute = true; + + priv->gpiod_gain = devm_gpiod_get_array(dev, "gain", GPIOD_OUT_HIGH); + if (IS_ERR(priv->gpiod_gain)) { + err = PTR_ERR(priv->gpiod_gain); + if (err != -EPROBE_DEFER) + dev_err(dev, "Failed to get 'gain' gpios: %d", err); + return err; + } + priv->gain = 0; + + if (priv->gpiod_gain->ndescs != 2) { + dev_err(dev, "Invalid 'gain' gpios count: %d", + priv->gpiod_gain->ndescs); + return -EINVAL; + } + + return devm_snd_soc_register_component(dev, &max9759_component_driver, + NULL, 0); +} + +#ifdef CONFIG_OF +static const struct of_device_id max9759_ids[] = { + { .compatible = "maxim,max9759", }, + { } +}; +MODULE_DEVICE_TABLE(of, max9759_ids); +#endif + +static struct platform_driver max9759_driver = { + .driver = { + .name = DRV_NAME, + .of_match_table = of_match_ptr(max9759_ids), + }, + .probe = max9759_probe, +}; + +module_platform_driver(max9759_driver); + +MODULE_DESCRIPTION("ASoC MAX9759 amplifier driver"); +MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c index f0bb830874e5..865f64c40b79 100644 --- a/sound/soc/codecs/max98088.c +++ b/sound/soc/codecs/max98088.c @@ -307,7 +307,7 @@ static const struct regmap_config max98088_regmap = { /* * Load equalizer DSP coefficient configurations registers */ -static void m98088_eq_band(struct snd_soc_codec *codec, unsigned int dai, +static void m98088_eq_band(struct snd_soc_component *component, unsigned int dai, unsigned int band, u16 *coefs) { unsigned int eq_reg; @@ -325,8 +325,8 @@ static void m98088_eq_band(struct snd_soc_codec *codec, unsigned int dai, /* Step through the registers and coefs */ for (i = 0; i < M98088_COEFS_PER_BAND; i++) { - snd_soc_write(codec, eq_reg++, M98088_BYTE1(coefs[i])); - snd_soc_write(codec, eq_reg++, M98088_BYTE0(coefs[i])); + snd_soc_component_write(component, eq_reg++, M98088_BYTE1(coefs[i])); + snd_soc_component_write(component, eq_reg++, M98088_BYTE0(coefs[i])); } } @@ -380,12 +380,12 @@ static SOC_ENUM_SINGLE_DECL(max98088_dai1_adc_filter_enum, static int max98088_mic1pre_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); unsigned int sel = ucontrol->value.integer.value[0]; max98088->mic1pre = sel; - snd_soc_update_bits(codec, M98088_REG_35_LVL_MIC1, M98088_MICPRE_MASK, + snd_soc_component_update_bits(component, M98088_REG_35_LVL_MIC1, M98088_MICPRE_MASK, (1+sel)<<M98088_MICPRE_SHIFT); return 0; @@ -394,8 +394,8 @@ static int max98088_mic1pre_set(struct snd_kcontrol *kcontrol, static int max98088_mic1pre_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = max98088->mic1pre; return 0; @@ -404,12 +404,12 @@ static int max98088_mic1pre_get(struct snd_kcontrol *kcontrol, static int max98088_mic2pre_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); unsigned int sel = ucontrol->value.integer.value[0]; max98088->mic2pre = sel; - snd_soc_update_bits(codec, M98088_REG_36_LVL_MIC2, M98088_MICPRE_MASK, + snd_soc_component_update_bits(component, M98088_REG_36_LVL_MIC2, M98088_MICPRE_MASK, (1+sel)<<M98088_MICPRE_SHIFT); return 0; @@ -418,8 +418,8 @@ static int max98088_mic2pre_set(struct snd_kcontrol *kcontrol, static int max98088_mic2pre_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = max98088->mic2pre; return 0; @@ -617,21 +617,21 @@ static const struct snd_kcontrol_new max98088_right_ADC_mixer_controls[] = { static int max98088_mic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: if (w->reg == M98088_REG_35_LVL_MIC1) { - snd_soc_update_bits(codec, w->reg, M98088_MICPRE_MASK, + snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK, (1+max98088->mic1pre)<<M98088_MICPRE_SHIFT); } else { - snd_soc_update_bits(codec, w->reg, M98088_MICPRE_MASK, + snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK, (1+max98088->mic2pre)<<M98088_MICPRE_SHIFT); } break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, M98088_MICPRE_MASK, 0); + snd_soc_component_update_bits(component, w->reg, M98088_MICPRE_MASK, 0); break; default: return -EINVAL; @@ -647,8 +647,8 @@ static int max98088_mic_event(struct snd_soc_dapm_widget *w, static int max98088_line_pga(struct snd_soc_dapm_widget *w, int event, int line, u8 channel) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); u8 *state; if (WARN_ON(!(channel == 1 || channel == 2))) @@ -668,13 +668,13 @@ static int max98088_line_pga(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: *state |= channel; - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift), (1 << w->shift)); break; case SND_SOC_DAPM_POST_PMD: *state &= ~channel; if (*state == 0) { - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift), 0); } break; @@ -963,8 +963,8 @@ static int max98088_dai1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_cdata *cdata; unsigned long long ni; unsigned int rate; @@ -976,51 +976,51 @@ static int max98088_dai1_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98088_REG_14_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT, M98088_DAI_WS, 0); break; case 24: - snd_soc_update_bits(codec, M98088_REG_14_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT, M98088_DAI_WS, M98088_DAI_WS); break; default: return -EINVAL; } - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0); + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0); if (rate_value(rate, ®val)) return -EINVAL; - snd_soc_update_bits(codec, M98088_REG_11_DAI1_CLKMODE, + snd_soc_component_update_bits(component, M98088_REG_11_DAI1_CLKMODE, M98088_CLKMODE_MASK, regval); cdata->rate = rate; /* Configure NI when operating as master */ - if (snd_soc_read(codec, M98088_REG_14_DAI1_FORMAT) + if (snd_soc_component_read32(component, M98088_REG_14_DAI1_FORMAT) & M98088_DAI_MAS) { if (max98088->sysclk == 0) { - dev_err(codec->dev, "Invalid system clock frequency\n"); + dev_err(component->dev, "Invalid system clock frequency\n"); return -EINVAL; } ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL) * (unsigned long long int)rate; do_div(ni, (unsigned long long int)max98088->sysclk); - snd_soc_write(codec, M98088_REG_12_DAI1_CLKCFG_HI, + snd_soc_component_write(component, M98088_REG_12_DAI1_CLKCFG_HI, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98088_REG_13_DAI1_CLKCFG_LO, + snd_soc_component_write(component, M98088_REG_13_DAI1_CLKCFG_LO, ni & 0xFF); } /* Update sample rate mode */ if (rate < 50000) - snd_soc_update_bits(codec, M98088_REG_18_DAI1_FILTERS, + snd_soc_component_update_bits(component, M98088_REG_18_DAI1_FILTERS, M98088_DAI_DHF, 0); else - snd_soc_update_bits(codec, M98088_REG_18_DAI1_FILTERS, + snd_soc_component_update_bits(component, M98088_REG_18_DAI1_FILTERS, M98088_DAI_DHF, M98088_DAI_DHF); - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, M98088_SHDNRUN); return 0; @@ -1030,8 +1030,8 @@ static int max98088_dai2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_cdata *cdata; unsigned long long ni; unsigned int rate; @@ -1043,51 +1043,51 @@ static int max98088_dai2_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT, M98088_DAI_WS, 0); break; case 24: - snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT, M98088_DAI_WS, M98088_DAI_WS); break; default: return -EINVAL; } - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0); + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0); if (rate_value(rate, ®val)) return -EINVAL; - snd_soc_update_bits(codec, M98088_REG_19_DAI2_CLKMODE, + snd_soc_component_update_bits(component, M98088_REG_19_DAI2_CLKMODE, M98088_CLKMODE_MASK, regval); cdata->rate = rate; /* Configure NI when operating as master */ - if (snd_soc_read(codec, M98088_REG_1C_DAI2_FORMAT) + if (snd_soc_component_read32(component, M98088_REG_1C_DAI2_FORMAT) & M98088_DAI_MAS) { if (max98088->sysclk == 0) { - dev_err(codec->dev, "Invalid system clock frequency\n"); + dev_err(component->dev, "Invalid system clock frequency\n"); return -EINVAL; } ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL) * (unsigned long long int)rate; do_div(ni, (unsigned long long int)max98088->sysclk); - snd_soc_write(codec, M98088_REG_1A_DAI2_CLKCFG_HI, + snd_soc_component_write(component, M98088_REG_1A_DAI2_CLKCFG_HI, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98088_REG_1B_DAI2_CLKCFG_LO, + snd_soc_component_write(component, M98088_REG_1B_DAI2_CLKCFG_LO, ni & 0xFF); } /* Update sample rate mode */ if (rate < 50000) - snd_soc_update_bits(codec, M98088_REG_20_DAI2_FILTERS, + snd_soc_component_update_bits(component, M98088_REG_20_DAI2_FILTERS, M98088_DAI_DHF, 0); else - snd_soc_update_bits(codec, M98088_REG_20_DAI2_FILTERS, + snd_soc_component_update_bits(component, M98088_REG_20_DAI2_FILTERS, M98088_DAI_DHF, M98088_DAI_DHF); - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, M98088_SHDNRUN); return 0; @@ -1096,8 +1096,8 @@ static int max98088_dai2_hw_params(struct snd_pcm_substream *substream, static int max98088_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); /* Requested clock frequency is already setup */ if (freq == max98088->sysclk) @@ -1108,18 +1108,18 @@ static int max98088_dai_set_sysclk(struct snd_soc_dai *dai, * 0x02 (when master clk is 20MHz to 30MHz).. */ if ((freq >= 10000000) && (freq < 20000000)) { - snd_soc_write(codec, M98088_REG_10_SYS_CLK, 0x10); + snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x10); } else if ((freq >= 20000000) && (freq < 30000000)) { - snd_soc_write(codec, M98088_REG_10_SYS_CLK, 0x20); + snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x20); } else { - dev_err(codec->dev, "Invalid master clock frequency\n"); + dev_err(component->dev, "Invalid master clock frequency\n"); return -EINVAL; } - if (snd_soc_read(codec, M98088_REG_51_PWR_SYS) & M98088_SHDNRUN) { - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, + if (snd_soc_component_read32(component, M98088_REG_51_PWR_SYS) & M98088_SHDNRUN) { + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, 0); - snd_soc_update_bits(codec, M98088_REG_51_PWR_SYS, + snd_soc_component_update_bits(component, M98088_REG_51_PWR_SYS, M98088_SHDNRUN, M98088_SHDNRUN); } @@ -1132,8 +1132,8 @@ static int max98088_dai_set_sysclk(struct snd_soc_dai *dai, static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_cdata *cdata; u8 reg15val; u8 reg14val = 0; @@ -1146,9 +1146,9 @@ static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Slave mode PLL */ - snd_soc_write(codec, M98088_REG_12_DAI1_CLKCFG_HI, + snd_soc_component_write(component, M98088_REG_12_DAI1_CLKCFG_HI, 0x80); - snd_soc_write(codec, M98088_REG_13_DAI1_CLKCFG_LO, + snd_soc_component_write(component, M98088_REG_13_DAI1_CLKCFG_LO, 0x00); break; case SND_SOC_DAIFMT_CBM_CFM: @@ -1158,7 +1158,7 @@ static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "Clock mode unsupported"); + dev_err(component->dev, "Clock mode unsupported"); return -EINVAL; } @@ -1188,14 +1188,14 @@ static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_update_bits(codec, M98088_REG_14_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_14_DAI1_FORMAT, M98088_DAI_MAS | M98088_DAI_DLY | M98088_DAI_BCI | M98088_DAI_WCI, reg14val); reg15val = M98088_DAI_BSEL64; if (max98088->digmic) reg15val |= M98088_DAI_OSR64; - snd_soc_write(codec, M98088_REG_15_DAI1_CLOCK, reg15val); + snd_soc_component_write(component, M98088_REG_15_DAI1_CLOCK, reg15val); } return 0; @@ -1204,8 +1204,8 @@ static int max98088_dai1_set_fmt(struct snd_soc_dai *codec_dai, static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_cdata *cdata; u8 reg1Cval = 0; @@ -1217,9 +1217,9 @@ static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Slave mode PLL */ - snd_soc_write(codec, M98088_REG_1A_DAI2_CLKCFG_HI, + snd_soc_component_write(component, M98088_REG_1A_DAI2_CLKCFG_HI, 0x80); - snd_soc_write(codec, M98088_REG_1B_DAI2_CLKCFG_LO, + snd_soc_component_write(component, M98088_REG_1B_DAI2_CLKCFG_LO, 0x00); break; case SND_SOC_DAIFMT_CBM_CFM: @@ -1229,7 +1229,7 @@ static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "Clock mode unsupported"); + dev_err(component->dev, "Clock mode unsupported"); return -EINVAL; } @@ -1259,11 +1259,11 @@ static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98088_REG_1C_DAI2_FORMAT, M98088_DAI_MAS | M98088_DAI_DLY | M98088_DAI_BCI | M98088_DAI_WCI, reg1Cval); - snd_soc_write(codec, M98088_REG_1D_DAI2_CLOCK, + snd_soc_component_write(component, M98088_REG_1D_DAI2_CLOCK, M98088_DAI_BSEL64); } @@ -1272,7 +1272,7 @@ static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, static int max98088_dai1_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int reg; if (mute) @@ -1280,14 +1280,14 @@ static int max98088_dai1_digital_mute(struct snd_soc_dai *codec_dai, int mute) else reg = 0; - snd_soc_update_bits(codec, M98088_REG_2F_LVL_DAI1_PLAY, + snd_soc_component_update_bits(component, M98088_REG_2F_LVL_DAI1_PLAY, M98088_DAI_MUTE_MASK, reg); return 0; } static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int reg; if (mute) @@ -1295,15 +1295,15 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute) else reg = 0; - snd_soc_update_bits(codec, M98088_REG_31_LVL_DAI2_PLAY, + snd_soc_component_update_bits(component, M98088_REG_31_LVL_DAI2_PLAY, M98088_DAI_MUTE_MASK, reg); return 0; } -static int max98088_set_bias_level(struct snd_soc_codec *codec, +static int max98088_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -1313,15 +1313,15 @@ static int max98088_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) regcache_sync(max98088->regmap); - snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, + snd_soc_component_update_bits(component, M98088_REG_4C_PWR_EN_IN, M98088_MBEN, M98088_MBEN); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, M98088_REG_4C_PWR_EN_IN, + snd_soc_component_update_bits(component, M98088_REG_4C_PWR_EN_IN, M98088_MBEN, 0); regcache_mark_dirty(max98088->regmap); break; @@ -1380,7 +1380,7 @@ static struct snd_soc_dai_driver max98088_dai[] = { static const char *eq_mode_name[] = {"EQ1 Mode", "EQ2 Mode"}; -static int max98088_get_channel(struct snd_soc_codec *codec, const char *name) +static int max98088_get_channel(struct snd_soc_component *component, const char *name) { int i; @@ -1389,13 +1389,13 @@ static int max98088_get_channel(struct snd_soc_codec *codec, const char *name) return i; /* Shouldn't happen */ - dev_err(codec->dev, "Bad EQ channel name '%s'\n", name); + dev_err(component->dev, "Bad EQ channel name '%s'\n", name); return -EINVAL; } -static void max98088_setup_eq1(struct snd_soc_codec *codec) +static void max98088_setup_eq1(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_pdata *pdata = max98088->pdata; struct max98088_eq_cfg *coef_set; int best, best_val, save, i, sel, fs; @@ -1420,29 +1420,29 @@ static void max98088_setup_eq1(struct snd_soc_codec *codec) } } - dev_dbg(codec->dev, "Selected %s/%dHz for %dHz sample rate\n", + dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n", pdata->eq_cfg[best].name, pdata->eq_cfg[best].rate, fs); /* Disable EQ while configuring, and save current on/off state */ - save = snd_soc_read(codec, M98088_REG_49_CFG_LEVEL); - snd_soc_update_bits(codec, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, 0); + save = snd_soc_component_read32(component, M98088_REG_49_CFG_LEVEL); + snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, 0); coef_set = &pdata->eq_cfg[sel]; - m98088_eq_band(codec, 0, 0, coef_set->band1); - m98088_eq_band(codec, 0, 1, coef_set->band2); - m98088_eq_band(codec, 0, 2, coef_set->band3); - m98088_eq_band(codec, 0, 3, coef_set->band4); - m98088_eq_band(codec, 0, 4, coef_set->band5); + m98088_eq_band(component, 0, 0, coef_set->band1); + m98088_eq_band(component, 0, 1, coef_set->band2); + m98088_eq_band(component, 0, 2, coef_set->band3); + m98088_eq_band(component, 0, 3, coef_set->band4); + m98088_eq_band(component, 0, 4, coef_set->band5); /* Restore the original on/off state */ - snd_soc_update_bits(codec, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, save); + snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ1EN, save); } -static void max98088_setup_eq2(struct snd_soc_codec *codec) +static void max98088_setup_eq2(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_pdata *pdata = max98088->pdata; struct max98088_eq_cfg *coef_set; int best, best_val, save, i, sel, fs; @@ -1467,34 +1467,34 @@ static void max98088_setup_eq2(struct snd_soc_codec *codec) } } - dev_dbg(codec->dev, "Selected %s/%dHz for %dHz sample rate\n", + dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n", pdata->eq_cfg[best].name, pdata->eq_cfg[best].rate, fs); /* Disable EQ while configuring, and save current on/off state */ - save = snd_soc_read(codec, M98088_REG_49_CFG_LEVEL); - snd_soc_update_bits(codec, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN, 0); + save = snd_soc_component_read32(component, M98088_REG_49_CFG_LEVEL); + snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN, 0); coef_set = &pdata->eq_cfg[sel]; - m98088_eq_band(codec, 1, 0, coef_set->band1); - m98088_eq_band(codec, 1, 1, coef_set->band2); - m98088_eq_band(codec, 1, 2, coef_set->band3); - m98088_eq_band(codec, 1, 3, coef_set->band4); - m98088_eq_band(codec, 1, 4, coef_set->band5); + m98088_eq_band(component, 1, 0, coef_set->band1); + m98088_eq_band(component, 1, 1, coef_set->band2); + m98088_eq_band(component, 1, 2, coef_set->band3); + m98088_eq_band(component, 1, 3, coef_set->band4); + m98088_eq_band(component, 1, 4, coef_set->band5); /* Restore the original on/off state */ - snd_soc_update_bits(codec, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN, + snd_soc_component_update_bits(component, M98088_REG_49_CFG_LEVEL, M98088_EQ2EN, save); } static int max98088_put_eq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_pdata *pdata = max98088->pdata; - int channel = max98088_get_channel(codec, kcontrol->id.name); + int channel = max98088_get_channel(component, kcontrol->id.name); struct max98088_cdata *cdata; int sel = ucontrol->value.enumerated.item[0]; @@ -1510,10 +1510,10 @@ static int max98088_put_eq_enum(struct snd_kcontrol *kcontrol, switch (channel) { case 0: - max98088_setup_eq1(codec); + max98088_setup_eq1(component); break; case 1: - max98088_setup_eq2(codec); + max98088_setup_eq2(component); break; } @@ -1523,9 +1523,9 @@ static int max98088_put_eq_enum(struct snd_kcontrol *kcontrol, static int max98088_get_eq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); - int channel = max98088_get_channel(codec, kcontrol->id.name); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); + int channel = max98088_get_channel(component, kcontrol->id.name); struct max98088_cdata *cdata; if (channel < 0) @@ -1536,9 +1536,9 @@ static int max98088_get_eq_enum(struct snd_kcontrol *kcontrol, return 0; } -static void max98088_handle_eq_pdata(struct snd_soc_codec *codec) +static void max98088_handle_eq_pdata(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_pdata *pdata = max98088->pdata; struct max98088_eq_cfg *cfg; unsigned int cfgcnt; @@ -1591,19 +1591,19 @@ static void max98088_handle_eq_pdata(struct snd_soc_codec *codec) max98088->eq_enum.texts = max98088->eq_texts; max98088->eq_enum.items = max98088->eq_textcnt; - ret = snd_soc_add_codec_controls(codec, controls, ARRAY_SIZE(controls)); + ret = snd_soc_add_component_controls(component, controls, ARRAY_SIZE(controls)); if (ret != 0) - dev_err(codec->dev, "Failed to add EQ control: %d\n", ret); + dev_err(component->dev, "Failed to add EQ control: %d\n", ret); } -static void max98088_handle_pdata(struct snd_soc_codec *codec) +static void max98088_handle_pdata(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_pdata *pdata = max98088->pdata; u8 regval = 0; if (!pdata) { - dev_dbg(codec->dev, "No platform data\n"); + dev_dbg(component->dev, "No platform data\n"); return; } @@ -1616,21 +1616,21 @@ static void max98088_handle_pdata(struct snd_soc_codec *codec) max98088->digmic = (regval ? 1 : 0); - snd_soc_write(codec, M98088_REG_48_CFG_MIC, regval); + snd_soc_component_write(component, M98088_REG_48_CFG_MIC, regval); /* Configure receiver output */ regval = ((pdata->receiver_mode) ? M98088_REC_LINEMODE : 0); - snd_soc_update_bits(codec, M98088_REG_2A_MIC_REC_CNTL, + snd_soc_component_update_bits(component, M98088_REG_2A_MIC_REC_CNTL, M98088_REC_LINEMODE_MASK, regval); /* Configure equalizers */ if (pdata->eq_cfgcnt) - max98088_handle_eq_pdata(codec); + max98088_handle_eq_pdata(component); } -static int max98088_probe(struct snd_soc_codec *codec) +static int max98088_probe(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); struct max98088_cdata *cdata; int ret = 0; @@ -1658,60 +1658,59 @@ static int max98088_probe(struct snd_soc_codec *codec) max98088->mic1pre = 0; max98088->mic2pre = 0; - ret = snd_soc_read(codec, M98088_REG_FF_REV_ID); + ret = snd_soc_component_read32(component, M98088_REG_FF_REV_ID); if (ret < 0) { - dev_err(codec->dev, "Failed to read device revision: %d\n", + dev_err(component->dev, "Failed to read device revision: %d\n", ret); goto err_access; } - dev_info(codec->dev, "revision %c\n", ret - 0x40 + 'A'); + dev_info(component->dev, "revision %c\n", ret - 0x40 + 'A'); - snd_soc_write(codec, M98088_REG_51_PWR_SYS, M98088_PWRSV); + snd_soc_component_write(component, M98088_REG_51_PWR_SYS, M98088_PWRSV); - snd_soc_write(codec, M98088_REG_0F_IRQ_ENABLE, 0x00); + snd_soc_component_write(component, M98088_REG_0F_IRQ_ENABLE, 0x00); - snd_soc_write(codec, M98088_REG_22_MIX_DAC, + snd_soc_component_write(component, M98088_REG_22_MIX_DAC, M98088_DAI1L_TO_DACL|M98088_DAI2L_TO_DACL| M98088_DAI1R_TO_DACR|M98088_DAI2R_TO_DACR); - snd_soc_write(codec, M98088_REG_4E_BIAS_CNTL, 0xF0); - snd_soc_write(codec, M98088_REG_50_DAC_BIAS2, 0x0F); + snd_soc_component_write(component, M98088_REG_4E_BIAS_CNTL, 0xF0); + snd_soc_component_write(component, M98088_REG_50_DAC_BIAS2, 0x0F); - snd_soc_write(codec, M98088_REG_16_DAI1_IOCFG, + snd_soc_component_write(component, M98088_REG_16_DAI1_IOCFG, M98088_S1NORMAL|M98088_SDATA); - snd_soc_write(codec, M98088_REG_1E_DAI2_IOCFG, + snd_soc_component_write(component, M98088_REG_1E_DAI2_IOCFG, M98088_S2NORMAL|M98088_SDATA); - max98088_handle_pdata(codec); + max98088_handle_pdata(component); err_access: return ret; } -static int max98088_remove(struct snd_soc_codec *codec) +static void max98088_remove(struct snd_soc_component *component) { - struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); kfree(max98088->eq_texts); - - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_max98088 = { - .probe = max98088_probe, - .remove = max98088_remove, - .set_bias_level = max98088_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = max98088_snd_controls, - .num_controls = ARRAY_SIZE(max98088_snd_controls), - .dapm_widgets = max98088_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets), - .dapm_routes = max98088_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98088_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_max98088 = { + .probe = max98088_probe, + .remove = max98088_remove, + .set_bias_level = max98088_set_bias_level, + .controls = max98088_snd_controls, + .num_controls = ARRAY_SIZE(max98088_snd_controls), + .dapm_widgets = max98088_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets), + .dapm_routes = max98088_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98088_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int max98088_i2c_probe(struct i2c_client *i2c, @@ -1734,17 +1733,11 @@ static int max98088_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, max98088); max98088->pdata = i2c->dev.platform_data; - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_max98088, &max98088_dai[0], 2); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98088, &max98088_dai[0], 2); return ret; } -static int max98088_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98088_i2c_id[] = { { "max98088", MAX98088 }, { "max98089", MAX98089 }, @@ -1757,7 +1750,6 @@ static struct i2c_driver max98088_i2c_driver = { .name = "max98088", }, .probe = max98088_i2c_probe, - .remove = max98088_i2c_remove, .id_table = max98088_i2c_id, }; diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index f5075d1f79e6..c97f21836c66 100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c @@ -284,7 +284,7 @@ static int max98090_reset(struct max98090_priv *max98090) ret = regmap_write(max98090->regmap, M98090_REG_SOFTWARE_RESET, M98090_SWRESET_MASK); if (ret < 0) { - dev_err(max98090->codec->dev, + dev_err(max98090->component->dev, "Failed to reset codec: %d\n", ret); return ret; } @@ -354,12 +354,12 @@ static const DECLARE_TLV_DB_RANGE(max98090_rcv_lout_tlv, static int max98090_get_enab_tlv(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int mask = (1 << fls(mc->max)) - 1; - unsigned int val = snd_soc_read(codec, mc->reg); + unsigned int val = snd_soc_component_read32(component, mc->reg); unsigned int *select; switch (mc->reg) { @@ -394,13 +394,13 @@ static int max98090_get_enab_tlv(struct snd_kcontrol *kcontrol, static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int mask = (1 << fls(mc->max)) - 1; unsigned int sel = ucontrol->value.integer.value[0]; - unsigned int val = snd_soc_read(codec, mc->reg); + unsigned int val = snd_soc_component_read32(component, mc->reg); unsigned int *select; switch (mc->reg) { @@ -429,7 +429,7 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, sel = val; } - snd_soc_update_bits(codec, mc->reg, + snd_soc_component_update_bits(component, mc->reg, mask << mc->shift, sel << mc->shift); @@ -733,10 +733,10 @@ static const struct snd_kcontrol_new max98091_snd_controls[] = { static int max98090_micinput_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); - unsigned int val = snd_soc_read(codec, w->reg); + unsigned int val = snd_soc_component_read32(component, w->reg); if (w->reg == M98090_REG_MIC1_INPUT_LEVEL) val = (val & M98090_MIC_PA1EN_MASK) >> M98090_MIC_PA1EN_SHIFT; @@ -768,10 +768,10 @@ static int max98090_micinput_event(struct snd_soc_dapm_widget *w, } if (w->reg == M98090_REG_MIC1_INPUT_LEVEL) - snd_soc_update_bits(codec, w->reg, M98090_MIC_PA1EN_MASK, + snd_soc_component_update_bits(component, w->reg, M98090_MIC_PA1EN_MASK, val << M98090_MIC_PA1EN_SHIFT); else - snd_soc_update_bits(codec, w->reg, M98090_MIC_PA2EN_MASK, + snd_soc_component_update_bits(component, w->reg, M98090_MIC_PA2EN_MASK, val << M98090_MIC_PA2EN_SHIFT); return 0; @@ -780,8 +780,8 @@ static int max98090_micinput_event(struct snd_soc_dapm_widget *w, static int max98090_shdn_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); if (event & SND_SOC_DAPM_POST_PMU) max98090->shdn_pending = true; @@ -1441,16 +1441,16 @@ static const struct snd_soc_dapm_route max98091_dapm_routes[] = { {"DMIC4", NULL, "AHPF"}, }; -static int max98090_add_widgets(struct snd_soc_codec *codec) +static int max98090_add_widgets(struct snd_soc_component *component) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); - snd_soc_add_codec_controls(codec, max98090_snd_controls, + snd_soc_add_component_controls(component, max98090_snd_controls, ARRAY_SIZE(max98090_snd_controls)); if (max98090->devtype == MAX98091) { - snd_soc_add_codec_controls(codec, max98091_snd_controls, + snd_soc_add_component_controls(component, max98091_snd_controls, ARRAY_SIZE(max98091_snd_controls)); } @@ -1497,24 +1497,24 @@ static const unsigned long long mi_value[] = { 8125, 1625, 1500, 25 }; -static void max98090_configure_bclk(struct snd_soc_codec *codec) +static void max98090_configure_bclk(struct snd_soc_component *component) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); unsigned long long ni; int i; if (!max98090->sysclk) { - dev_err(codec->dev, "No SYSCLK configured\n"); + dev_err(component->dev, "No SYSCLK configured\n"); return; } if (!max98090->bclk || !max98090->lrclk) { - dev_err(codec->dev, "No audio clocks configured\n"); + dev_err(component->dev, "No audio clocks configured\n"); return; } /* Skip configuration when operating as slave */ - if (!(snd_soc_read(codec, M98090_REG_MASTER_MODE) & + if (!(snd_soc_component_read32(component, M98090_REG_MASTER_MODE) & M98090_MAS_MASK)) { return; } @@ -1523,14 +1523,14 @@ static void max98090_configure_bclk(struct snd_soc_codec *codec) for (i = 0; i < ARRAY_SIZE(pclk_rates); i++) { if ((pclk_rates[i] == max98090->sysclk) && (lrclk_rates[i] == max98090->lrclk)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Found supported PCLK to LRCLK rates 0x%x\n", i + 0x8); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_FREQ_MASK, (i + 0x8) << M98090_FREQ_SHIFT); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_USE_M1_MASK, 0); return; } @@ -1540,24 +1540,24 @@ static void max98090_configure_bclk(struct snd_soc_codec *codec) for (i = 0; i < ARRAY_SIZE(user_pclk_rates); i++) { if ((user_pclk_rates[i] == max98090->sysclk) && (user_lrclk_rates[i] == max98090->lrclk)) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Found user supported PCLK to LRCLK rates\n"); - dev_dbg(codec->dev, "i %d ni %lld mi %lld\n", + dev_dbg(component->dev, "i %d ni %lld mi %lld\n", i, ni_value[i], mi_value[i]); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_FREQ_MASK, 0); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_USE_M1_MASK, 1 << M98090_USE_M1_SHIFT); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_NI_MSB, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_MSB, (ni_value[i] >> 8) & 0x7F); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_NI_LSB, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_LSB, ni_value[i] & 0xFF); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_MI_MSB, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_MI_MSB, (mi_value[i] >> 8) & 0x7F); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_MI_LSB, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_MI_LSB, mi_value[i] & 0xFF); return; @@ -1567,9 +1567,9 @@ static void max98090_configure_bclk(struct snd_soc_codec *codec) /* * Calculate based on MI = 65536 (not as good as either method above) */ - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_FREQ_MASK, 0); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_USE_M1_MASK, 0); /* @@ -1580,18 +1580,18 @@ static void max98090_configure_bclk(struct snd_soc_codec *codec) ni = 65536ULL * (max98090->lrclk < 50000 ? 96ULL : 48ULL) * (unsigned long long int)max98090->lrclk; do_div(ni, (unsigned long long int)max98090->sysclk); - dev_info(codec->dev, "No better method found\n"); - dev_info(codec->dev, "Calculating ni %lld with mi 65536\n", ni); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_NI_MSB, + dev_info(component->dev, "No better method found\n"); + dev_info(component->dev, "Calculating ni %lld with mi 65536\n", ni); + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_MSB, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98090_REG_CLOCK_RATIO_NI_LSB, ni & 0xFF); + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_LSB, ni & 0xFF); } static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct max98090_cdata *cdata; u8 regval; @@ -1605,11 +1605,11 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Set to slave mode PLL - MAS mode off */ - snd_soc_write(codec, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_MSB, 0x00); - snd_soc_write(codec, + snd_soc_component_write(component, M98090_REG_CLOCK_RATIO_NI_LSB, 0x00); - snd_soc_update_bits(codec, M98090_REG_CLOCK_MODE, + snd_soc_component_update_bits(component, M98090_REG_CLOCK_MODE, M98090_USE_M1_MASK, 0); max98090->master = false; break; @@ -1633,10 +1633,10 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "DAI clock mode unsupported"); + dev_err(component->dev, "DAI clock mode unsupported"); return -EINVAL; } - snd_soc_write(codec, M98090_REG_MASTER_MODE, regval); + snd_soc_component_write(component, M98090_REG_MASTER_MODE, regval); regval = 0; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -1651,7 +1651,7 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_DSP_A: /* Not supported mode */ default: - dev_err(codec->dev, "DAI format unsupported"); + dev_err(component->dev, "DAI format unsupported"); return -EINVAL; } @@ -1668,7 +1668,7 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, regval |= M98090_BCI_MASK|M98090_WCI_MASK; break; default: - dev_err(codec->dev, "DAI invert mode unsupported"); + dev_err(component->dev, "DAI invert mode unsupported"); return -EINVAL; } @@ -1681,7 +1681,7 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, if (max98090->tdm_slots > 1) regval ^= M98090_BCI_MASK; - snd_soc_write(codec, + snd_soc_component_write(component, M98090_REG_INTERFACE_FORMAT, regval); } @@ -1691,8 +1691,8 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai, static int max98090_set_tdm_slot(struct snd_soc_dai *codec_dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct max98090_cdata *cdata; cdata = &max98090->dai[0]; @@ -1704,13 +1704,13 @@ static int max98090_set_tdm_slot(struct snd_soc_dai *codec_dai, if (max98090->tdm_slots > 1) { /* SLOTL SLOTR SLOTDLY */ - snd_soc_write(codec, M98090_REG_TDM_FORMAT, + snd_soc_component_write(component, M98090_REG_TDM_FORMAT, 0 << M98090_TDM_SLOTL_SHIFT | 1 << M98090_TDM_SLOTR_SHIFT | 0 << M98090_TDM_SLOTDLY_SHIFT); /* FSW TDM */ - snd_soc_update_bits(codec, M98090_REG_TDM_CONTROL, + snd_soc_component_update_bits(component, M98090_REG_TDM_CONTROL, M98090_TDM_MASK, M98090_TDM_MASK); } @@ -1724,10 +1724,10 @@ static int max98090_set_tdm_slot(struct snd_soc_dai *codec_dai, return 0; } -static int max98090_set_bias_level(struct snd_soc_codec *codec, +static int max98090_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1745,7 +1745,7 @@ static int max98090_set_bias_level(struct snd_soc_codec *codec, if (IS_ERR(max98090->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(max98090->mclk); } else { ret = clk_prepare_enable(max98090->mclk); @@ -1755,10 +1755,10 @@ static int max98090_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { ret = regcache_sync(max98090->regmap); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to sync cache: %d\n", ret); return ret; } @@ -1767,7 +1767,7 @@ static int max98090_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_OFF: /* Set internal pull-up to lowest power mode */ - snd_soc_update_bits(codec, M98090_REG_JACK_DETECT, + snd_soc_component_update_bits(component, M98090_REG_JACK_DETECT, M98090_JDWK_MASK, M98090_JDWK_MASK); regcache_mark_dirty(max98090->regmap); break; @@ -1928,8 +1928,8 @@ static int max98090_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct max98090_cdata *cdata; cdata = &max98090->dai[0]; @@ -1941,7 +1941,7 @@ static int max98090_dai_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98090_REG_INTERFACE_FORMAT, + snd_soc_component_update_bits(component, M98090_REG_INTERFACE_FORMAT, M98090_WS_MASK, 0); break; default: @@ -1949,24 +1949,24 @@ static int max98090_dai_hw_params(struct snd_pcm_substream *substream, } if (max98090->master) - max98090_configure_bclk(codec); + max98090_configure_bclk(component); cdata->rate = max98090->lrclk; /* Update filter mode */ if (max98090->lrclk < 24000) - snd_soc_update_bits(codec, M98090_REG_FILTER_CONFIG, + snd_soc_component_update_bits(component, M98090_REG_FILTER_CONFIG, M98090_MODE_MASK, 0); else - snd_soc_update_bits(codec, M98090_REG_FILTER_CONFIG, + snd_soc_component_update_bits(component, M98090_REG_FILTER_CONFIG, M98090_MODE_MASK, M98090_MODE_MASK); /* Update sample rate mode */ if (max98090->lrclk < 50000) - snd_soc_update_bits(codec, M98090_REG_FILTER_CONFIG, + snd_soc_component_update_bits(component, M98090_REG_FILTER_CONFIG, M98090_DHF_MASK, 0); else - snd_soc_update_bits(codec, M98090_REG_FILTER_CONFIG, + snd_soc_component_update_bits(component, M98090_REG_FILTER_CONFIG, M98090_DHF_MASK, M98090_DHF_MASK); max98090_configure_dmic(max98090, max98090->dmic_freq, max98090->pclk, @@ -1981,8 +1981,8 @@ static int max98090_dai_hw_params(struct snd_pcm_substream *substream, static int max98090_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); /* Requested clock frequency is already setup */ if (freq == max98090->sysclk) @@ -1999,19 +1999,19 @@ static int max98090_dai_set_sysclk(struct snd_soc_dai *dai, * 0x03 (when master clk is 40MHz to 60MHz).. */ if ((freq >= 10000000) && (freq <= 20000000)) { - snd_soc_write(codec, M98090_REG_SYSTEM_CLOCK, + snd_soc_component_write(component, M98090_REG_SYSTEM_CLOCK, M98090_PSCLK_DIV1); max98090->pclk = freq; } else if ((freq > 20000000) && (freq <= 40000000)) { - snd_soc_write(codec, M98090_REG_SYSTEM_CLOCK, + snd_soc_component_write(component, M98090_REG_SYSTEM_CLOCK, M98090_PSCLK_DIV2); max98090->pclk = freq >> 1; } else if ((freq > 40000000) && (freq <= 60000000)) { - snd_soc_write(codec, M98090_REG_SYSTEM_CLOCK, + snd_soc_component_write(component, M98090_REG_SYSTEM_CLOCK, M98090_PSCLK_DIV4); max98090->pclk = freq >> 2; } else { - dev_err(codec->dev, "Invalid master clock frequency\n"); + dev_err(component->dev, "Invalid master clock frequency\n"); return -EINVAL; } @@ -2022,11 +2022,11 @@ static int max98090_dai_set_sysclk(struct snd_soc_dai *dai, static int max98090_dai_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int regval; regval = mute ? M98090_DVM_MASK : 0; - snd_soc_update_bits(codec, M98090_REG_DAI_PLAYBACK_LEVEL, + snd_soc_component_update_bits(component, M98090_REG_DAI_PLAYBACK_LEVEL, M98090_DVM_MASK, regval); return 0; @@ -2035,8 +2035,8 @@ static int max98090_dai_digital_mute(struct snd_soc_dai *codec_dai, int mute) static int max98090_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); switch (cmd) { case SNDRV_PCM_TRIGGER_START: @@ -2065,7 +2065,7 @@ static void max98090_pll_det_enable_work(struct work_struct *work) struct max98090_priv *max98090 = container_of(work, struct max98090_priv, pll_det_enable_work.work); - struct snd_soc_codec *codec = max98090->codec; + struct snd_soc_component *component = max98090->component; unsigned int status, mask; /* @@ -2088,7 +2088,7 @@ static void max98090_pll_det_enable_work(struct work_struct *work) msecs_to_jiffies(100)); /* Enable PLL unlock interrupt */ - snd_soc_update_bits(codec, M98090_REG_INTERRUPT_S, + snd_soc_component_update_bits(component, M98090_REG_INTERRUPT_S, M98090_IULK_MASK, 1 << M98090_IULK_SHIFT); } @@ -2097,12 +2097,12 @@ static void max98090_pll_det_disable_work(struct work_struct *work) { struct max98090_priv *max98090 = container_of(work, struct max98090_priv, pll_det_disable_work); - struct snd_soc_codec *codec = max98090->codec; + struct snd_soc_component *component = max98090->component; cancel_delayed_work_sync(&max98090->pll_det_enable_work); /* Disable PLL unlock interrupt */ - snd_soc_update_bits(codec, M98090_REG_INTERRUPT_S, + snd_soc_component_update_bits(component, M98090_REG_INTERRUPT_S, M98090_IULK_MASK, 0); } @@ -2110,18 +2110,18 @@ static void max98090_pll_work(struct work_struct *work) { struct max98090_priv *max98090 = container_of(work, struct max98090_priv, pll_work); - struct snd_soc_codec *codec = max98090->codec; + struct snd_soc_component *component = max98090->component; - if (!snd_soc_codec_is_active(codec)) + if (!snd_soc_component_is_active(component)) return; - dev_info_ratelimited(codec->dev, "PLL unlocked\n"); + dev_info_ratelimited(component->dev, "PLL unlocked\n"); /* Toggle shutdown OFF then ON */ - snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN, + snd_soc_component_update_bits(component, M98090_REG_DEVICE_SHUTDOWN, M98090_SHDNN_MASK, 0); msleep(10); - snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN, + snd_soc_component_update_bits(component, M98090_REG_DEVICE_SHUTDOWN, M98090_SHDNN_MASK, M98090_SHDNN_MASK); /* Give PLL time to lock */ @@ -2133,7 +2133,7 @@ static void max98090_jack_work(struct work_struct *work) struct max98090_priv *max98090 = container_of(work, struct max98090_priv, jack_work.work); - struct snd_soc_codec *codec = max98090->codec; + struct snd_soc_component *component = max98090->component; int status = 0; int reg; @@ -2141,25 +2141,25 @@ static void max98090_jack_work(struct work_struct *work) if (max98090->jack_state == M98090_JACK_STATE_NO_HEADSET) { /* Strong pull up allows mic detection */ - snd_soc_update_bits(codec, M98090_REG_JACK_DETECT, + snd_soc_component_update_bits(component, M98090_REG_JACK_DETECT, M98090_JDWK_MASK, 0); msleep(50); - reg = snd_soc_read(codec, M98090_REG_JACK_STATUS); + reg = snd_soc_component_read32(component, M98090_REG_JACK_STATUS); /* Weak pull up allows only insertion detection */ - snd_soc_update_bits(codec, M98090_REG_JACK_DETECT, + snd_soc_component_update_bits(component, M98090_REG_JACK_DETECT, M98090_JDWK_MASK, M98090_JDWK_MASK); } else { - reg = snd_soc_read(codec, M98090_REG_JACK_STATUS); + reg = snd_soc_component_read32(component, M98090_REG_JACK_STATUS); } - reg = snd_soc_read(codec, M98090_REG_JACK_STATUS); + reg = snd_soc_component_read32(component, M98090_REG_JACK_STATUS); switch (reg & (M98090_LSNS_MASK | M98090_JKSNS_MASK)) { case M98090_LSNS_MASK | M98090_JKSNS_MASK: - dev_dbg(codec->dev, "No Headset Detected\n"); + dev_dbg(component->dev, "No Headset Detected\n"); max98090->jack_state = M98090_JACK_STATE_NO_HEADSET; @@ -2171,7 +2171,7 @@ static void max98090_jack_work(struct work_struct *work) if (max98090->jack_state == M98090_JACK_STATE_HEADSET) { - dev_dbg(codec->dev, + dev_dbg(component->dev, "Headset Button Down Detected\n"); /* @@ -2188,7 +2188,7 @@ static void max98090_jack_work(struct work_struct *work) /* Line is reported as Headphone */ /* Nokia Headset is reported as Headphone */ /* Mono Headphone is reported as Headphone */ - dev_dbg(codec->dev, "Headphone Detected\n"); + dev_dbg(component->dev, "Headphone Detected\n"); max98090->jack_state = M98090_JACK_STATE_HEADPHONE; @@ -2197,7 +2197,7 @@ static void max98090_jack_work(struct work_struct *work) break; case M98090_JKSNS_MASK: - dev_dbg(codec->dev, "Headset Detected\n"); + dev_dbg(component->dev, "Headset Detected\n"); max98090->jack_state = M98090_JACK_STATE_HEADSET; @@ -2206,7 +2206,7 @@ static void max98090_jack_work(struct work_struct *work) break; default: - dev_dbg(codec->dev, "Unrecognized Jack Status\n"); + dev_dbg(component->dev, "Unrecognized Jack Status\n"); break; } @@ -2217,21 +2217,21 @@ static void max98090_jack_work(struct work_struct *work) static irqreturn_t max98090_interrupt(int irq, void *data) { struct max98090_priv *max98090 = data; - struct snd_soc_codec *codec = max98090->codec; + struct snd_soc_component *component = max98090->component; int ret; unsigned int mask; unsigned int active; /* Treat interrupt before codec is initialized as spurious */ - if (codec == NULL) + if (component == NULL) return IRQ_NONE; - dev_dbg(codec->dev, "***** max98090_interrupt *****\n"); + dev_dbg(component->dev, "***** max98090_interrupt *****\n"); ret = regmap_read(max98090->regmap, M98090_REG_INTERRUPT_S, &mask); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "failed to read M98090_REG_INTERRUPT_S: %d\n", ret); return IRQ_NONE; @@ -2240,13 +2240,13 @@ static irqreturn_t max98090_interrupt(int irq, void *data) ret = regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &active); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "failed to read M98090_REG_DEVICE_STATUS: %d\n", ret); return IRQ_NONE; } - dev_dbg(codec->dev, "active=0x%02x mask=0x%02x -> active=0x%02x\n", + dev_dbg(component->dev, "active=0x%02x mask=0x%02x -> active=0x%02x\n", active, mask, active & mask); active &= mask; @@ -2255,20 +2255,20 @@ static irqreturn_t max98090_interrupt(int irq, void *data) return IRQ_NONE; if (active & M98090_CLD_MASK) - dev_err(codec->dev, "M98090_CLD_MASK\n"); + dev_err(component->dev, "M98090_CLD_MASK\n"); if (active & M98090_SLD_MASK) - dev_dbg(codec->dev, "M98090_SLD_MASK\n"); + dev_dbg(component->dev, "M98090_SLD_MASK\n"); if (active & M98090_ULK_MASK) { - dev_dbg(codec->dev, "M98090_ULK_MASK\n"); + dev_dbg(component->dev, "M98090_ULK_MASK\n"); schedule_work(&max98090->pll_work); } if (active & M98090_JDET_MASK) { - dev_dbg(codec->dev, "M98090_JDET_MASK\n"); + dev_dbg(component->dev, "M98090_JDET_MASK\n"); - pm_wakeup_event(codec->dev, 100); + pm_wakeup_event(component->dev, 100); queue_delayed_work(system_power_efficient_wq, &max98090->jack_work, @@ -2276,10 +2276,10 @@ static irqreturn_t max98090_interrupt(int irq, void *data) } if (active & M98090_DRCACT_MASK) - dev_dbg(codec->dev, "M98090_DRCACT_MASK\n"); + dev_dbg(component->dev, "M98090_DRCACT_MASK\n"); if (active & M98090_DRCCLP_MASK) - dev_err(codec->dev, "M98090_DRCCLP_MASK\n"); + dev_err(component->dev, "M98090_DRCCLP_MASK\n"); return IRQ_HANDLED; } @@ -2287,7 +2287,7 @@ static irqreturn_t max98090_interrupt(int irq, void *data) /** * max98090_mic_detect - Enable microphone detection via the MAX98090 IRQ * - * @codec: MAX98090 codec + * @component: MAX98090 component * @jack: jack to report detection events on * * Enable microphone detection via IRQ on the MAX98090. If GPIOs are @@ -2297,20 +2297,20 @@ static irqreturn_t max98090_interrupt(int irq, void *data) * * If no jack is supplied detection will be disabled. */ -int max98090_mic_detect(struct snd_soc_codec *codec, +int max98090_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "max98090_mic_detect\n"); + dev_dbg(component->dev, "max98090_mic_detect\n"); max98090->jack = jack; if (jack) { - snd_soc_update_bits(codec, M98090_REG_INTERRUPT_S, + snd_soc_component_update_bits(component, M98090_REG_INTERRUPT_S, M98090_IJDET_MASK, 1 << M98090_IJDET_SHIFT); } else { - snd_soc_update_bits(codec, M98090_REG_INTERRUPT_S, + snd_soc_component_update_bits(component, M98090_REG_INTERRUPT_S, M98090_IJDET_MASK, 0); } @@ -2360,22 +2360,22 @@ static struct snd_soc_dai_driver max98090_dai[] = { } }; -static int max98090_probe(struct snd_soc_codec *codec) +static int max98090_probe(struct snd_soc_component *component) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); struct max98090_cdata *cdata; enum max98090_type devtype; int ret = 0; int err; unsigned int micbias; - dev_dbg(codec->dev, "max98090_probe\n"); + dev_dbg(component->dev, "max98090_probe\n"); - max98090->mclk = devm_clk_get(codec->dev, "mclk"); + max98090->mclk = devm_clk_get(component->dev, "mclk"); if (PTR_ERR(max98090->mclk) == -EPROBE_DEFER) return -EPROBE_DEFER; - max98090->codec = codec; + max98090->component = component; /* Reset the codec, the DSP core, and disable all interrupts */ max98090_reset(max98090); @@ -2394,26 +2394,26 @@ static int max98090_probe(struct snd_soc_codec *codec) max98090->pa1en = 0; max98090->pa2en = 0; - ret = snd_soc_read(codec, M98090_REG_REVISION_ID); + ret = snd_soc_component_read32(component, M98090_REG_REVISION_ID); if (ret < 0) { - dev_err(codec->dev, "Failed to read device revision: %d\n", + dev_err(component->dev, "Failed to read device revision: %d\n", ret); goto err_access; } if ((ret >= M98090_REVA) && (ret <= M98090_REVA + 0x0f)) { devtype = MAX98090; - dev_info(codec->dev, "MAX98090 REVID=0x%02x\n", ret); + dev_info(component->dev, "MAX98090 REVID=0x%02x\n", ret); } else if ((ret >= M98091_REVA) && (ret <= M98091_REVA + 0x0f)) { devtype = MAX98091; - dev_info(codec->dev, "MAX98091 REVID=0x%02x\n", ret); + dev_info(component->dev, "MAX98091 REVID=0x%02x\n", ret); } else { devtype = MAX98090; - dev_err(codec->dev, "Unrecognized revision 0x%02x\n", ret); + dev_err(component->dev, "Unrecognized revision 0x%02x\n", ret); } if (max98090->devtype != devtype) { - dev_warn(codec->dev, "Mismatch in DT specified CODEC type.\n"); + dev_warn(component->dev, "Mismatch in DT specified CODEC type.\n"); max98090->devtype = devtype; } @@ -2427,7 +2427,7 @@ static int max98090_probe(struct snd_soc_codec *codec) INIT_WORK(&max98090->pll_work, max98090_pll_work); /* Enable jack detection */ - snd_soc_write(codec, M98090_REG_JACK_DETECT, + snd_soc_component_write(component, M98090_REG_JACK_DETECT, M98090_JDETEN_MASK | M98090_JDEB_25MS); /* @@ -2435,75 +2435,76 @@ static int max98090_probe(struct snd_soc_codec *codec) * An old interrupt ocurring prior to installing the ISR * can keep a new interrupt from generating a trigger. */ - snd_soc_read(codec, M98090_REG_DEVICE_STATUS); + snd_soc_component_read32(component, M98090_REG_DEVICE_STATUS); /* High Performance is default */ - snd_soc_update_bits(codec, M98090_REG_DAC_CONTROL, + snd_soc_component_update_bits(component, M98090_REG_DAC_CONTROL, M98090_DACHP_MASK, 1 << M98090_DACHP_SHIFT); - snd_soc_update_bits(codec, M98090_REG_DAC_CONTROL, + snd_soc_component_update_bits(component, M98090_REG_DAC_CONTROL, M98090_PERFMODE_MASK, 0 << M98090_PERFMODE_SHIFT); - snd_soc_update_bits(codec, M98090_REG_ADC_CONTROL, + snd_soc_component_update_bits(component, M98090_REG_ADC_CONTROL, M98090_ADCHP_MASK, 1 << M98090_ADCHP_SHIFT); /* Turn on VCM bandgap reference */ - snd_soc_write(codec, M98090_REG_BIAS_CONTROL, + snd_soc_component_write(component, M98090_REG_BIAS_CONTROL, M98090_VCM_MODE_MASK); - err = device_property_read_u32(codec->dev, "maxim,micbias", &micbias); + err = device_property_read_u32(component->dev, "maxim,micbias", &micbias); if (err) { micbias = M98090_MBVSEL_2V8; - dev_info(codec->dev, "use default 2.8v micbias\n"); + dev_info(component->dev, "use default 2.8v micbias\n"); } else if (micbias > M98090_MBVSEL_2V8) { - dev_err(codec->dev, "micbias out of range 0x%x\n", micbias); + dev_err(component->dev, "micbias out of range 0x%x\n", micbias); micbias = M98090_MBVSEL_2V8; } - snd_soc_update_bits(codec, M98090_REG_MIC_BIAS_VOLTAGE, + snd_soc_component_update_bits(component, M98090_REG_MIC_BIAS_VOLTAGE, M98090_MBVSEL_MASK, micbias); - max98090_add_widgets(codec); + max98090_add_widgets(component); err_access: return ret; } -static int max98090_remove(struct snd_soc_codec *codec) +static void max98090_remove(struct snd_soc_component *component) { - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); cancel_delayed_work_sync(&max98090->jack_work); cancel_delayed_work_sync(&max98090->pll_det_enable_work); cancel_work_sync(&max98090->pll_det_disable_work); cancel_work_sync(&max98090->pll_work); - max98090->codec = NULL; - - return 0; + max98090->component = NULL; } -static void max98090_seq_notifier(struct snd_soc_dapm_context *dapm, +static void max98090_seq_notifier(struct snd_soc_component *component, enum snd_soc_dapm_type event, int subseq) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); + struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); if (max98090->shdn_pending) { - snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN, + snd_soc_component_update_bits(component, M98090_REG_DEVICE_SHUTDOWN, M98090_SHDNN_MASK, 0); msleep(40); - snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN, + snd_soc_component_update_bits(component, M98090_REG_DEVICE_SHUTDOWN, M98090_SHDNN_MASK, M98090_SHDNN_MASK); max98090->shdn_pending = false; } } -static const struct snd_soc_codec_driver soc_codec_dev_max98090 = { - .probe = max98090_probe, - .remove = max98090_remove, - .seq_notifier = max98090_seq_notifier, - .set_bias_level = max98090_set_bias_level, +static const struct snd_soc_component_driver soc_component_dev_max98090 = { + .probe = max98090_probe, + .remove = max98090_remove, + .seq_notifier = max98090_seq_notifier, + .set_bias_level = max98090_set_bias_level, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98090_regmap = { @@ -2570,8 +2571,8 @@ static int max98090_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_max98090, max98090_dai, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98090, max98090_dai, ARRAY_SIZE(max98090_dai)); err_enable: return ret; @@ -2595,7 +2596,7 @@ static void max98090_i2c_shutdown(struct i2c_client *i2c) static int max98090_i2c_remove(struct i2c_client *client) { max98090_i2c_shutdown(client); - snd_soc_unregister_codec(&client->dev); + return 0; } diff --git a/sound/soc/codecs/max98090.h b/sound/soc/codecs/max98090.h index bc610d9a9ecb..b1572a2d19da 100644 --- a/sound/soc/codecs/max98090.h +++ b/sound/soc/codecs/max98090.h @@ -1519,7 +1519,7 @@ struct max98090_cdata { struct max98090_priv { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; enum max98090_type devtype; struct max98090_pdata *pdata; struct clk *mclk; @@ -1546,7 +1546,7 @@ struct max98090_priv { bool shdn_pending; }; -int max98090_mic_detect(struct snd_soc_codec *codec, +int max98090_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif diff --git a/sound/soc/codecs/max98095.c b/sound/soc/codecs/max98095.c index 5ead87d2ab1d..6bf2d0ba864f 100644 --- a/sound/soc/codecs/max98095.c +++ b/sound/soc/codecs/max98095.c @@ -251,7 +251,7 @@ static const struct regmap_config max98095_regmap = { /* * Load equalizer DSP coefficient configurations registers */ -static void m98095_eq_band(struct snd_soc_codec *codec, unsigned int dai, +static void m98095_eq_band(struct snd_soc_component *component, unsigned int dai, unsigned int band, u16 *coefs) { unsigned int eq_reg; @@ -269,15 +269,15 @@ static void m98095_eq_band(struct snd_soc_codec *codec, unsigned int dai, /* Step through the registers and coefs */ for (i = 0; i < M98095_COEFS_PER_BAND; i++) { - snd_soc_write(codec, eq_reg++, M98095_BYTE1(coefs[i])); - snd_soc_write(codec, eq_reg++, M98095_BYTE0(coefs[i])); + snd_soc_component_write(component, eq_reg++, M98095_BYTE1(coefs[i])); + snd_soc_component_write(component, eq_reg++, M98095_BYTE0(coefs[i])); } } /* * Load biquad filter coefficient configurations registers */ -static void m98095_biquad_band(struct snd_soc_codec *codec, unsigned int dai, +static void m98095_biquad_band(struct snd_soc_component *component, unsigned int dai, unsigned int band, u16 *coefs) { unsigned int bq_reg; @@ -295,8 +295,8 @@ static void m98095_biquad_band(struct snd_soc_codec *codec, unsigned int dai, /* Step through the registers and coefs */ for (i = 0; i < M98095_COEFS_PER_BAND; i++) { - snd_soc_write(codec, bq_reg++, M98095_BYTE1(coefs[i])); - snd_soc_write(codec, bq_reg++, M98095_BYTE0(coefs[i])); + snd_soc_component_write(component, bq_reg++, M98095_BYTE1(coefs[i])); + snd_soc_component_write(component, bq_reg++, M98095_BYTE0(coefs[i])); } } @@ -353,12 +353,12 @@ static SOC_ENUM_SINGLE_DECL(max98095_dai3_dac_filter_enum, static int max98095_mic1pre_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); unsigned int sel = ucontrol->value.integer.value[0]; max98095->mic1pre = sel; - snd_soc_update_bits(codec, M98095_05F_LVL_MIC1, M98095_MICPRE_MASK, + snd_soc_component_update_bits(component, M98095_05F_LVL_MIC1, M98095_MICPRE_MASK, (1+sel)<<M98095_MICPRE_SHIFT); return 0; @@ -367,8 +367,8 @@ static int max98095_mic1pre_set(struct snd_kcontrol *kcontrol, static int max98095_mic1pre_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = max98095->mic1pre; return 0; @@ -377,12 +377,12 @@ static int max98095_mic1pre_get(struct snd_kcontrol *kcontrol, static int max98095_mic2pre_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); unsigned int sel = ucontrol->value.integer.value[0]; max98095->mic2pre = sel; - snd_soc_update_bits(codec, M98095_060_LVL_MIC2, M98095_MICPRE_MASK, + snd_soc_component_update_bits(component, M98095_060_LVL_MIC2, M98095_MICPRE_MASK, (1+sel)<<M98095_MICPRE_SHIFT); return 0; @@ -391,8 +391,8 @@ static int max98095_mic2pre_set(struct snd_kcontrol *kcontrol, static int max98095_mic2pre_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = max98095->mic2pre; return 0; @@ -598,21 +598,21 @@ static const struct snd_kcontrol_new max98095_right_ADC_mixer_controls[] = { static int max98095_mic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: if (w->reg == M98095_05F_LVL_MIC1) { - snd_soc_update_bits(codec, w->reg, M98095_MICPRE_MASK, + snd_soc_component_update_bits(component, w->reg, M98095_MICPRE_MASK, (1+max98095->mic1pre)<<M98095_MICPRE_SHIFT); } else { - snd_soc_update_bits(codec, w->reg, M98095_MICPRE_MASK, + snd_soc_component_update_bits(component, w->reg, M98095_MICPRE_MASK, (1+max98095->mic2pre)<<M98095_MICPRE_SHIFT); } break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, M98095_MICPRE_MASK, 0); + snd_soc_component_update_bits(component, w->reg, M98095_MICPRE_MASK, 0); break; default: return -EINVAL; @@ -628,8 +628,8 @@ static int max98095_mic_event(struct snd_soc_dapm_widget *w, static int max98095_line_pga(struct snd_soc_dapm_widget *w, int event, u8 channel) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); u8 *state; if (WARN_ON(!(channel == 1 || channel == 2))) @@ -640,13 +640,13 @@ static int max98095_line_pga(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_POST_PMU: *state |= channel; - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift), (1 << w->shift)); break; case SND_SOC_DAPM_POST_PMD: *state &= ~channel; if (*state == 0) { - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << w->shift), 0); } break; @@ -676,15 +676,15 @@ static int max98095_pga_in2_event(struct snd_soc_dapm_widget *w, static int max98095_lineout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << (w->shift+2)), (1 << (w->shift+2))); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, (1 << (w->shift+2)), 0); break; default: @@ -942,8 +942,8 @@ static int max98095_dai1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; unsigned long long ni; unsigned int rate; @@ -955,11 +955,11 @@ static int max98095_dai1_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98095_02A_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98095_02A_DAI1_FORMAT, M98095_DAI_WS, 0); break; case 24: - snd_soc_update_bits(codec, M98095_02A_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98095_02A_DAI1_FORMAT, M98095_DAI_WS, M98095_DAI_WS); break; default: @@ -969,31 +969,31 @@ static int max98095_dai1_hw_params(struct snd_pcm_substream *substream, if (rate_value(rate, ®val)) return -EINVAL; - snd_soc_update_bits(codec, M98095_027_DAI1_CLKMODE, + snd_soc_component_update_bits(component, M98095_027_DAI1_CLKMODE, M98095_CLKMODE_MASK, regval); cdata->rate = rate; /* Configure NI when operating as master */ - if (snd_soc_read(codec, M98095_02A_DAI1_FORMAT) & M98095_DAI_MAS) { + if (snd_soc_component_read32(component, M98095_02A_DAI1_FORMAT) & M98095_DAI_MAS) { if (max98095->sysclk == 0) { - dev_err(codec->dev, "Invalid system clock frequency\n"); + dev_err(component->dev, "Invalid system clock frequency\n"); return -EINVAL; } ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL) * (unsigned long long int)rate; do_div(ni, (unsigned long long int)max98095->sysclk); - snd_soc_write(codec, M98095_028_DAI1_CLKCFG_HI, + snd_soc_component_write(component, M98095_028_DAI1_CLKCFG_HI, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98095_029_DAI1_CLKCFG_LO, + snd_soc_component_write(component, M98095_029_DAI1_CLKCFG_LO, ni & 0xFF); } /* Update sample rate mode */ if (rate < 50000) - snd_soc_update_bits(codec, M98095_02E_DAI1_FILTERS, + snd_soc_component_update_bits(component, M98095_02E_DAI1_FILTERS, M98095_DAI_DHF, 0); else - snd_soc_update_bits(codec, M98095_02E_DAI1_FILTERS, + snd_soc_component_update_bits(component, M98095_02E_DAI1_FILTERS, M98095_DAI_DHF, M98095_DAI_DHF); return 0; @@ -1003,8 +1003,8 @@ static int max98095_dai2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; unsigned long long ni; unsigned int rate; @@ -1016,11 +1016,11 @@ static int max98095_dai2_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98095_034_DAI2_FORMAT, M98095_DAI_WS, 0); break; case 24: - snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98095_034_DAI2_FORMAT, M98095_DAI_WS, M98095_DAI_WS); break; default: @@ -1030,31 +1030,31 @@ static int max98095_dai2_hw_params(struct snd_pcm_substream *substream, if (rate_value(rate, ®val)) return -EINVAL; - snd_soc_update_bits(codec, M98095_031_DAI2_CLKMODE, + snd_soc_component_update_bits(component, M98095_031_DAI2_CLKMODE, M98095_CLKMODE_MASK, regval); cdata->rate = rate; /* Configure NI when operating as master */ - if (snd_soc_read(codec, M98095_034_DAI2_FORMAT) & M98095_DAI_MAS) { + if (snd_soc_component_read32(component, M98095_034_DAI2_FORMAT) & M98095_DAI_MAS) { if (max98095->sysclk == 0) { - dev_err(codec->dev, "Invalid system clock frequency\n"); + dev_err(component->dev, "Invalid system clock frequency\n"); return -EINVAL; } ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL) * (unsigned long long int)rate; do_div(ni, (unsigned long long int)max98095->sysclk); - snd_soc_write(codec, M98095_032_DAI2_CLKCFG_HI, + snd_soc_component_write(component, M98095_032_DAI2_CLKCFG_HI, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98095_033_DAI2_CLKCFG_LO, + snd_soc_component_write(component, M98095_033_DAI2_CLKCFG_LO, ni & 0xFF); } /* Update sample rate mode */ if (rate < 50000) - snd_soc_update_bits(codec, M98095_038_DAI2_FILTERS, + snd_soc_component_update_bits(component, M98095_038_DAI2_FILTERS, M98095_DAI_DHF, 0); else - snd_soc_update_bits(codec, M98095_038_DAI2_FILTERS, + snd_soc_component_update_bits(component, M98095_038_DAI2_FILTERS, M98095_DAI_DHF, M98095_DAI_DHF); return 0; @@ -1064,8 +1064,8 @@ static int max98095_dai3_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; unsigned long long ni; unsigned int rate; @@ -1077,11 +1077,11 @@ static int max98095_dai3_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 16: - snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT, + snd_soc_component_update_bits(component, M98095_03E_DAI3_FORMAT, M98095_DAI_WS, 0); break; case 24: - snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT, + snd_soc_component_update_bits(component, M98095_03E_DAI3_FORMAT, M98095_DAI_WS, M98095_DAI_WS); break; default: @@ -1091,31 +1091,31 @@ static int max98095_dai3_hw_params(struct snd_pcm_substream *substream, if (rate_value(rate, ®val)) return -EINVAL; - snd_soc_update_bits(codec, M98095_03B_DAI3_CLKMODE, + snd_soc_component_update_bits(component, M98095_03B_DAI3_CLKMODE, M98095_CLKMODE_MASK, regval); cdata->rate = rate; /* Configure NI when operating as master */ - if (snd_soc_read(codec, M98095_03E_DAI3_FORMAT) & M98095_DAI_MAS) { + if (snd_soc_component_read32(component, M98095_03E_DAI3_FORMAT) & M98095_DAI_MAS) { if (max98095->sysclk == 0) { - dev_err(codec->dev, "Invalid system clock frequency\n"); + dev_err(component->dev, "Invalid system clock frequency\n"); return -EINVAL; } ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL) * (unsigned long long int)rate; do_div(ni, (unsigned long long int)max98095->sysclk); - snd_soc_write(codec, M98095_03C_DAI3_CLKCFG_HI, + snd_soc_component_write(component, M98095_03C_DAI3_CLKCFG_HI, (ni >> 8) & 0x7F); - snd_soc_write(codec, M98095_03D_DAI3_CLKCFG_LO, + snd_soc_component_write(component, M98095_03D_DAI3_CLKCFG_LO, ni & 0xFF); } /* Update sample rate mode */ if (rate < 50000) - snd_soc_update_bits(codec, M98095_042_DAI3_FILTERS, + snd_soc_component_update_bits(component, M98095_042_DAI3_FILTERS, M98095_DAI_DHF, 0); else - snd_soc_update_bits(codec, M98095_042_DAI3_FILTERS, + snd_soc_component_update_bits(component, M98095_042_DAI3_FILTERS, M98095_DAI_DHF, M98095_DAI_DHF); return 0; @@ -1124,8 +1124,8 @@ static int max98095_dai3_hw_params(struct snd_pcm_substream *substream, static int max98095_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); /* Requested clock frequency is already setup */ if (freq == max98095->sysclk) @@ -1142,13 +1142,13 @@ static int max98095_dai_set_sysclk(struct snd_soc_dai *dai, * 0x03 (when master clk is 40MHz to 60MHz).. */ if ((freq >= 10000000) && (freq < 20000000)) { - snd_soc_write(codec, M98095_026_SYS_CLK, 0x10); + snd_soc_component_write(component, M98095_026_SYS_CLK, 0x10); } else if ((freq >= 20000000) && (freq < 40000000)) { - snd_soc_write(codec, M98095_026_SYS_CLK, 0x20); + snd_soc_component_write(component, M98095_026_SYS_CLK, 0x20); } else if ((freq >= 40000000) && (freq < 60000000)) { - snd_soc_write(codec, M98095_026_SYS_CLK, 0x30); + snd_soc_component_write(component, M98095_026_SYS_CLK, 0x30); } else { - dev_err(codec->dev, "Invalid master clock frequency\n"); + dev_err(component->dev, "Invalid master clock frequency\n"); return -EINVAL; } @@ -1161,8 +1161,8 @@ static int max98095_dai_set_sysclk(struct snd_soc_dai *dai, static int max98095_dai1_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; u8 regval = 0; @@ -1174,9 +1174,9 @@ static int max98095_dai1_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Slave mode PLL */ - snd_soc_write(codec, M98095_028_DAI1_CLKCFG_HI, + snd_soc_component_write(component, M98095_028_DAI1_CLKCFG_HI, 0x80); - snd_soc_write(codec, M98095_029_DAI1_CLKCFG_LO, + snd_soc_component_write(component, M98095_029_DAI1_CLKCFG_LO, 0x00); break; case SND_SOC_DAIFMT_CBM_CFM: @@ -1186,7 +1186,7 @@ static int max98095_dai1_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "Clock mode unsupported"); + dev_err(component->dev, "Clock mode unsupported"); return -EINVAL; } @@ -1216,11 +1216,11 @@ static int max98095_dai1_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_update_bits(codec, M98095_02A_DAI1_FORMAT, + snd_soc_component_update_bits(component, M98095_02A_DAI1_FORMAT, M98095_DAI_MAS | M98095_DAI_DLY | M98095_DAI_BCI | M98095_DAI_WCI, regval); - snd_soc_write(codec, M98095_02B_DAI1_CLOCK, M98095_DAI_BSEL64); + snd_soc_component_write(component, M98095_02B_DAI1_CLOCK, M98095_DAI_BSEL64); } return 0; @@ -1229,8 +1229,8 @@ static int max98095_dai1_set_fmt(struct snd_soc_dai *codec_dai, static int max98095_dai2_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; u8 regval = 0; @@ -1242,9 +1242,9 @@ static int max98095_dai2_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Slave mode PLL */ - snd_soc_write(codec, M98095_032_DAI2_CLKCFG_HI, + snd_soc_component_write(component, M98095_032_DAI2_CLKCFG_HI, 0x80); - snd_soc_write(codec, M98095_033_DAI2_CLKCFG_LO, + snd_soc_component_write(component, M98095_033_DAI2_CLKCFG_LO, 0x00); break; case SND_SOC_DAIFMT_CBM_CFM: @@ -1254,7 +1254,7 @@ static int max98095_dai2_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "Clock mode unsupported"); + dev_err(component->dev, "Clock mode unsupported"); return -EINVAL; } @@ -1284,11 +1284,11 @@ static int max98095_dai2_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT, + snd_soc_component_update_bits(component, M98095_034_DAI2_FORMAT, M98095_DAI_MAS | M98095_DAI_DLY | M98095_DAI_BCI | M98095_DAI_WCI, regval); - snd_soc_write(codec, M98095_035_DAI2_CLOCK, + snd_soc_component_write(component, M98095_035_DAI2_CLOCK, M98095_DAI_BSEL64); } @@ -1298,8 +1298,8 @@ static int max98095_dai2_set_fmt(struct snd_soc_dai *codec_dai, static int max98095_dai3_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; u8 regval = 0; @@ -1311,9 +1311,9 @@ static int max98095_dai3_set_fmt(struct snd_soc_dai *codec_dai, switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* Slave mode PLL */ - snd_soc_write(codec, M98095_03C_DAI3_CLKCFG_HI, + snd_soc_component_write(component, M98095_03C_DAI3_CLKCFG_HI, 0x80); - snd_soc_write(codec, M98095_03D_DAI3_CLKCFG_LO, + snd_soc_component_write(component, M98095_03D_DAI3_CLKCFG_LO, 0x00); break; case SND_SOC_DAIFMT_CBM_CFM: @@ -1323,7 +1323,7 @@ static int max98095_dai3_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "Clock mode unsupported"); + dev_err(component->dev, "Clock mode unsupported"); return -EINVAL; } @@ -1353,21 +1353,21 @@ static int max98095_dai3_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT, + snd_soc_component_update_bits(component, M98095_03E_DAI3_FORMAT, M98095_DAI_MAS | M98095_DAI_DLY | M98095_DAI_BCI | M98095_DAI_WCI, regval); - snd_soc_write(codec, M98095_03F_DAI3_CLOCK, + snd_soc_component_write(component, M98095_03F_DAI3_CLOCK, M98095_DAI_BSEL64); } return 0; } -static int max98095_set_bias_level(struct snd_soc_codec *codec, +static int max98095_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1385,7 +1385,7 @@ static int max98095_set_bias_level(struct snd_soc_codec *codec, if (IS_ERR(max98095->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(max98095->mclk); } else { ret = clk_prepare_enable(max98095->mclk); @@ -1395,21 +1395,21 @@ static int max98095_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { ret = regcache_sync(max98095->regmap); if (ret != 0) { - dev_err(codec->dev, "Failed to sync cache: %d\n", ret); + dev_err(component->dev, "Failed to sync cache: %d\n", ret); return ret; } } - snd_soc_update_bits(codec, M98095_090_PWR_EN_IN, + snd_soc_component_update_bits(component, M98095_090_PWR_EN_IN, M98095_MBEN, M98095_MBEN); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, M98095_090_PWR_EN_IN, + snd_soc_component_update_bits(component, M98095_090_PWR_EN_IN, M98095_MBEN, 0); regcache_mark_dirty(max98095->regmap); break; @@ -1494,8 +1494,8 @@ static int max98095_get_eq_channel(const char *name) static int max98095_put_eq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_pdata *pdata = max98095->pdata; int channel = max98095_get_eq_channel(kcontrol->id.name); struct max98095_cdata *cdata; @@ -1528,7 +1528,7 @@ static int max98095_put_eq_enum(struct snd_kcontrol *kcontrol, } } - dev_dbg(codec->dev, "Selected %s/%dHz for %dHz sample rate\n", + dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n", pdata->eq_cfg[best].name, pdata->eq_cfg[best].rate, fs); @@ -1537,29 +1537,29 @@ static int max98095_put_eq_enum(struct snd_kcontrol *kcontrol, regmask = (channel == 0) ? M98095_EQ1EN : M98095_EQ2EN; /* Disable filter while configuring, and save current on/off state */ - regsave = snd_soc_read(codec, M98095_088_CFG_LEVEL); - snd_soc_update_bits(codec, M98095_088_CFG_LEVEL, regmask, 0); + regsave = snd_soc_component_read32(component, M98095_088_CFG_LEVEL); + snd_soc_component_update_bits(component, M98095_088_CFG_LEVEL, regmask, 0); mutex_lock(&max98095->lock); - snd_soc_update_bits(codec, M98095_00F_HOST_CFG, M98095_SEG, M98095_SEG); - m98095_eq_band(codec, channel, 0, coef_set->band1); - m98095_eq_band(codec, channel, 1, coef_set->band2); - m98095_eq_band(codec, channel, 2, coef_set->band3); - m98095_eq_band(codec, channel, 3, coef_set->band4); - m98095_eq_band(codec, channel, 4, coef_set->band5); - snd_soc_update_bits(codec, M98095_00F_HOST_CFG, M98095_SEG, 0); + snd_soc_component_update_bits(component, M98095_00F_HOST_CFG, M98095_SEG, M98095_SEG); + m98095_eq_band(component, channel, 0, coef_set->band1); + m98095_eq_band(component, channel, 1, coef_set->band2); + m98095_eq_band(component, channel, 2, coef_set->band3); + m98095_eq_band(component, channel, 3, coef_set->band4); + m98095_eq_band(component, channel, 4, coef_set->band5); + snd_soc_component_update_bits(component, M98095_00F_HOST_CFG, M98095_SEG, 0); mutex_unlock(&max98095->lock); /* Restore the original on/off state */ - snd_soc_update_bits(codec, M98095_088_CFG_LEVEL, regmask, regsave); + snd_soc_component_update_bits(component, M98095_088_CFG_LEVEL, regmask, regsave); return 0; } static int max98095_get_eq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); int channel = max98095_get_eq_channel(kcontrol->id.name); struct max98095_cdata *cdata; @@ -1569,9 +1569,9 @@ static int max98095_get_eq_enum(struct snd_kcontrol *kcontrol, return 0; } -static void max98095_handle_eq_pdata(struct snd_soc_codec *codec) +static void max98095_handle_eq_pdata(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_pdata *pdata = max98095->pdata; struct max98095_eq_cfg *cfg; unsigned int cfgcnt; @@ -1624,14 +1624,14 @@ static void max98095_handle_eq_pdata(struct snd_soc_codec *codec) max98095->eq_enum.texts = max98095->eq_texts; max98095->eq_enum.items = max98095->eq_textcnt; - ret = snd_soc_add_codec_controls(codec, controls, ARRAY_SIZE(controls)); + ret = snd_soc_add_component_controls(component, controls, ARRAY_SIZE(controls)); if (ret != 0) - dev_err(codec->dev, "Failed to add EQ control: %d\n", ret); + dev_err(component->dev, "Failed to add EQ control: %d\n", ret); } static const char *bq_mode_name[] = {"Biquad1 Mode", "Biquad2 Mode"}; -static int max98095_get_bq_channel(struct snd_soc_codec *codec, +static int max98095_get_bq_channel(struct snd_soc_component *component, const char *name) { int i; @@ -1641,17 +1641,17 @@ static int max98095_get_bq_channel(struct snd_soc_codec *codec, return i; /* Shouldn't happen */ - dev_err(codec->dev, "Bad biquad channel name '%s'\n", name); + dev_err(component->dev, "Bad biquad channel name '%s'\n", name); return -EINVAL; } static int max98095_put_bq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_pdata *pdata = max98095->pdata; - int channel = max98095_get_bq_channel(codec, kcontrol->id.name); + int channel = max98095_get_bq_channel(component, kcontrol->id.name); struct max98095_cdata *cdata; unsigned int sel = ucontrol->value.enumerated.item[0]; struct max98095_biquad_cfg *coef_set; @@ -1682,7 +1682,7 @@ static int max98095_put_bq_enum(struct snd_kcontrol *kcontrol, } } - dev_dbg(codec->dev, "Selected %s/%dHz for %dHz sample rate\n", + dev_dbg(component->dev, "Selected %s/%dHz for %dHz sample rate\n", pdata->bq_cfg[best].name, pdata->bq_cfg[best].rate, fs); @@ -1691,27 +1691,27 @@ static int max98095_put_bq_enum(struct snd_kcontrol *kcontrol, regmask = (channel == 0) ? M98095_BQ1EN : M98095_BQ2EN; /* Disable filter while configuring, and save current on/off state */ - regsave = snd_soc_read(codec, M98095_088_CFG_LEVEL); - snd_soc_update_bits(codec, M98095_088_CFG_LEVEL, regmask, 0); + regsave = snd_soc_component_read32(component, M98095_088_CFG_LEVEL); + snd_soc_component_update_bits(component, M98095_088_CFG_LEVEL, regmask, 0); mutex_lock(&max98095->lock); - snd_soc_update_bits(codec, M98095_00F_HOST_CFG, M98095_SEG, M98095_SEG); - m98095_biquad_band(codec, channel, 0, coef_set->band1); - m98095_biquad_band(codec, channel, 1, coef_set->band2); - snd_soc_update_bits(codec, M98095_00F_HOST_CFG, M98095_SEG, 0); + snd_soc_component_update_bits(component, M98095_00F_HOST_CFG, M98095_SEG, M98095_SEG); + m98095_biquad_band(component, channel, 0, coef_set->band1); + m98095_biquad_band(component, channel, 1, coef_set->band2); + snd_soc_component_update_bits(component, M98095_00F_HOST_CFG, M98095_SEG, 0); mutex_unlock(&max98095->lock); /* Restore the original on/off state */ - snd_soc_update_bits(codec, M98095_088_CFG_LEVEL, regmask, regsave); + snd_soc_component_update_bits(component, M98095_088_CFG_LEVEL, regmask, regsave); return 0; } static int max98095_get_bq_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); - int channel = max98095_get_bq_channel(codec, kcontrol->id.name); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); + int channel = max98095_get_bq_channel(component, kcontrol->id.name); struct max98095_cdata *cdata; if (channel < 0) @@ -1723,9 +1723,9 @@ static int max98095_get_bq_enum(struct snd_kcontrol *kcontrol, return 0; } -static void max98095_handle_bq_pdata(struct snd_soc_codec *codec) +static void max98095_handle_bq_pdata(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_pdata *pdata = max98095->pdata; struct max98095_biquad_cfg *cfg; unsigned int cfgcnt; @@ -1779,19 +1779,19 @@ static void max98095_handle_bq_pdata(struct snd_soc_codec *codec) max98095->bq_enum.texts = max98095->bq_texts; max98095->bq_enum.items = max98095->bq_textcnt; - ret = snd_soc_add_codec_controls(codec, controls, ARRAY_SIZE(controls)); + ret = snd_soc_add_component_controls(component, controls, ARRAY_SIZE(controls)); if (ret != 0) - dev_err(codec->dev, "Failed to add Biquad control: %d\n", ret); + dev_err(component->dev, "Failed to add Biquad control: %d\n", ret); } -static void max98095_handle_pdata(struct snd_soc_codec *codec) +static void max98095_handle_pdata(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_pdata *pdata = max98095->pdata; u8 regval = 0; if (!pdata) { - dev_dbg(codec->dev, "No platform data\n"); + dev_dbg(component->dev, "No platform data\n"); return; } @@ -1802,27 +1802,27 @@ static void max98095_handle_pdata(struct snd_soc_codec *codec) if (pdata->digmic_right_mode) regval |= M98095_DIGMIC_R; - snd_soc_write(codec, M98095_087_CFG_MIC, regval); + snd_soc_component_write(component, M98095_087_CFG_MIC, regval); /* Configure equalizers */ if (pdata->eq_cfgcnt) - max98095_handle_eq_pdata(codec); + max98095_handle_eq_pdata(component); /* Configure bi-quad filters */ if (pdata->bq_cfgcnt) - max98095_handle_bq_pdata(codec); + max98095_handle_bq_pdata(component); } static irqreturn_t max98095_report_jack(int irq, void *data) { - struct snd_soc_codec *codec = data; - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = data; + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); unsigned int value; int hp_report = 0; int mic_report = 0; /* Read the Jack Status Register */ - value = snd_soc_read(codec, M98095_007_JACK_AUTO_STS); + value = snd_soc_component_read32(component, M98095_007_JACK_AUTO_STS); /* If ddone is not set, then detection isn't finished yet */ if ((value & M98095_DDONE) == 0) @@ -1853,9 +1853,9 @@ static irqreturn_t max98095_report_jack(int irq, void *data) return IRQ_HANDLED; } -static int max98095_jack_detect_enable(struct snd_soc_codec *codec) +static int max98095_jack_detect_enable(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); int ret = 0; int detect_enable = M98095_JDEN; unsigned int slew = M98095_DEFAULT_SLEW_DELAY; @@ -1866,41 +1866,41 @@ static int max98095_jack_detect_enable(struct snd_soc_codec *codec) if (max98095->pdata->jack_detect_delay) slew = max98095->pdata->jack_detect_delay; - ret = snd_soc_write(codec, M98095_08E_JACK_DC_SLEW, slew); + ret = snd_soc_component_write(component, M98095_08E_JACK_DC_SLEW, slew); if (ret < 0) { - dev_err(codec->dev, "Failed to cfg auto detect %d\n", ret); + dev_err(component->dev, "Failed to cfg auto detect %d\n", ret); return ret; } /* configure auto detection to be enabled */ - ret = snd_soc_write(codec, M98095_089_JACK_DET_AUTO, detect_enable); + ret = snd_soc_component_write(component, M98095_089_JACK_DET_AUTO, detect_enable); if (ret < 0) { - dev_err(codec->dev, "Failed to cfg auto detect %d\n", ret); + dev_err(component->dev, "Failed to cfg auto detect %d\n", ret); return ret; } return ret; } -static int max98095_jack_detect_disable(struct snd_soc_codec *codec) +static int max98095_jack_detect_disable(struct snd_soc_component *component) { int ret = 0; /* configure auto detection to be disabled */ - ret = snd_soc_write(codec, M98095_089_JACK_DET_AUTO, 0x0); + ret = snd_soc_component_write(component, M98095_089_JACK_DET_AUTO, 0x0); if (ret < 0) { - dev_err(codec->dev, "Failed to cfg auto detect %d\n", ret); + dev_err(component->dev, "Failed to cfg auto detect %d\n", ret); return ret; } return ret; } -int max98095_jack_detect(struct snd_soc_codec *codec, +int max98095_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *client = to_i2c_client(codec->dev); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); + struct i2c_client *client = to_i2c_client(component->dev); int ret = 0; max98095->headphone_jack = hp_jack; @@ -1910,44 +1910,44 @@ int max98095_jack_detect(struct snd_soc_codec *codec, if (!hp_jack && !mic_jack) return -EINVAL; - max98095_jack_detect_enable(codec); + max98095_jack_detect_enable(component); /* enable interrupts for headphone jack detection */ - ret = snd_soc_update_bits(codec, M98095_013_JACK_INT_EN, + ret = snd_soc_component_update_bits(component, M98095_013_JACK_INT_EN, M98095_IDDONE, M98095_IDDONE); if (ret < 0) { - dev_err(codec->dev, "Failed to cfg jack irqs %d\n", ret); + dev_err(component->dev, "Failed to cfg jack irqs %d\n", ret); return ret; } - max98095_report_jack(client->irq, codec); + max98095_report_jack(client->irq, component); return 0; } EXPORT_SYMBOL_GPL(max98095_jack_detect); #ifdef CONFIG_PM -static int max98095_suspend(struct snd_soc_codec *codec) +static int max98095_suspend(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); if (max98095->headphone_jack || max98095->mic_jack) - max98095_jack_detect_disable(codec); + max98095_jack_detect_disable(component); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); return 0; } -static int max98095_resume(struct snd_soc_codec *codec) +static int max98095_resume(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *client = to_i2c_client(codec->dev); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); + struct i2c_client *client = to_i2c_client(component->dev); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); if (max98095->headphone_jack || max98095->mic_jack) { - max98095_jack_detect_enable(codec); - max98095_report_jack(client->irq, codec); + max98095_jack_detect_enable(component); + max98095_report_jack(client->irq, component); } return 0; @@ -1957,30 +1957,30 @@ static int max98095_resume(struct snd_soc_codec *codec) #define max98095_resume NULL #endif -static int max98095_reset(struct snd_soc_codec *codec) +static int max98095_reset(struct snd_soc_component *component) { int i, ret; /* Gracefully reset the DSP core and the codec hardware * in a proper sequence */ - ret = snd_soc_write(codec, M98095_00F_HOST_CFG, 0); + ret = snd_soc_component_write(component, M98095_00F_HOST_CFG, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to reset DSP: %d\n", ret); + dev_err(component->dev, "Failed to reset DSP: %d\n", ret); return ret; } - ret = snd_soc_write(codec, M98095_097_PWR_SYS, 0); + ret = snd_soc_component_write(component, M98095_097_PWR_SYS, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to reset codec: %d\n", ret); + dev_err(component->dev, "Failed to reset component: %d\n", ret); return ret; } /* Reset to hardware default for registers, as there is not * a soft reset hardware control register */ for (i = M98095_010_HOST_INT_CFG; i < M98095_REG_MAX_CACHED; i++) { - ret = snd_soc_write(codec, i, snd_soc_read(codec, i)); + ret = snd_soc_component_write(component, i, snd_soc_component_read32(component, i)); if (ret < 0) { - dev_err(codec->dev, "Failed to reset: %d\n", ret); + dev_err(component->dev, "Failed to reset: %d\n", ret); return ret; } } @@ -1988,21 +1988,21 @@ static int max98095_reset(struct snd_soc_codec *codec) return ret; } -static int max98095_probe(struct snd_soc_codec *codec) +static int max98095_probe(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); struct max98095_cdata *cdata; struct i2c_client *client; int ret = 0; - max98095->mclk = devm_clk_get(codec->dev, "mclk"); + max98095->mclk = devm_clk_get(component->dev, "mclk"); if (PTR_ERR(max98095->mclk) == -EPROBE_DEFER) return -EPROBE_DEFER; /* reset the codec, the DSP core, and disable all interrupts */ - max98095_reset(codec); + max98095_reset(component); - client = to_i2c_client(codec->dev); + client = to_i2c_client(component->dev); /* initialize private data */ @@ -2037,85 +2037,85 @@ static int max98095_probe(struct snd_soc_codec *codec) ret = request_threaded_irq(client->irq, NULL, max98095_report_jack, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | - IRQF_ONESHOT, "max98095", codec); + IRQF_ONESHOT, "max98095", component); if (ret) { - dev_err(codec->dev, "Failed to request IRQ: %d\n", ret); + dev_err(component->dev, "Failed to request IRQ: %d\n", ret); goto err_access; } } - ret = snd_soc_read(codec, M98095_0FF_REV_ID); + ret = snd_soc_component_read32(component, M98095_0FF_REV_ID); if (ret < 0) { - dev_err(codec->dev, "Failure reading hardware revision: %d\n", + dev_err(component->dev, "Failure reading hardware revision: %d\n", ret); goto err_irq; } - dev_info(codec->dev, "Hardware revision: %c\n", ret - 0x40 + 'A'); + dev_info(component->dev, "Hardware revision: %c\n", ret - 0x40 + 'A'); - snd_soc_write(codec, M98095_097_PWR_SYS, M98095_PWRSV); + snd_soc_component_write(component, M98095_097_PWR_SYS, M98095_PWRSV); - snd_soc_write(codec, M98095_048_MIX_DAC_LR, + snd_soc_component_write(component, M98095_048_MIX_DAC_LR, M98095_DAI1L_TO_DACL|M98095_DAI1R_TO_DACR); - snd_soc_write(codec, M98095_049_MIX_DAC_M, + snd_soc_component_write(component, M98095_049_MIX_DAC_M, M98095_DAI2M_TO_DACM|M98095_DAI3M_TO_DACM); - snd_soc_write(codec, M98095_092_PWR_EN_OUT, M98095_SPK_SPREADSPECTRUM); - snd_soc_write(codec, M98095_045_CFG_DSP, M98095_DSPNORMAL); - snd_soc_write(codec, M98095_04E_CFG_HP, M98095_HPNORMAL); + snd_soc_component_write(component, M98095_092_PWR_EN_OUT, M98095_SPK_SPREADSPECTRUM); + snd_soc_component_write(component, M98095_045_CFG_DSP, M98095_DSPNORMAL); + snd_soc_component_write(component, M98095_04E_CFG_HP, M98095_HPNORMAL); - snd_soc_write(codec, M98095_02C_DAI1_IOCFG, + snd_soc_component_write(component, M98095_02C_DAI1_IOCFG, M98095_S1NORMAL|M98095_SDATA); - snd_soc_write(codec, M98095_036_DAI2_IOCFG, + snd_soc_component_write(component, M98095_036_DAI2_IOCFG, M98095_S2NORMAL|M98095_SDATA); - snd_soc_write(codec, M98095_040_DAI3_IOCFG, + snd_soc_component_write(component, M98095_040_DAI3_IOCFG, M98095_S3NORMAL|M98095_SDATA); - max98095_handle_pdata(codec); + max98095_handle_pdata(component); /* take the codec out of the shut down */ - snd_soc_update_bits(codec, M98095_097_PWR_SYS, M98095_SHDNRUN, + snd_soc_component_update_bits(component, M98095_097_PWR_SYS, M98095_SHDNRUN, M98095_SHDNRUN); return 0; err_irq: if (client->irq) - free_irq(client->irq, codec); + free_irq(client->irq, component); err_access: return ret; } -static int max98095_remove(struct snd_soc_codec *codec) +static void max98095_remove(struct snd_soc_component *component) { - struct max98095_priv *max98095 = snd_soc_codec_get_drvdata(codec); - struct i2c_client *client = to_i2c_client(codec->dev); + struct max98095_priv *max98095 = snd_soc_component_get_drvdata(component); + struct i2c_client *client = to_i2c_client(component->dev); if (max98095->headphone_jack || max98095->mic_jack) - max98095_jack_detect_disable(codec); + max98095_jack_detect_disable(component); if (client->irq) - free_irq(client->irq, codec); - - return 0; + free_irq(client->irq, component); } -static const struct snd_soc_codec_driver soc_codec_dev_max98095 = { - .probe = max98095_probe, - .remove = max98095_remove, - .suspend = max98095_suspend, - .resume = max98095_resume, - .set_bias_level = max98095_set_bias_level, - .component_driver = { - .controls = max98095_snd_controls, - .num_controls = ARRAY_SIZE(max98095_snd_controls), - .dapm_widgets = max98095_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98095_dapm_widgets), - .dapm_routes = max98095_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98095_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_max98095 = { + .probe = max98095_probe, + .remove = max98095_remove, + .suspend = max98095_suspend, + .resume = max98095_resume, + .set_bias_level = max98095_set_bias_level, + .controls = max98095_snd_controls, + .num_controls = ARRAY_SIZE(max98095_snd_controls), + .dapm_widgets = max98095_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98095_dapm_widgets), + .dapm_routes = max98095_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98095_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int max98095_i2c_probe(struct i2c_client *i2c, @@ -2142,17 +2142,12 @@ static int max98095_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, max98095); max98095->pdata = i2c->dev.platform_data; - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_max98095, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98095, max98095_dai, ARRAY_SIZE(max98095_dai)); return ret; } -static int max98095_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98095_i2c_id[] = { { "max98095", MAX98095 }, { } @@ -2171,7 +2166,6 @@ static struct i2c_driver max98095_i2c_driver = { .of_match_table = of_match_ptr(max98095_of_match), }, .probe = max98095_i2c_probe, - .remove = max98095_i2c_remove, .id_table = max98095_i2c_id, }; diff --git a/sound/soc/codecs/max98095.h b/sound/soc/codecs/max98095.h index 2ebbe4e894bf..67886cacddb2 100644 --- a/sound/soc/codecs/max98095.h +++ b/sound/soc/codecs/max98095.h @@ -315,7 +315,7 @@ /* Default Delay used in Slew Rate Calculation for Jack detection */ #define M98095_DEFAULT_SLEW_DELAY 0x18 -extern int max98095_jack_detect(struct snd_soc_codec *codec, +extern int max98095_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack); #endif diff --git a/sound/soc/codecs/max98357a.c b/sound/soc/codecs/max98357a.c index 426ed2dae6ca..d469576b5a7b 100644 --- a/sound/soc/codecs/max98357a.c +++ b/sound/soc/codecs/max98357a.c @@ -59,27 +59,29 @@ static const struct snd_soc_dapm_route max98357a_dapm_routes[] = { {"Speaker", NULL, "HiFi Playback"}, }; -static int max98357a_codec_probe(struct snd_soc_codec *codec) +static int max98357a_component_probe(struct snd_soc_component *component) { struct gpio_desc *sdmode; - sdmode = devm_gpiod_get_optional(codec->dev, "sdmode", GPIOD_OUT_LOW); + sdmode = devm_gpiod_get_optional(component->dev, "sdmode", GPIOD_OUT_LOW); if (IS_ERR(sdmode)) return PTR_ERR(sdmode); - snd_soc_codec_set_drvdata(codec, sdmode); + snd_soc_component_set_drvdata(component, sdmode); return 0; } -static const struct snd_soc_codec_driver max98357a_codec_driver = { - .probe = max98357a_codec_probe, - .component_driver = { - .dapm_widgets = max98357a_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98357a_dapm_widgets), - .dapm_routes = max98357a_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(max98357a_dapm_routes), - }, +static const struct snd_soc_component_driver max98357a_component_driver = { + .probe = max98357a_component_probe, + .dapm_widgets = max98357a_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98357a_dapm_widgets), + .dapm_routes = max98357a_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(max98357a_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct snd_soc_dai_ops max98357a_dai_ops = { @@ -107,14 +109,13 @@ static struct snd_soc_dai_driver max98357a_dai_driver = { static int max98357a_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &max98357a_codec_driver, + return devm_snd_soc_register_component(&pdev->dev, + &max98357a_component_driver, &max98357a_dai_driver, 1); } static int max98357a_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); - return 0; } diff --git a/sound/soc/codecs/max98371.c b/sound/soc/codecs/max98371.c index 7bc2a17c1e94..d4ba1392aaf8 100644 --- a/sound/soc/codecs/max98371.c +++ b/sound/soc/codecs/max98371.c @@ -187,15 +187,15 @@ static const struct snd_kcontrol_new max98371_snd_controls[] = { static int max98371_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98371_priv *max98371 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98371_priv *max98371 = snd_soc_component_get_drvdata(component); unsigned int val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: break; default: - dev_err(codec->dev, "DAI clock mode unsupported"); + dev_err(component->dev, "DAI clock mode unsupported"); return -EINVAL; } @@ -210,7 +210,7 @@ static int max98371_dai_set_fmt(struct snd_soc_dai *codec_dai, val |= MAX98371_DAI_LEFT; break; default: - dev_err(codec->dev, "DAI wrong mode unsupported"); + dev_err(component->dev, "DAI wrong mode unsupported"); return -EINVAL; } regmap_update_bits(max98371->regmap, MAX98371_FMT, @@ -222,8 +222,8 @@ static int max98371_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98371_priv *max98371 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98371_priv *max98371 = snd_soc_component_get_drvdata(component); int blr_clk_ratio, ch_size, channels = params_channels(params); int rate = params_rate(params); @@ -348,15 +348,17 @@ static struct snd_soc_dai_driver max98371_dai[] = { } }; -static const struct snd_soc_codec_driver max98371_codec = { - .component_driver = { - .controls = max98371_snd_controls, - .num_controls = ARRAY_SIZE(max98371_snd_controls), - .dapm_routes = max98371_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98371_audio_map), - .dapm_widgets = max98371_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98371_dapm_widgets), - }, +static const struct snd_soc_component_driver max98371_component = { + .controls = max98371_snd_controls, + .num_controls = ARRAY_SIZE(max98371_snd_controls), + .dapm_routes = max98371_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98371_audio_map), + .dapm_widgets = max98371_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98371_dapm_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98371_regmap = { @@ -397,21 +399,15 @@ static int max98371_i2c_probe(struct i2c_client *i2c, } dev_info(&i2c->dev, "device version %x\n", reg); - ret = snd_soc_register_codec(&i2c->dev, &max98371_codec, + ret = devm_snd_soc_register_component(&i2c->dev, &max98371_component, max98371_dai, ARRAY_SIZE(max98371_dai)); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } return ret; } -static int max98371_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98371_i2c_id[] = { { "max98371", 0 }, { } @@ -432,7 +428,6 @@ static struct i2c_driver max98371_i2c_driver = { .of_match_table = of_match_ptr(max98371_of_match), }, .probe = max98371_i2c_probe, - .remove = max98371_i2c_remove, .id_table = max98371_i2c_id, }; diff --git a/sound/soc/codecs/max98371.h b/sound/soc/codecs/max98371.h index 9f6330964d98..06e9ba784e0b 100644 --- a/sound/soc/codecs/max98371.h +++ b/sound/soc/codecs/max98371.h @@ -62,6 +62,5 @@ struct max98371_priv { struct regmap *regmap; - struct snd_soc_codec *codec; }; #endif diff --git a/sound/soc/codecs/max98373.c b/sound/soc/codecs/max98373.c index 562e88765129..a92586106932 100644 --- a/sound/soc/codecs/max98373.c +++ b/sound/soc/codecs/max98373.c @@ -112,12 +112,12 @@ static struct reg_default max98373_reg[] = { static int max98373_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); unsigned int format = 0; unsigned int invert = 0; - dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); + dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: @@ -126,7 +126,7 @@ static int max98373_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) invert = MAX98373_PCM_MODE_CFG_PCM_BCLKEDGE; break; default: - dev_err(codec->dev, "DAI invert mode unsupported\n"); + dev_err(component->dev, "DAI invert mode unsupported\n"); return -EINVAL; } @@ -177,10 +177,10 @@ static int max98373_get_bclk_sel(int bclk) return 0; } -static int max98373_set_clock(struct snd_soc_codec *codec, +static int max98373_set_clock(struct snd_soc_component *component, struct snd_pcm_hw_params *params) { - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); /* BCLK/LRCLK ratio calculation */ int blr_clk_ratio = params_channels(params) * max98373->ch_size; int value; @@ -189,7 +189,7 @@ static int max98373_set_clock(struct snd_soc_codec *codec, /* BCLK configuration */ value = max98373_get_bclk_sel(blr_clk_ratio); if (!value) { - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", params_format(params)); return -EINVAL; } @@ -206,8 +206,8 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); unsigned int sampling_rate = 0; unsigned int chan_sz = 0; @@ -223,7 +223,7 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, chan_sz = MAX98373_PCM_MODE_CFG_CHANSZ_32; break; default: - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", params_format(params)); goto err; } @@ -234,7 +234,7 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, MAX98373_R2024_PCM_DATA_FMT_CFG, MAX98373_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); - dev_dbg(codec->dev, "format supported %d", + dev_dbg(component->dev, "format supported %d", params_format(params)); /* sampling rate configuration */ @@ -267,7 +267,7 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, sampling_rate = MAX98373_PCM_SR_SET1_SR_48000; break; default: - dev_err(codec->dev, "rate %d not supported\n", + dev_err(component->dev, "rate %d not supported\n", params_rate(params)); goto err; } @@ -295,7 +295,7 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, MAX98373_PCM_SR_SET2_IVADC_SR_MASK, sampling_rate); - return max98373_set_clock(codec, params); + return max98373_set_clock(component, params); err: return -EINVAL; } @@ -304,8 +304,8 @@ static int max98373_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); int bsel = 0; unsigned int chan_sz = 0; unsigned int mask; @@ -319,7 +319,7 @@ static int max98373_dai_tdm_slot(struct snd_soc_dai *dai, /* BCLK configuration */ bsel = max98373_get_bclk_sel(slots * slot_width); if (bsel == 0) { - dev_err(codec->dev, "BCLK %d not supported\n", + dev_err(component->dev, "BCLK %d not supported\n", slots * slot_width); return -EINVAL; } @@ -341,7 +341,7 @@ static int max98373_dai_tdm_slot(struct snd_soc_dai *dai, chan_sz = MAX98373_PCM_MODE_CFG_CHANSZ_32; break; default: - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", slot_width); return -EINVAL; } @@ -394,8 +394,8 @@ static const struct snd_soc_dai_ops max98373_dai_ops = { static int max98373_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -721,11 +721,9 @@ static struct snd_soc_dai_driver max98373_dai[] = { } }; -static int max98373_probe(struct snd_soc_codec *codec) +static int max98373_probe(struct snd_soc_component *component) { - struct max98373_priv *max98373 = snd_soc_codec_get_drvdata(codec); - - codec->control_data = max98373->regmap; + struct max98373_priv *max98373 = snd_soc_component_get_drvdata(component); /* Software Reset */ regmap_write(max98373->regmap, @@ -828,16 +826,18 @@ static const struct dev_pm_ops max98373_pm = { SET_SYSTEM_SLEEP_PM_OPS(max98373_suspend, max98373_resume) }; -static const struct snd_soc_codec_driver soc_codec_dev_max98373 = { - .probe = max98373_probe, - .component_driver = { - .controls = max98373_snd_controls, - .num_controls = ARRAY_SIZE(max98373_snd_controls), - .dapm_widgets = max98373_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98373_dapm_widgets), - .dapm_routes = max98373_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98373_audio_map), - }, +static const struct snd_soc_component_driver soc_codec_dev_max98373 = { + .probe = max98373_probe, + .controls = max98373_snd_controls, + .num_controls = ARRAY_SIZE(max98373_snd_controls), + .dapm_widgets = max98373_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98373_dapm_widgets), + .dapm_routes = max98373_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98373_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98373_regmap = { @@ -920,7 +920,7 @@ static int max98373_i2c_probe(struct i2c_client *i2c, max98373_slot_config(i2c, max98373); /* codec registeration */ - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_max98373, + ret = devm_snd_soc_register_component(&i2c->dev, &soc_codec_dev_max98373, max98373_dai, ARRAY_SIZE(max98373_dai)); if (ret < 0) dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); @@ -928,12 +928,6 @@ static int max98373_i2c_probe(struct i2c_client *i2c, return ret; } -static int max98373_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98373_i2c_id[] = { { "max98373", 0}, { }, @@ -965,7 +959,6 @@ static struct i2c_driver max98373_i2c_driver = { .pm = &max98373_pm, }, .probe = max98373_i2c_probe, - .remove = max98373_i2c_remove, .id_table = max98373_i2c_id, }; diff --git a/sound/soc/codecs/max9850.c b/sound/soc/codecs/max9850.c index a3dfc918c278..74d7f52c7e73 100644 --- a/sound/soc/codecs/max9850.c +++ b/sound/soc/codecs/max9850.c @@ -130,8 +130,8 @@ static int max9850_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max9850_priv *max9850 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9850_priv *max9850 = snd_soc_component_get_drvdata(component); u64 lrclk_div; u8 sf, da; @@ -139,14 +139,14 @@ static int max9850_hw_params(struct snd_pcm_substream *substream, return -EINVAL; /* lrclk_div = 2^22 * rate / iclk with iclk = mclk / sf */ - sf = (snd_soc_read(codec, MAX9850_CLOCK) >> 2) + 1; + sf = (snd_soc_component_read32(component, MAX9850_CLOCK) >> 2) + 1; lrclk_div = (1 << 22); lrclk_div *= params_rate(params); lrclk_div *= sf; do_div(lrclk_div, max9850->sysclk); - snd_soc_write(codec, MAX9850_LRCLK_MSB, (lrclk_div >> 8) & 0x7f); - snd_soc_write(codec, MAX9850_LRCLK_LSB, lrclk_div & 0xff); + snd_soc_component_write(component, MAX9850_LRCLK_MSB, (lrclk_div >> 8) & 0x7f); + snd_soc_component_write(component, MAX9850_LRCLK_LSB, lrclk_div & 0xff); switch (params_width(params)) { case 16: @@ -161,7 +161,7 @@ static int max9850_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } - snd_soc_update_bits(codec, MAX9850_DIGITAL_AUDIO, 0x3, da); + snd_soc_component_update_bits(component, MAX9850_DIGITAL_AUDIO, 0x3, da); return 0; } @@ -169,16 +169,16 @@ static int max9850_hw_params(struct snd_pcm_substream *substream, static int max9850_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max9850_priv *max9850 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max9850_priv *max9850 = snd_soc_component_get_drvdata(component); /* calculate mclk -> iclk divider */ if (freq <= 13000000) - snd_soc_write(codec, MAX9850_CLOCK, 0x0); + snd_soc_component_write(component, MAX9850_CLOCK, 0x0); else if (freq <= 26000000) - snd_soc_write(codec, MAX9850_CLOCK, 0x4); + snd_soc_component_write(component, MAX9850_CLOCK, 0x4); else if (freq <= 40000000) - snd_soc_write(codec, MAX9850_CLOCK, 0x8); + snd_soc_component_write(component, MAX9850_CLOCK, 0x8); else return -EINVAL; @@ -188,7 +188,7 @@ static int max9850_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int max9850_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 da = 0; /* set master/slave audio interface */ @@ -234,15 +234,15 @@ static int max9850_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) } /* set da */ - snd_soc_write(codec, MAX9850_DIGITAL_AUDIO, da); + snd_soc_component_write(component, MAX9850_DIGITAL_AUDIO, da); return 0; } -static int max9850_set_bias_level(struct snd_soc_codec *codec, +static int max9850_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct max9850_priv *max9850 = snd_soc_codec_get_drvdata(codec); + struct max9850_priv *max9850 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -251,10 +251,10 @@ static int max9850_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { ret = regcache_sync(max9850->regmap); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to sync cache: %d\n", ret); return ret; } @@ -289,31 +289,32 @@ static struct snd_soc_dai_driver max9850_dai = { .ops = &max9850_dai_ops, }; -static int max9850_probe(struct snd_soc_codec *codec) +static int max9850_probe(struct snd_soc_component *component) { /* enable zero-detect */ - snd_soc_update_bits(codec, MAX9850_GENERAL_PURPOSE, 1, 1); + snd_soc_component_update_bits(component, MAX9850_GENERAL_PURPOSE, 1, 1); /* enable slew-rate control */ - snd_soc_update_bits(codec, MAX9850_VOLUME, 0x40, 0x40); + snd_soc_component_update_bits(component, MAX9850_VOLUME, 0x40, 0x40); /* set slew-rate 125ms */ - snd_soc_update_bits(codec, MAX9850_CHARGE_PUMP, 0xff, 0xc0); + snd_soc_component_update_bits(component, MAX9850_CHARGE_PUMP, 0xff, 0xc0); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_max9850 = { - .probe = max9850_probe, - .set_bias_level = max9850_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = max9850_controls, - .num_controls = ARRAY_SIZE(max9850_controls), - .dapm_widgets = max9850_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max9850_dapm_widgets), - .dapm_routes = max9850_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(max9850_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_max9850 = { + .probe = max9850_probe, + .set_bias_level = max9850_set_bias_level, + .controls = max9850_controls, + .num_controls = ARRAY_SIZE(max9850_controls), + .dapm_widgets = max9850_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max9850_dapm_widgets), + .dapm_routes = max9850_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(max9850_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int max9850_i2c_probe(struct i2c_client *i2c, @@ -333,17 +334,11 @@ static int max9850_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, max9850); - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_max9850, &max9850_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max9850, &max9850_dai, 1); return ret; } -static int max9850_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max9850_i2c_id[] = { { "max9850", 0 }, { } @@ -355,7 +350,6 @@ static struct i2c_driver max9850_i2c_driver = { .name = "max9850", }, .probe = max9850_i2c_probe, - .remove = max9850_i2c_remove, .id_table = max9850_i2c_id, }; diff --git a/sound/soc/codecs/max9860.c b/sound/soc/codecs/max9860.c index a2dc6a47f466..5bbf889ad98e 100644 --- a/sound/soc/codecs/max9860.c +++ b/sound/soc/codecs/max9860.c @@ -261,8 +261,8 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max9860_priv *max9860 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component); u8 master; u8 ifc1a = 0; u8 ifc1b = 0; @@ -270,7 +270,7 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, unsigned long n; int ret; - dev_dbg(codec->dev, "hw_params %u Hz, %u channels\n", + dev_dbg(component->dev, "hw_params %u Hz, %u channels\n", params_rate(params), params_channels(params)); @@ -306,7 +306,7 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, break; case SND_SOC_DAIFMT_DSP_A: if (params_width(params) != 16) { - dev_err(codec->dev, + dev_err(component->dev, "DSP_A works for 16 bits per sample only.\n"); return -EINVAL; } @@ -315,7 +315,7 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, break; case SND_SOC_DAIFMT_DSP_B: if (params_width(params) != 16) { - dev_err(codec->dev, + dev_err(component->dev, "DSP_B works for 16 bits per sample only.\n"); return -EINVAL; } @@ -352,16 +352,16 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - dev_dbg(codec->dev, "IFC1A %02x\n", ifc1a); + dev_dbg(component->dev, "IFC1A %02x\n", ifc1a); ret = regmap_write(max9860->regmap, MAX9860_IFC1A, ifc1a); if (ret) { - dev_err(codec->dev, "Failed to set IFC1A: %d\n", ret); + dev_err(component->dev, "Failed to set IFC1A: %d\n", ret); return ret; } - dev_dbg(codec->dev, "IFC1B %02x\n", ifc1b); + dev_dbg(component->dev, "IFC1B %02x\n", ifc1b); ret = regmap_write(max9860->regmap, MAX9860_IFC1B, ifc1b); if (ret) { - dev_err(codec->dev, "Failed to set IFC1B: %d\n", ret); + dev_err(component->dev, "Failed to set IFC1B: %d\n", ret); return ret; } @@ -417,33 +417,33 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, } sysclk |= max9860->psclk; - dev_dbg(codec->dev, "SYSCLK %02x\n", sysclk); + dev_dbg(component->dev, "SYSCLK %02x\n", sysclk); ret = regmap_write(max9860->regmap, MAX9860_SYSCLK, sysclk); if (ret) { - dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); + dev_err(component->dev, "Failed to set SYSCLK: %d\n", ret); return ret; } - dev_dbg(codec->dev, "N %lu\n", n); + dev_dbg(component->dev, "N %lu\n", n); ret = regmap_write(max9860->regmap, MAX9860_AUDIOCLKHIGH, n >> 8); if (ret) { - dev_err(codec->dev, "Failed to set NHI: %d\n", ret); + dev_err(component->dev, "Failed to set NHI: %d\n", ret); return ret; } ret = regmap_write(max9860->regmap, MAX9860_AUDIOCLKLOW, n & 0xff); if (ret) { - dev_err(codec->dev, "Failed to set NLO: %d\n", ret); + dev_err(component->dev, "Failed to set NLO: %d\n", ret); return ret; } if (!master) { - dev_dbg(codec->dev, "Enable PLL\n"); + dev_dbg(component->dev, "Enable PLL\n"); ret = regmap_update_bits(max9860->regmap, MAX9860_AUDIOCLKHIGH, MAX9860_PLL, MAX9860_PLL); if (ret) { - dev_err(codec->dev, "Failed to enable PLL: %d\n", ret); + dev_err(component->dev, "Failed to enable PLL: %d\n", ret); return ret; } } @@ -453,8 +453,8 @@ static int max9860_hw_params(struct snd_pcm_substream *substream, static int max9860_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct max9860_priv *max9860 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9860_priv *max9860 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -500,10 +500,10 @@ static struct snd_soc_dai_driver max9860_dai = { .symmetric_rates = 1, }; -static int max9860_set_bias_level(struct snd_soc_codec *codec, +static int max9860_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct max9860_priv *max9860 = dev_get_drvdata(codec->dev); + struct max9860_priv *max9860 = dev_get_drvdata(component->dev); int ret; switch (level) { @@ -515,7 +515,7 @@ static int max9860_set_bias_level(struct snd_soc_codec *codec, ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN, MAX9860_SHDN, MAX9860_SHDN); if (ret) { - dev_err(codec->dev, "Failed to remove SHDN: %d\n", ret); + dev_err(component->dev, "Failed to remove SHDN: %d\n", ret); return ret; } break; @@ -524,7 +524,7 @@ static int max9860_set_bias_level(struct snd_soc_codec *codec, ret = regmap_update_bits(max9860->regmap, MAX9860_PWRMAN, MAX9860_SHDN, 0); if (ret) { - dev_err(codec->dev, "Failed to request SHDN: %d\n", + dev_err(component->dev, "Failed to request SHDN: %d\n", ret); return ret; } @@ -534,18 +534,17 @@ static int max9860_set_bias_level(struct snd_soc_codec *codec, return 0; } -static const struct snd_soc_codec_driver max9860_codec_driver = { - .set_bias_level = max9860_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = max9860_controls, - .num_controls = ARRAY_SIZE(max9860_controls), - .dapm_widgets = max9860_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max9860_dapm_widgets), - .dapm_routes = max9860_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(max9860_dapm_routes), - }, +static const struct snd_soc_component_driver max9860_component_driver = { + .set_bias_level = max9860_set_bias_level, + .controls = max9860_controls, + .num_controls = ARRAY_SIZE(max9860_controls), + .dapm_widgets = max9860_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max9860_dapm_widgets), + .dapm_routes = max9860_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(max9860_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; #ifdef CONFIG_PM @@ -698,7 +697,7 @@ static int max9860_probe(struct i2c_client *i2c, pm_runtime_enable(dev); pm_runtime_idle(dev); - ret = snd_soc_register_codec(dev, &max9860_codec_driver, + ret = devm_snd_soc_register_component(dev, &max9860_component_driver, &max9860_dai, 1); if (ret) { dev_err(dev, "Failed to register CODEC: %d\n", ret); @@ -719,7 +718,6 @@ static int max9860_remove(struct i2c_client *i2c) struct device *dev = &i2c->dev; struct max9860_priv *max9860 = dev_get_drvdata(dev); - snd_soc_unregister_codec(dev); pm_runtime_disable(dev); regulator_disable(max9860->dvddio); return 0; diff --git a/sound/soc/codecs/max9867.c b/sound/soc/codecs/max9867.c index 2f60924fe919..4ea3287162ad 100644 --- a/sound/soc/codecs/max9867.c +++ b/sound/soc/codecs/max9867.c @@ -179,8 +179,8 @@ static inline int get_ni_value(int mclk, int rate) static int max9867_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component); unsigned int ni_h, ni_l; int value; @@ -227,7 +227,7 @@ static int max9867_dai_hw_params(struct snd_pcm_substream *substream, bclk_value = MAX9867_IFC1B_PCLK_16; break; default: - dev_err(codec->dev, + dev_err(component->dev, "unsupported sampling rate\n"); return -EINVAL; } @@ -239,7 +239,7 @@ static int max9867_dai_hw_params(struct snd_pcm_substream *substream, bclk_value = MAX9867_IFC1B_32BIT; break; default: - dev_err(codec->dev, "unsupported sampling rate\n"); + dev_err(component->dev, "unsupported sampling rate\n"); return -EINVAL; } regmap_update_bits(max9867->regmap, MAX9867_IFC1B, @@ -251,8 +251,8 @@ static int max9867_dai_hw_params(struct snd_pcm_substream *substream, static int max9867_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component); regmap_update_bits(max9867->regmap, MAX9867_PWRMAN, MAX9867_SHTDOWN_MASK, MAX9867_SHTDOWN_MASK); @@ -261,8 +261,8 @@ static int max9867_prepare(struct snd_pcm_substream *substream, static int max9867_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component); if (mute) regmap_update_bits(max9867->regmap, MAX9867_DACLEVEL, @@ -276,8 +276,8 @@ static int max9867_mute(struct snd_soc_dai *dai, int mute) static int max9867_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component); int value = 0; /* Set the prescaler based on the master clock frequency*/ @@ -291,7 +291,9 @@ static int max9867_set_dai_sysclk(struct snd_soc_dai *codec_dai, value |= MAX9867_PSCLK_40_60; max9867->pclk = freq/4; } else { - pr_err("bad clock frequency %d", freq); + dev_err(component->dev, + "Invalid clock frequency %uHz (required 10-60MHz)\n", + freq); return -EINVAL; } value = value << MAX9867_PSCLK_SHIFT; @@ -306,8 +308,8 @@ static int max9867_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int max9867_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component); u8 iface1A = 0, iface1B = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -323,10 +325,16 @@ static int max9867_dai_set_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - /* for i2s compatible mode */ - iface1A |= MAX9867_I2S_DLY; - /* SDOUT goes to hiz state after all data is transferred */ - iface1A |= MAX9867_SDOUT_HIZ; + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_I2S: + iface1A |= MAX9867_I2S_DLY; + break; + case SND_SOC_DAIFMT_DSP_A: + iface1A |= MAX9867_TDM_MODE | MAX9867_SDOUT_HIZ; + break; + default: + return -EINVAL; + } /* Clock inversion bits, BCI and WCI */ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { @@ -367,19 +375,20 @@ static struct snd_soc_dai_driver max9867_dai[] = { .name = "max9867-aif1", .playback = { .stream_name = "HiFi Playback", - .channels_min = 1, + .channels_min = 2, .channels_max = 2, .rates = MAX9867_RATES, .formats = MAX9867_FORMATS, }, .capture = { .stream_name = "HiFi Capture", - .channels_min = 1, + .channels_min = 2, .channels_max = 2, .rates = MAX9867_RATES, .formats = MAX9867_FORMATS, }, .ops = &max9867_dai_ops, + .symmetric_rates = 1, } }; @@ -404,25 +413,17 @@ static int max9867_resume(struct device *dev) } #endif -static int max9867_probe(struct snd_soc_codec *codec) -{ - struct max9867_priv *max9867 = snd_soc_codec_get_drvdata(codec); - - dev_dbg(codec->dev, "max98090_probe\n"); - max9867->codec = codec; - return 0; -} - -static const struct snd_soc_codec_driver max9867_codec = { - .probe = max9867_probe, - .component_driver = { - .controls = max9867_snd_controls, - .num_controls = ARRAY_SIZE(max9867_snd_controls), - .dapm_routes = max9867_audio_map, - .num_dapm_routes = ARRAY_SIZE(max9867_audio_map), - .dapm_widgets = max9867_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max9867_dapm_widgets), - }, +static const struct snd_soc_component_driver max9867_component = { + .controls = max9867_snd_controls, + .num_controls = ARRAY_SIZE(max9867_snd_controls), + .dapm_routes = max9867_audio_map, + .num_dapm_routes = ARRAY_SIZE(max9867_audio_map), + .dapm_widgets = max9867_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max9867_dapm_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static bool max9867_volatile_register(struct device *dev, unsigned int reg) @@ -486,8 +487,7 @@ static int max9867_i2c_probe(struct i2c_client *i2c, max9867->regmap = devm_regmap_init_i2c(i2c, &max9867_regmap); if (IS_ERR(max9867->regmap)) { ret = PTR_ERR(max9867->regmap); - dev_err(&i2c->dev, - "Failed to allocate regmap: %d\n", ret); + dev_err(&i2c->dev, "Failed to allocate regmap: %d\n", ret); return ret; } ret = regmap_read(max9867->regmap, @@ -497,21 +497,15 @@ static int max9867_i2c_probe(struct i2c_client *i2c, return ret; } dev_info(&i2c->dev, "device revision: %x\n", reg); - ret = snd_soc_register_codec(&i2c->dev, &max9867_codec, + ret = devm_snd_soc_register_component(&i2c->dev, &max9867_component, max9867_dai, ARRAY_SIZE(max9867_dai)); if (ret < 0) { - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } return ret; } -static int max9867_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max9867_i2c_id[] = { { "max9867", 0 }, { } @@ -535,7 +529,6 @@ static struct i2c_driver max9867_i2c_driver = { .pm = &max9867_pm_ops, }, .probe = max9867_i2c_probe, - .remove = max9867_i2c_remove, .id_table = max9867_i2c_id, }; diff --git a/sound/soc/codecs/max9867.h b/sound/soc/codecs/max9867.h index 65590b4ad62a..55cd9976ff47 100644 --- a/sound/soc/codecs/max9867.h +++ b/sound/soc/codecs/max9867.h @@ -75,7 +75,6 @@ /* codec private data */ struct max9867_priv { struct regmap *regmap; - struct snd_soc_codec *codec; unsigned int sysclk; unsigned int pclk; unsigned int master; diff --git a/sound/soc/codecs/max98925.c b/sound/soc/codecs/max98925.c index 921f95fc396d..29877730a2b0 100644 --- a/sound/soc/codecs/max98925.c +++ b/sound/soc/codecs/max98925.c @@ -99,8 +99,8 @@ static const struct snd_kcontrol_new max98925_dai_sel_mux = static int max98925_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct max98925_priv *max98925 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -256,7 +256,7 @@ static const struct { }, }; -static inline int max98925_rate_value(struct snd_soc_codec *codec, +static inline int max98925_rate_value(struct snd_soc_component *component, int rate, int clock, int *value, int *n, int *m) { int ret = -EINVAL; @@ -297,11 +297,11 @@ static void max98925_set_sense_data(struct max98925_priv *max98925) static int max98925_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98925_priv *max98925 = snd_soc_component_get_drvdata(component); unsigned int invert = 0; - dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); + dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* set DAI to slave mode */ @@ -322,7 +322,7 @@ static int max98925_dai_set_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFM: case SND_SOC_DAIFMT_CBM_CFS: default: - dev_err(codec->dev, "DAI clock mode unsupported"); + dev_err(component->dev, "DAI clock mode unsupported"); return -EINVAL; } @@ -339,7 +339,7 @@ static int max98925_dai_set_fmt(struct snd_soc_dai *codec_dai, invert = M98925_DAI_BCI_MASK | M98925_DAI_WCI_MASK; break; default: - dev_err(codec->dev, "DAI invert mode unsupported"); + dev_err(component->dev, "DAI invert mode unsupported"); return -EINVAL; } @@ -352,7 +352,7 @@ static int max98925_set_clock(struct max98925_priv *max98925, struct snd_pcm_hw_params *params) { unsigned int dai_sr = 0, clock, mdll, n, m; - struct snd_soc_codec *codec = max98925->codec; + struct snd_soc_component *component = max98925->component; int rate = params_rate(params); /* BCLK/LRCLK ratio calculation */ int blr_clk_ratio = params_channels(params) * max98925->ch_size; @@ -395,12 +395,12 @@ static int max98925_set_clock(struct max98925_priv *max98925, mdll = M98925_MDLL_MULT_MCLKx8; break; default: - dev_info(max98925->codec->dev, "unsupported sysclk %d\n", + dev_info(max98925->component->dev, "unsupported sysclk %d\n", max98925->sysclk); return -EINVAL; } - if (max98925_rate_value(codec, rate, clock, &dai_sr, &n, &m)) + if (max98925_rate_value(component, rate, clock, &dai_sr, &n, &m)) return -EINVAL; /* set DAI_SR to correct LRCLK frequency */ @@ -427,8 +427,8 @@ static int max98925_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98925_priv *max98925 = snd_soc_component_get_drvdata(component); switch (params_width(params)) { case 16: @@ -454,7 +454,7 @@ static int max98925_dai_hw_params(struct snd_pcm_substream *substream, __func__, params_format(params)); return -EINVAL; } - dev_dbg(codec->dev, "%s: format supported %d", + dev_dbg(component->dev, "%s: format supported %d", __func__, params_format(params)); return max98925_set_clock(max98925, params); } @@ -462,8 +462,8 @@ static int max98925_dai_hw_params(struct snd_pcm_substream *substream, static int max98925_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98925_priv *max98925 = snd_soc_component_get_drvdata(component); switch (clk_id) { case 0: @@ -516,11 +516,11 @@ static struct snd_soc_dai_driver max98925_dai[] = { } }; -static int max98925_probe(struct snd_soc_codec *codec) +static int max98925_probe(struct snd_soc_component *component) { - struct max98925_priv *max98925 = snd_soc_codec_get_drvdata(codec); + struct max98925_priv *max98925 = snd_soc_component_get_drvdata(component); - max98925->codec = codec; + max98925->component = component; regmap_write(max98925->regmap, MAX98925_GLOBAL_ENABLE, 0x00); /* It's not the default but we need to set DAI_DLY */ regmap_write(max98925->regmap, @@ -538,16 +538,18 @@ static int max98925_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_max98925 = { - .probe = max98925_probe, - .component_driver = { - .controls = max98925_snd_controls, - .num_controls = ARRAY_SIZE(max98925_snd_controls), - .dapm_routes = max98925_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98925_audio_map), - .dapm_widgets = max98925_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98925_dapm_widgets), - }, +static const struct snd_soc_component_driver soc_component_dev_max98925 = { + .probe = max98925_probe, + .controls = max98925_snd_controls, + .num_controls = ARRAY_SIZE(max98925_snd_controls), + .dapm_routes = max98925_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98925_audio_map), + .dapm_widgets = max98925_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98925_dapm_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98925_regmap = { @@ -612,20 +614,15 @@ static int max98925_i2c_probe(struct i2c_client *i2c, dev_info(&i2c->dev, "device version 0x%02X\n", reg); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_max98925, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98925, max98925_dai, ARRAY_SIZE(max98925_dai)); if (ret < 0) dev_err(&i2c->dev, - "Failed to register codec: %d\n", ret); + "Failed to register component: %d\n", ret); return ret; } -static int max98925_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98925_i2c_id[] = { { "max98925", 0 }, { } @@ -645,7 +642,6 @@ static struct i2c_driver max98925_i2c_driver = { .pm = NULL, }, .probe = max98925_i2c_probe, - .remove = max98925_i2c_remove, .id_table = max98925_i2c_id, }; diff --git a/sound/soc/codecs/max98925.h b/sound/soc/codecs/max98925.h index 3783248f2780..96f97085328d 100644 --- a/sound/soc/codecs/max98925.h +++ b/sound/soc/codecs/max98925.h @@ -821,7 +821,7 @@ struct max98925_priv { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct max98925_pdata *pdata; unsigned int sysclk; unsigned int v_slot; diff --git a/sound/soc/codecs/max98926.c b/sound/soc/codecs/max98926.c index 7b1d1b0fa879..d9b1f68f243d 100644 --- a/sound/soc/codecs/max98926.c +++ b/sound/soc/codecs/max98926.c @@ -336,18 +336,18 @@ static void max98926_set_sense_data(struct max98926_priv *max98926) static int max98926_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98926_priv *max98926 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98926_priv *max98926 = snd_soc_component_get_drvdata(component); unsigned int invert = 0; - dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); + dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: max98926_set_sense_data(max98926); break; default: - dev_err(codec->dev, "DAI clock mode unsupported\n"); + dev_err(component->dev, "DAI clock mode unsupported\n"); return -EINVAL; } @@ -364,7 +364,7 @@ static int max98926_dai_set_fmt(struct snd_soc_dai *codec_dai, invert = MAX98926_DAI_BCI_MASK | MAX98926_DAI_WCI_MASK; break; default: - dev_err(codec->dev, "DAI invert mode unsupported\n"); + dev_err(component->dev, "DAI invert mode unsupported\n"); return -EINVAL; } @@ -381,8 +381,8 @@ static int max98926_dai_hw_params(struct snd_pcm_substream *substream, { int dai_sr = -EINVAL; int rate = params_rate(params), i; - struct snd_soc_codec *codec = dai->codec; - struct max98926_priv *max98926 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98926_priv *max98926 = snd_soc_component_get_drvdata(component); int blr_clk_ratio; switch (params_format(params)) { @@ -408,7 +408,7 @@ static int max98926_dai_hw_params(struct snd_pcm_substream *substream, max98926->ch_size = 32; break; default: - dev_dbg(codec->dev, "format unsupported %d\n", + dev_dbg(component->dev, "format unsupported %d\n", params_format(params)); return -EINVAL; } @@ -485,27 +485,29 @@ static struct snd_soc_dai_driver max98926_dai[] = { } }; -static int max98926_probe(struct snd_soc_codec *codec) +static int max98926_probe(struct snd_soc_component *component) { - struct max98926_priv *max98926 = snd_soc_codec_get_drvdata(codec); + struct max98926_priv *max98926 = snd_soc_component_get_drvdata(component); - max98926->codec = codec; + max98926->component = component; /* Hi-Z all the slots */ regmap_write(max98926->regmap, MAX98926_DOUT_HIZ_CFG4, 0xF0); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_max98926 = { - .probe = max98926_probe, - .component_driver = { - .controls = max98926_snd_controls, - .num_controls = ARRAY_SIZE(max98926_snd_controls), - .dapm_routes = max98926_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98926_audio_map), - .dapm_widgets = max98926_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98926_dapm_widgets), - }, +static const struct snd_soc_component_driver soc_component_dev_max98926 = { + .probe = max98926_probe, + .controls = max98926_snd_controls, + .num_controls = ARRAY_SIZE(max98926_snd_controls), + .dapm_routes = max98926_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98926_audio_map), + .dapm_widgets = max98926_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98926_dapm_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98926_regmap = { @@ -563,22 +565,17 @@ static int max98926_i2c_probe(struct i2c_client *i2c, return ret; } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_max98926, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98926, max98926_dai, ARRAY_SIZE(max98926_dai)); if (ret < 0) dev_err(&i2c->dev, - "Failed to register codec: %d\n", ret); + "Failed to register component: %d\n", ret); dev_info(&i2c->dev, "device version: %x\n", reg); err_out: return ret; } -static int max98926_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98926_i2c_id[] = { { "max98926", 0 }, { } @@ -598,7 +595,6 @@ static struct i2c_driver max98926_i2c_driver = { .pm = NULL, }, .probe = max98926_i2c_probe, - .remove = max98926_i2c_remove, .id_table = max98926_i2c_id, }; diff --git a/sound/soc/codecs/max98926.h b/sound/soc/codecs/max98926.h index 9d7ab6df79ca..ccf2c3f66c07 100644 --- a/sound/soc/codecs/max98926.h +++ b/sound/soc/codecs/max98926.h @@ -838,7 +838,7 @@ struct max98926_priv { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; unsigned int sysclk; unsigned int v_slot; unsigned int i_slot; diff --git a/sound/soc/codecs/max98927.c b/sound/soc/codecs/max98927.c index f701fdc81175..065303a46535 100644 --- a/sound/soc/codecs/max98927.c +++ b/sound/soc/codecs/max98927.c @@ -142,14 +142,14 @@ static struct reg_default max98927_reg[] = { static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); unsigned int mode = 0; unsigned int format = 0; bool use_pdm = false; unsigned int invert = 0; - dev_dbg(codec->dev, "%s: fmt 0x%08X\n", __func__, fmt); + dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: @@ -160,7 +160,7 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) mode = MAX98927_PCM_MASTER_MODE_MASTER; break; default: - dev_err(codec->dev, "DAI clock mode unsupported\n"); + dev_err(component->dev, "DAI clock mode unsupported\n"); return -EINVAL; } @@ -176,7 +176,7 @@ static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE; break; default: - dev_err(codec->dev, "DAI invert mode unsupported\n"); + dev_err(component->dev, "DAI invert mode unsupported\n"); return -EINVAL; } @@ -268,7 +268,7 @@ static int max98927_get_bclk_sel(int bclk) static int max98927_set_clock(struct max98927_priv *max98927, struct snd_pcm_hw_params *params) { - struct snd_soc_codec *codec = max98927->codec; + struct snd_soc_component *component = max98927->component; /* BCLK/LRCLK ratio calculation */ int blr_clk_ratio = params_channels(params) * max98927->ch_size; int value; @@ -281,7 +281,7 @@ static int max98927_set_clock(struct max98927_priv *max98927, break; } if (i == ARRAY_SIZE(rate_table)) { - dev_err(codec->dev, "failed to find proper clock rate.\n"); + dev_err(component->dev, "failed to find proper clock rate.\n"); return -EINVAL; } regmap_update_bits(max98927->regmap, @@ -294,7 +294,7 @@ static int max98927_set_clock(struct max98927_priv *max98927, /* BCLK configuration */ value = max98927_get_bclk_sel(blr_clk_ratio); if (!value) { - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", params_format(params)); return -EINVAL; } @@ -311,8 +311,8 @@ static int max98927_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); unsigned int sampling_rate = 0; unsigned int chan_sz = 0; @@ -328,7 +328,7 @@ static int max98927_dai_hw_params(struct snd_pcm_substream *substream, chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32; break; default: - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", params_format(params)); goto err; } @@ -339,7 +339,7 @@ static int max98927_dai_hw_params(struct snd_pcm_substream *substream, MAX98927_R0020_PCM_MODE_CFG, MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz); - dev_dbg(codec->dev, "format supported %d", + dev_dbg(component->dev, "format supported %d", params_format(params)); /* sampling rate configuration */ @@ -372,7 +372,7 @@ static int max98927_dai_hw_params(struct snd_pcm_substream *substream, sampling_rate = MAX98927_PCM_SR_SET1_SR_48000; break; default: - dev_err(codec->dev, "rate %d not supported\n", + dev_err(component->dev, "rate %d not supported\n", params_rate(params)); goto err; } @@ -407,8 +407,8 @@ static int max98927_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); int bsel = 0; unsigned int chan_sz = 0; @@ -417,7 +417,7 @@ static int max98927_dai_tdm_slot(struct snd_soc_dai *dai, /* BCLK configuration */ bsel = max98927_get_bclk_sel(slots * slot_width); if (bsel == 0) { - dev_err(codec->dev, "BCLK %d not supported\n", + dev_err(component->dev, "BCLK %d not supported\n", slots * slot_width); return -EINVAL; } @@ -439,7 +439,7 @@ static int max98927_dai_tdm_slot(struct snd_soc_dai *dai, chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32; break; default: - dev_err(codec->dev, "format unsupported %d\n", + dev_err(component->dev, "format unsupported %d\n", slot_width); return -EINVAL; } @@ -483,8 +483,8 @@ static int max98927_dai_tdm_slot(struct snd_soc_dai *dai, static int max98927_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); max98927->sysclk = freq; return 0; @@ -500,8 +500,8 @@ static const struct snd_soc_dai_ops max98927_dai_ops = { static int max98927_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -677,11 +677,11 @@ static struct snd_soc_dai_driver max98927_dai[] = { } }; -static int max98927_probe(struct snd_soc_codec *codec) +static int max98927_probe(struct snd_soc_component *component) { - struct max98927_priv *max98927 = snd_soc_codec_get_drvdata(codec); + struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component); - max98927->codec = codec; + max98927->component = component; /* Software Reset */ regmap_write(max98927->regmap, @@ -823,16 +823,18 @@ static const struct dev_pm_ops max98927_pm = { SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume) }; -static const struct snd_soc_codec_driver soc_codec_dev_max98927 = { - .probe = max98927_probe, - .component_driver = { - .controls = max98927_snd_controls, - .num_controls = ARRAY_SIZE(max98927_snd_controls), - .dapm_widgets = max98927_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(max98927_dapm_widgets), - .dapm_routes = max98927_audio_map, - .num_dapm_routes = ARRAY_SIZE(max98927_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_max98927 = { + .probe = max98927_probe, + .controls = max98927_snd_controls, + .num_controls = ARRAY_SIZE(max98927_snd_controls), + .dapm_widgets = max98927_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(max98927_dapm_widgets), + .dapm_routes = max98927_audio_map, + .num_dapm_routes = ARRAY_SIZE(max98927_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config max98927_regmap = { @@ -914,20 +916,15 @@ static int max98927_i2c_probe(struct i2c_client *i2c, max98927_slot_config(i2c, max98927); /* codec registeration */ - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_max98927, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_max98927, max98927_dai, ARRAY_SIZE(max98927_dai)); if (ret < 0) - dev_err(&i2c->dev, "Failed to register codec: %d\n", ret); + dev_err(&i2c->dev, "Failed to register component: %d\n", ret); return ret; } -static int max98927_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id max98927_i2c_id[] = { { "max98927", 0}, { }, @@ -959,7 +956,6 @@ static struct i2c_driver max98927_i2c_driver = { .pm = &max98927_pm, }, .probe = max98927_i2c_probe, - .remove = max98927_i2c_remove, .id_table = max98927_i2c_id, }; diff --git a/sound/soc/codecs/max98927.h b/sound/soc/codecs/max98927.h index 9ea839735433..42a9a244a9db 100644 --- a/sound/soc/codecs/max98927.h +++ b/sound/soc/codecs/max98927.h @@ -258,7 +258,7 @@ struct max98927_priv { struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct max98927_pdata *pdata; unsigned int spk_gain; unsigned int sysclk; diff --git a/sound/soc/codecs/mc13783.c b/sound/soc/codecs/mc13783.c index be7a45f05bbf..7b0d2610cd27 100644 --- a/sound/soc/codecs/mc13783.c +++ b/sound/soc/codecs/mc13783.c @@ -107,13 +107,13 @@ static int mc13783_pcm_hw_params_dac(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int rate = params_rate(params); int i; for (i = 0; i < ARRAY_SIZE(mc13783_rates); i++) { if (rate == mc13783_rates[i]) { - snd_soc_update_bits(codec, MC13783_AUDIO_DAC, + snd_soc_component_update_bits(component, MC13783_AUDIO_DAC, 0xf << 17, i << 17); return 0; } @@ -126,7 +126,7 @@ static int mc13783_pcm_hw_params_codec(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int rate = params_rate(params); unsigned int val; @@ -141,7 +141,7 @@ static int mc13783_pcm_hw_params_codec(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, MC13783_AUDIO_CODEC, AUDIO_CODEC_CDCFS8K16K, + snd_soc_component_update_bits(component, MC13783_AUDIO_CODEC, AUDIO_CODEC_CDCFS8K16K, val); return 0; @@ -160,7 +160,7 @@ static int mc13783_pcm_hw_params_sync(struct snd_pcm_substream *substream, static int mc13783_set_fmt(struct snd_soc_dai *dai, unsigned int fmt, unsigned int reg) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; unsigned int mask = AUDIO_CFS(3) | AUDIO_BCL_INV | AUDIO_CFS_INV | AUDIO_CSM | AUDIO_C_CLK_EN | AUDIO_C_RESET; @@ -208,7 +208,7 @@ static int mc13783_set_fmt(struct snd_soc_dai *dai, unsigned int fmt, val |= AUDIO_C_RESET; - snd_soc_update_bits(codec, reg, mask, val); + snd_soc_component_update_bits(component, reg, mask, val); return 0; } @@ -255,7 +255,7 @@ static int mc13783_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir, unsigned int reg) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int clk; unsigned int val = 0; unsigned int mask = AUDIO_CLK(0x7) | AUDIO_CLK_SEL; @@ -275,7 +275,7 @@ static int mc13783_set_sysclk(struct snd_soc_dai *dai, val |= AUDIO_CLK(clk); - snd_soc_update_bits(codec, reg, mask, val); + snd_soc_component_update_bits(component, reg, mask, val); return 0; } @@ -308,7 +308,7 @@ static int mc13783_set_tdm_slot_dac(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; unsigned int mask = SSI_NETWORK_DAC_SLOT_MASK | SSI_NETWORK_DAC_RXSLOT_MASK; @@ -344,7 +344,7 @@ static int mc13783_set_tdm_slot_dac(struct snd_soc_dai *dai, return -EINVAL; } - snd_soc_update_bits(codec, MC13783_SSI_NETWORK, mask, val); + snd_soc_component_update_bits(component, MC13783_SSI_NETWORK, mask, val); return 0; } @@ -353,7 +353,7 @@ static int mc13783_set_tdm_slot_codec(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; unsigned int mask = 0x3f; @@ -366,7 +366,7 @@ static int mc13783_set_tdm_slot_codec(struct snd_soc_dai *dai, val |= (0x00 << 2); /* primary timeslot RX/TX(?) is 0 */ val |= (0x01 << 4); /* secondary timeslot TX is 1 */ - snd_soc_update_bits(codec, MC13783_SSI_NETWORK, mask, val); + snd_soc_component_update_bits(component, MC13783_SSI_NETWORK, mask, val); return 0; } @@ -606,12 +606,12 @@ static struct snd_kcontrol_new mc13783_control_list[] = { SOC_SINGLE("MC2 Capture Bias Switch", MC13783_AUDIO_TX, 1, 1, 0), }; -static int mc13783_probe(struct snd_soc_codec *codec) +static int mc13783_probe(struct snd_soc_component *component) { - struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec); + struct mc13783_priv *priv = snd_soc_component_get_drvdata(component); - snd_soc_codec_init_regmap(codec, - dev_get_regmap(codec->dev->parent, NULL)); + snd_soc_component_init_regmap(component, + dev_get_regmap(component->dev->parent, NULL)); /* these are the reset values */ mc13xxx_reg_write(priv->mc13xxx, MC13783_AUDIO_RX0, 0x25893); @@ -638,14 +638,12 @@ static int mc13783_probe(struct snd_soc_codec *codec) return 0; } -static int mc13783_remove(struct snd_soc_codec *codec) +static void mc13783_remove(struct snd_soc_component *component) { - struct mc13783_priv *priv = snd_soc_codec_get_drvdata(codec); + struct mc13783_priv *priv = snd_soc_component_get_drvdata(component); /* Make sure VAUDIOON is off */ mc13xxx_reg_rmw(priv->mc13xxx, MC13783_AUDIO_RX0, 0x3, 0); - - return 0; } #define MC13783_RATES_RECORD (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000) @@ -731,17 +729,19 @@ static struct snd_soc_dai_driver mc13783_dai_sync[] = { } }; -static const struct snd_soc_codec_driver soc_codec_dev_mc13783 = { - .probe = mc13783_probe, - .remove = mc13783_remove, - .component_driver = { - .controls = mc13783_control_list, - .num_controls = ARRAY_SIZE(mc13783_control_list), - .dapm_widgets = mc13783_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(mc13783_dapm_widgets), - .dapm_routes = mc13783_routes, - .num_dapm_routes = ARRAY_SIZE(mc13783_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_mc13783 = { + .probe = mc13783_probe, + .remove = mc13783_remove, + .controls = mc13783_control_list, + .num_controls = ARRAY_SIZE(mc13783_control_list), + .dapm_widgets = mc13783_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(mc13783_dapm_widgets), + .dapm_routes = mc13783_routes, + .num_dapm_routes = ARRAY_SIZE(mc13783_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int __init mc13783_codec_probe(struct platform_device *pdev) @@ -782,10 +782,10 @@ static int __init mc13783_codec_probe(struct platform_device *pdev) priv->mc13xxx = dev_get_drvdata(pdev->dev.parent); if (priv->adc_ssi_port == priv->dac_ssi_port) - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_mc13783, + ret = devm_snd_soc_register_component(&pdev->dev, &soc_component_dev_mc13783, mc13783_dai_sync, ARRAY_SIZE(mc13783_dai_sync)); else - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_mc13783, + ret = devm_snd_soc_register_component(&pdev->dev, &soc_component_dev_mc13783, mc13783_dai_async, ARRAY_SIZE(mc13783_dai_async)); return ret; @@ -793,8 +793,6 @@ static int __init mc13783_codec_probe(struct platform_device *pdev) static int mc13783_codec_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); - return 0; } diff --git a/sound/soc/codecs/ml26124.c b/sound/soc/codecs/ml26124.c index 5cc960d8211e..a5fa490dc145 100644 --- a/sound/soc/codecs/ml26124.c +++ b/sound/soc/codecs/ml26124.c @@ -338,8 +338,8 @@ static int ml26124_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ml26124_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ml26124_priv *priv = snd_soc_component_get_drvdata(component); int i = get_coeff(priv->mclk, params_rate(hw_params)); int srate; @@ -351,23 +351,23 @@ static int ml26124_hw_params(struct snd_pcm_substream *substream, if (priv->clk_in) { switch (priv->mclk / params_rate(hw_params)) { case 256: - snd_soc_update_bits(codec, ML26124_CLK_CTL, + snd_soc_component_update_bits(component, ML26124_CLK_CTL, BIT(0) | BIT(1), 1); break; case 512: - snd_soc_update_bits(codec, ML26124_CLK_CTL, + snd_soc_component_update_bits(component, ML26124_CLK_CTL, BIT(0) | BIT(1), 2); break; case 1024: - snd_soc_update_bits(codec, ML26124_CLK_CTL, + snd_soc_component_update_bits(component, ML26124_CLK_CTL, BIT(0) | BIT(1), 3); break; default: - dev_err(codec->dev, "Unsupported MCLKI\n"); + dev_err(component->dev, "Unsupported MCLKI\n"); break; } } else { - snd_soc_update_bits(codec, ML26124_CLK_CTL, + snd_soc_component_update_bits(component, ML26124_CLK_CTL, BIT(0) | BIT(1), 0); } @@ -375,35 +375,35 @@ static int ml26124_hw_params(struct snd_pcm_substream *substream, if (srate < 0) return srate; - snd_soc_update_bits(codec, ML26124_SMPLING_RATE, 0xf, srate); - snd_soc_update_bits(codec, ML26124_PLLNL, 0xff, coeff_div[i].pllnl); - snd_soc_update_bits(codec, ML26124_PLLNH, 0x1, coeff_div[i].pllnh); - snd_soc_update_bits(codec, ML26124_PLLML, 0xff, coeff_div[i].pllml); - snd_soc_update_bits(codec, ML26124_PLLMH, 0x3f, coeff_div[i].pllmh); - snd_soc_update_bits(codec, ML26124_PLLDIV, 0x1f, coeff_div[i].plldiv); + snd_soc_component_update_bits(component, ML26124_SMPLING_RATE, 0xf, srate); + snd_soc_component_update_bits(component, ML26124_PLLNL, 0xff, coeff_div[i].pllnl); + snd_soc_component_update_bits(component, ML26124_PLLNH, 0x1, coeff_div[i].pllnh); + snd_soc_component_update_bits(component, ML26124_PLLML, 0xff, coeff_div[i].pllml); + snd_soc_component_update_bits(component, ML26124_PLLMH, 0x3f, coeff_div[i].pllmh); + snd_soc_component_update_bits(component, ML26124_PLLDIV, 0x1f, coeff_div[i].plldiv); return 0; } static int ml26124_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct ml26124_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ml26124_priv *priv = snd_soc_component_get_drvdata(component); switch (priv->substream->stream) { case SNDRV_PCM_STREAM_CAPTURE: - snd_soc_update_bits(codec, ML26124_REC_PLYBAK_RUN, BIT(0), 1); + snd_soc_component_update_bits(component, ML26124_REC_PLYBAK_RUN, BIT(0), 1); break; case SNDRV_PCM_STREAM_PLAYBACK: - snd_soc_update_bits(codec, ML26124_REC_PLYBAK_RUN, BIT(1), 2); + snd_soc_component_update_bits(component, ML26124_REC_PLYBAK_RUN, BIT(1), 2); break; } if (mute) - snd_soc_update_bits(codec, ML26124_DVOL_CTL, BIT(4), + snd_soc_component_update_bits(component, ML26124_DVOL_CTL, BIT(4), DVOL_CTL_DVMUTE_ON); else - snd_soc_update_bits(codec, ML26124_DVOL_CTL, BIT(4), + snd_soc_component_update_bits(component, ML26124_DVOL_CTL, BIT(4), DVOL_CTL_DVMUTE_OFF); return 0; @@ -413,7 +413,7 @@ static int ml26124_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { unsigned char mode; - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -426,7 +426,7 @@ static int ml26124_set_dai_fmt(struct snd_soc_dai *codec_dai, default: return -EINVAL; } - snd_soc_update_bits(codec, ML26124_SAI_MODE_SEL, BIT(0), mode); + snd_soc_component_update_bits(component, ML26124_SAI_MODE_SEL, BIT(0), mode); /* interface format */ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -450,8 +450,8 @@ static int ml26124_set_dai_fmt(struct snd_soc_dai *codec_dai, static int ml26124_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ml26124_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ml26124_priv *priv = snd_soc_component_get_drvdata(component); switch (clk_id) { case ML26124_USE_PLLOUT: @@ -469,17 +469,17 @@ static int ml26124_set_dai_sysclk(struct snd_soc_dai *codec_dai, return 0; } -static int ml26124_set_bias_level(struct snd_soc_codec *codec, +static int ml26124_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct ml26124_priv *priv = snd_soc_codec_get_drvdata(codec); + struct ml26124_priv *priv = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: - snd_soc_update_bits(codec, ML26124_PW_SPAMP_PW_MNG, + snd_soc_component_update_bits(component, ML26124_PW_SPAMP_PW_MNG, ML26124_R26_MASK, ML26124_BLT_PREAMP_ON); msleep(100); - snd_soc_update_bits(codec, ML26124_PW_SPAMP_PW_MNG, + snd_soc_component_update_bits(component, ML26124_PW_SPAMP_PW_MNG, ML26124_R26_MASK, ML26124_MICBEN_ON | ML26124_BLT_ALL_ON); break; @@ -487,8 +487,8 @@ static int ml26124_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: /* VMID ON */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_update_bits(codec, ML26124_PW_REF_PW_MNG, + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_update_bits(component, ML26124_PW_REF_PW_MNG, ML26124_VMID, ML26124_VMID); msleep(500); regcache_sync(priv->regmap); @@ -496,7 +496,7 @@ static int ml26124_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: /* VMID OFF */ - snd_soc_update_bits(codec, ML26124_PW_REF_PW_MNG, + snd_soc_component_update_bits(component, ML26124_PW_REF_PW_MNG, ML26124_VMID, 0); break; } @@ -528,27 +528,29 @@ static struct snd_soc_dai_driver ml26124_dai = { .symmetric_rates = 1, }; -static int ml26124_probe(struct snd_soc_codec *codec) +static int ml26124_probe(struct snd_soc_component *component) { /* Software Reset */ - snd_soc_update_bits(codec, ML26124_SW_RST, 0x01, 1); - snd_soc_update_bits(codec, ML26124_SW_RST, 0x01, 0); + snd_soc_component_update_bits(component, ML26124_SW_RST, 0x01, 1); + snd_soc_component_update_bits(component, ML26124_SW_RST, 0x01, 0); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_ml26124 = { - .probe = ml26124_probe, - .set_bias_level = ml26124_set_bias_level, - .suspend_bias_off = true, - .component_driver = { - .controls = ml26124_snd_controls, - .num_controls = ARRAY_SIZE(ml26124_snd_controls), - .dapm_widgets = ml26124_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ml26124_dapm_widgets), - .dapm_routes = ml26124_intercon, - .num_dapm_routes = ARRAY_SIZE(ml26124_intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_ml26124 = { + .probe = ml26124_probe, + .set_bias_level = ml26124_set_bias_level, + .controls = ml26124_snd_controls, + .num_controls = ARRAY_SIZE(ml26124_snd_controls), + .dapm_widgets = ml26124_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ml26124_dapm_widgets), + .dapm_routes = ml26124_intercon, + .num_dapm_routes = ARRAY_SIZE(ml26124_intercon), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ml26124_i2c_regmap = { @@ -580,14 +582,8 @@ static int ml26124_i2c_probe(struct i2c_client *i2c, return ret; } - return snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_ml26124, &ml26124_dai, 1); -} - -static int ml26124_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_ml26124, &ml26124_dai, 1); } static const struct i2c_device_id ml26124_i2c_id[] = { @@ -601,7 +597,6 @@ static struct i2c_driver ml26124_i2c_driver = { .name = "ml26124", }, .probe = ml26124_i2c_probe, - .remove = ml26124_i2c_remove, .id_table = ml26124_i2c_id, }; diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c index 44062bb7bf2f..12ee83d52405 100644 --- a/sound/soc/codecs/msm8916-wcd-analog.c +++ b/sound/soc/codecs/msm8916-wcd-analog.c @@ -288,7 +288,7 @@ struct pm8916_wcd_analog_priv { int mbhc_btn0_released; bool detect_accessory_type; struct clk *mclk; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)]; struct snd_soc_jack *jack; bool hphl_jack_type_normally_open; @@ -338,18 +338,18 @@ static const struct snd_kcontrol_new pm8916_wcd_analog_snd_controls[] = { SOC_SINGLE_TLV("ADC3 Volume", CDC_A_TX_3_EN, 3, 8, 0, analog_gain), }; -static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec) +static void pm8916_wcd_analog_micbias_enable(struct snd_soc_component *component) { - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); - snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, + snd_soc_component_update_bits(component, CDC_A_MICB_1_CTL, MICB_1_CTL_EXT_PRECHARG_EN_MASK | MICB_1_CTL_INT_PRECHARG_BYP_MASK, MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL | MICB_1_CTL_EXT_PRECHARG_EN_ENABLE); if (wcd->micbias_mv) { - snd_soc_update_bits(codec, CDC_A_MICB_1_VAL, + snd_soc_component_update_bits(component, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_MASK, MICB_VOLTAGE_REGVAL(wcd->micbias_mv)); /* @@ -360,20 +360,20 @@ static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec) msleep(50); } - snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, + snd_soc_component_update_bits(component, CDC_A_MICB_1_CTL, MICB_1_CTL_EXT_PRECHARG_EN_MASK | MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0); } -static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_codec - *codec, int event, +static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_component + *component, int event, int reg, unsigned int cap_mode) { switch (event) { case SND_SOC_DAPM_POST_PMU: - pm8916_wcd_analog_micbias_enable(codec); - snd_soc_update_bits(codec, CDC_A_MICB_1_EN, + pm8916_wcd_analog_micbias_enable(component); + snd_soc_component_update_bits(component, CDC_A_MICB_1_EN, MICB_1_EN_BYP_CAP_MASK, cap_mode); break; } @@ -381,25 +381,25 @@ static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_codec return 0; } -static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_codec - *codec, int event, +static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_component + *component, int event, int reg, u32 cap_mode) { switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, CDC_A_MICB_1_INT_RBIAS, + snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS, MICB_1_INT_TX2_INT_RBIAS_EN_MASK, MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE); - snd_soc_update_bits(codec, reg, MICB_1_EN_PULL_DOWN_EN_MASK, 0); - snd_soc_update_bits(codec, CDC_A_MICB_1_EN, + snd_soc_component_update_bits(component, reg, MICB_1_EN_PULL_DOWN_EN_MASK, 0); + snd_soc_component_update_bits(component, CDC_A_MICB_1_EN, MICB_1_EN_OPA_STG2_TAIL_CURR_MASK, MICB_1_EN_OPA_STG2_TAIL_CURR_1_60UA); break; case SND_SOC_DAPM_POST_PMU: - pm8916_wcd_analog_micbias_enable(codec); - snd_soc_update_bits(codec, CDC_A_MICB_1_EN, + pm8916_wcd_analog_micbias_enable(component); + snd_soc_component_update_bits(component, CDC_A_MICB_1_EN, MICB_1_EN_BYP_CAP_MASK, cap_mode); break; } @@ -412,10 +412,10 @@ static int pm8916_wcd_analog_enable_micbias_ext1(struct *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); - return pm8916_wcd_analog_enable_micbias_ext(codec, event, w->reg, + return pm8916_wcd_analog_enable_micbias_ext(component, event, w->reg, wcd->micbias1_cap_mode); } @@ -424,10 +424,10 @@ static int pm8916_wcd_analog_enable_micbias_ext2(struct *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); - return pm8916_wcd_analog_enable_micbias_ext(codec, event, w->reg, + return pm8916_wcd_analog_enable_micbias_ext(component, event, w->reg, wcd->micbias2_cap_mode); } @@ -437,35 +437,35 @@ static int pm8916_wcd_analog_enable_micbias_int1(struct *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); - return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg, + return pm8916_wcd_analog_enable_micbias_int(component, event, w->reg, wcd->micbias1_cap_mode); } static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv, bool micbias2_enabled) { - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; u32 coarse, fine, reg_val, reg_addr; int *vrefs, i; if (!micbias2_enabled) { /* use internal 100uA Current source */ /* Enable internal 2.2k Internal Rbias Resistor */ - snd_soc_update_bits(codec, CDC_A_MICB_1_INT_RBIAS, + snd_soc_component_update_bits(component, CDC_A_MICB_1_INT_RBIAS, MICB_1_INT_TX2_INT_RBIAS_EN_MASK, MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE); /* Remove pull down on MIC BIAS2 */ - snd_soc_update_bits(codec, CDC_A_MICB_2_EN, + snd_soc_component_update_bits(component, CDC_A_MICB_2_EN, CDC_A_MICB_2_PULL_DOWN_EN_MASK, 0); /* enable 100uA internal current source */ - snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL, + snd_soc_component_update_bits(component, CDC_A_MBHC_FSM_CTL, CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_MASK, CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_I_100UA); } - snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL, + snd_soc_component_update_bits(component, CDC_A_MBHC_FSM_CTL, CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN_MASK, CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN); @@ -482,7 +482,7 @@ static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv, fine = ((vrefs[i] % 100) / 12); reg_val = (coarse << CDC_A_MBHC_BTN_VREF_COARSE_SHIFT) | (fine << CDC_A_MBHC_BTN_VREF_FINE_SHIFT); - snd_soc_update_bits(codec, reg_addr, + snd_soc_component_update_bits(component, reg_addr, CDC_A_MBHC_BTN_VREF_MASK, reg_val); reg_addr++; @@ -493,12 +493,12 @@ static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv, static void pm8916_wcd_setup_mbhc(struct pm8916_wcd_analog_priv *wcd) { - struct snd_soc_codec *codec = wcd->codec; + struct snd_soc_component *component = wcd->component; bool micbias_enabled = false; u32 plug_type = 0; u32 int_en_mask; - snd_soc_write(codec, CDC_A_MBHC_DET_CTL_1, + snd_soc_component_write(component, CDC_A_MBHC_DET_CTL_1, CDC_A_MBHC_DET_CTL_L_DET_EN | CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_INSERTION | CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_AUTO | @@ -510,23 +510,23 @@ static void pm8916_wcd_setup_mbhc(struct pm8916_wcd_analog_priv *wcd) if (wcd->gnd_jack_type_normally_open) plug_type |= CDC_A_GND_PLUG_TYPE_NO; - snd_soc_write(codec, CDC_A_MBHC_DET_CTL_2, + snd_soc_component_write(component, CDC_A_MBHC_DET_CTL_2, CDC_A_MBHC_DET_CTL_HS_L_DET_PULL_UP_CTRL_I_3P0 | CDC_A_MBHC_DET_CTL_HS_L_DET_COMPA_CTRL_V0P9_VDD | plug_type | CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN); - snd_soc_write(codec, CDC_A_MBHC_DBNC_TIMER, + snd_soc_component_write(component, CDC_A_MBHC_DBNC_TIMER, CDC_A_MBHC_DBNC_TIMER_INSREM_DBNC_T_256_MS | CDC_A_MBHC_DBNC_TIMER_BTN_DBNC_T_16MS); /* enable MBHC clock */ - snd_soc_update_bits(codec, CDC_D_CDC_DIG_CLK_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_DIG_CLK_CTL, DIG_CLK_CTL_D_MBHC_CLK_EN_MASK, DIG_CLK_CTL_D_MBHC_CLK_EN); - if (snd_soc_read(codec, CDC_A_MICB_2_EN) & CDC_A_MICB_2_EN_ENABLE) + if (snd_soc_component_read32(component, CDC_A_MICB_2_EN) & CDC_A_MICB_2_EN_ENABLE) micbias_enabled = true; pm8916_mbhc_configure_bias(wcd, micbias_enabled); @@ -535,8 +535,8 @@ static void pm8916_wcd_setup_mbhc(struct pm8916_wcd_analog_priv *wcd) if (wcd->mbhc_btn_enabled) int_en_mask |= MBHC_BUTTON_PRESS_DET | MBHC_BUTTON_RELEASE_DET; - snd_soc_update_bits(codec, CDC_D_INT_EN_CLR, int_en_mask, 0); - snd_soc_update_bits(codec, CDC_D_INT_EN_SET, int_en_mask, int_en_mask); + snd_soc_component_update_bits(component, CDC_D_INT_EN_CLR, int_en_mask, 0); + snd_soc_component_update_bits(component, CDC_D_INT_EN_SET, int_en_mask, int_en_mask); wcd->mbhc_btn0_released = false; wcd->detect_accessory_type = true; } @@ -546,8 +546,8 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -558,7 +558,7 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct break; } - return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg, + return pm8916_wcd_analog_enable_micbias_int(component, event, w->reg, wcd->micbias2_cap_mode); } @@ -566,7 +566,7 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); u16 adc_reg = CDC_A_TX_1_2_TEST_CTL_2; u8 init_bit_shift; @@ -578,7 +578,7 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: if (w->reg == CDC_A_TX_2_EN) - snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, + snd_soc_component_update_bits(component, CDC_A_MICB_1_CTL, MICB_1_CTL_CFILT_REF_SEL_MASK, MICB_1_CTL_CFILT_REF_SEL_HPF_REF); /* @@ -587,17 +587,17 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w, * happen when the input voltage is changing too much. */ usleep_range(10000, 10010); - snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, + snd_soc_component_update_bits(component, adc_reg, 1 << init_bit_shift, 1 << init_bit_shift); switch (w->reg) { case CDC_A_TX_1_EN: - snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX1_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_CONN_TX1_CTL, CONN_TX1_SERIAL_TX1_MUX, CONN_TX1_SERIAL_TX1_ADC_1); break; case CDC_A_TX_2_EN: case CDC_A_TX_3_EN: - snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_CONN_TX2_CTL, CONN_TX2_SERIAL_TX2_MUX, CONN_TX2_SERIAL_TX2_ADC_2); break; @@ -609,21 +609,21 @@ static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w, * to reduce the tx pop */ usleep_range(12000, 12010); - snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); + snd_soc_component_update_bits(component, adc_reg, 1 << init_bit_shift, 0x00); break; case SND_SOC_DAPM_POST_PMD: switch (w->reg) { case CDC_A_TX_1_EN: - snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX1_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_CONN_TX1_CTL, CONN_TX1_SERIAL_TX1_MUX, CONN_TX1_SERIAL_TX1_ZERO); break; case CDC_A_TX_2_EN: - snd_soc_update_bits(codec, CDC_A_MICB_1_CTL, + snd_soc_component_update_bits(component, CDC_A_MICB_1_CTL, MICB_1_CTL_CFILT_REF_SEL_MASK, 0); /* fall through */ case CDC_A_TX_3_EN: - snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_CONN_TX2_CTL, CONN_TX2_SERIAL_TX2_MUX, CONN_TX2_SERIAL_TX2_ZERO); break; @@ -639,11 +639,11 @@ static int pm8916_wcd_analog_enable_spk_pa(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, CDC_A_SPKR_PWRSTG_CTL, + snd_soc_component_update_bits(component, CDC_A_SPKR_PWRSTG_CTL, SPKR_PWRSTG_CTL_DAC_EN_MASK | SPKR_PWRSTG_CTL_BBM_MASK | SPKR_PWRSTG_CTL_HBRDGE_EN_MASK | @@ -653,29 +653,29 @@ static int pm8916_wcd_analog_enable_spk_pa(struct snd_soc_dapm_widget *w, SPKR_PWRSTG_CTL_HBRDGE_EN | SPKR_PWRSTG_CTL_CLAMP_EN); - snd_soc_update_bits(codec, CDC_A_RX_EAR_CTL, + snd_soc_component_update_bits(component, CDC_A_RX_EAR_CTL, RX_EAR_CTL_SPK_VBAT_LDO_EN_MASK, RX_EAR_CTL_SPK_VBAT_LDO_EN_ENABLE); break; case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, CDC_A_SPKR_DRV_CTL, + snd_soc_component_update_bits(component, CDC_A_SPKR_DRV_CTL, SPKR_DRV_CTL_DEF_MASK, SPKR_DRV_CTL_DEF_VAL); - snd_soc_update_bits(codec, w->reg, + snd_soc_component_update_bits(component, w->reg, SPKR_DRV_CLASSD_PA_EN_MASK, SPKR_DRV_CLASSD_PA_EN_ENABLE); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, CDC_A_SPKR_PWRSTG_CTL, + snd_soc_component_update_bits(component, CDC_A_SPKR_PWRSTG_CTL, SPKR_PWRSTG_CTL_DAC_EN_MASK| SPKR_PWRSTG_CTL_BBM_MASK | SPKR_PWRSTG_CTL_HBRDGE_EN_MASK | SPKR_PWRSTG_CTL_CLAMP_EN_MASK, 0); - snd_soc_update_bits(codec, CDC_A_SPKR_DAC_CTL, + snd_soc_component_update_bits(component, CDC_A_SPKR_DAC_CTL, SPKR_DAC_CTL_DAC_RESET_MASK, SPKR_DAC_CTL_DAC_RESET_NORMAL); - snd_soc_update_bits(codec, CDC_A_RX_EAR_CTL, + snd_soc_component_update_bits(component, CDC_A_RX_EAR_CTL, RX_EAR_CTL_SPK_VBAT_LDO_EN_MASK, 0); break; } @@ -701,36 +701,36 @@ static const struct reg_default wcd_reg_defaults_2_0[] = { {CDC_A_MASTER_BIAS_CTL, 0x30}, }; -static int pm8916_wcd_analog_probe(struct snd_soc_codec *codec) +static int pm8916_wcd_analog_probe(struct snd_soc_component *component) { - struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev); + struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(component->dev); int err, reg; err = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); if (err != 0) { - dev_err(codec->dev, "failed to enable regulators (%d)\n", err); + dev_err(component->dev, "failed to enable regulators (%d)\n", err); return err; } - snd_soc_codec_init_regmap(codec, - dev_get_regmap(codec->dev->parent, NULL)); - snd_soc_codec_set_drvdata(codec, priv); - priv->pmic_rev = snd_soc_read(codec, CDC_D_REVISION1); - priv->codec_version = snd_soc_read(codec, CDC_D_PERPH_SUBTYPE); + snd_soc_component_init_regmap(component, + dev_get_regmap(component->dev->parent, NULL)); + snd_soc_component_set_drvdata(component, priv); + priv->pmic_rev = snd_soc_component_read32(component, CDC_D_REVISION1); + priv->codec_version = snd_soc_component_read32(component, CDC_D_PERPH_SUBTYPE); - dev_info(codec->dev, "PMIC REV: %d\t CODEC Version: %d\n", + dev_info(component->dev, "PMIC REV: %d\t CODEC Version: %d\n", priv->pmic_rev, priv->codec_version); - snd_soc_write(codec, CDC_D_PERPH_RESET_CTL4, 0x01); - snd_soc_write(codec, CDC_A_PERPH_RESET_CTL4, 0x01); + snd_soc_component_write(component, CDC_D_PERPH_RESET_CTL4, 0x01); + snd_soc_component_write(component, CDC_A_PERPH_RESET_CTL4, 0x01); for (reg = 0; reg < ARRAY_SIZE(wcd_reg_defaults_2_0); reg++) - snd_soc_write(codec, wcd_reg_defaults_2_0[reg].reg, + snd_soc_component_write(component, wcd_reg_defaults_2_0[reg].reg, wcd_reg_defaults_2_0[reg].def); - priv->codec = codec; + priv->component = component; - snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_RST_CTL, RST_CTL_DIG_SW_RST_N_MASK, RST_CTL_DIG_SW_RST_N_REMOVE_RESET); @@ -739,14 +739,14 @@ static int pm8916_wcd_analog_probe(struct snd_soc_codec *codec) return 0; } -static int pm8916_wcd_analog_remove(struct snd_soc_codec *codec) +static void pm8916_wcd_analog_remove(struct snd_soc_component *component) { - struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev); + struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(component->dev); - snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL, + snd_soc_component_update_bits(component, CDC_D_CDC_RST_CTL, RST_CTL_DIG_SW_RST_N_MASK, 0); - return regulator_bulk_disable(ARRAY_SIZE(priv->supplies), + regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); } @@ -934,11 +934,11 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("A_MCLK2", CDC_D_CDC_TOP_CLK_CTL, 3, 0, NULL, 0), }; -static int pm8916_wcd_analog_set_jack(struct snd_soc_codec *codec, +static int pm8916_wcd_analog_set_jack(struct snd_soc_component *component, struct snd_soc_jack *jack, void *data) { - struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec); + struct pm8916_wcd_analog_priv *wcd = snd_soc_component_get_drvdata(component); wcd->jack = jack; @@ -950,8 +950,8 @@ static irqreturn_t mbhc_btn_release_irq_handler(int irq, void *arg) struct pm8916_wcd_analog_priv *priv = arg; if (priv->detect_accessory_type) { - struct snd_soc_codec *codec = priv->codec; - u32 val = snd_soc_read(codec, CDC_A_MBHC_RESULT_1); + struct snd_soc_component *component = priv->component; + u32 val = snd_soc_component_read32(component, CDC_A_MBHC_RESULT_1); /* check if its BTN0 thats released */ if ((val != -1) && !(val & CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK)) @@ -967,10 +967,10 @@ static irqreturn_t mbhc_btn_release_irq_handler(int irq, void *arg) static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg) { struct pm8916_wcd_analog_priv *priv = arg; - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; u32 btn_result; - btn_result = snd_soc_read(codec, CDC_A_MBHC_RESULT_1) & + btn_result = snd_soc_component_read32(component, CDC_A_MBHC_RESULT_1) & CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK; switch (btn_result) { @@ -993,7 +993,7 @@ static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg) SND_JACK_BTN_0, btn_mask); break; default: - dev_err(codec->dev, + dev_err(component->dev, "Unexpected button press result (%x)", btn_result); break; } @@ -1004,15 +1004,15 @@ static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg) static irqreturn_t pm8916_mbhc_switch_irq_handler(int irq, void *arg) { struct pm8916_wcd_analog_priv *priv = arg; - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; bool ins = false; - if (snd_soc_read(codec, CDC_A_MBHC_DET_CTL_1) & + if (snd_soc_component_read32(component, CDC_A_MBHC_DET_CTL_1) & CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK) ins = true; /* Set the detection type appropriately */ - snd_soc_update_bits(codec, CDC_A_MBHC_DET_CTL_1, + snd_soc_component_update_bits(component, CDC_A_MBHC_DET_CTL_1, CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK, (!ins << CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_SHIFT)); @@ -1020,7 +1020,7 @@ static irqreturn_t pm8916_mbhc_switch_irq_handler(int irq, void *arg) if (ins) { /* hs insertion */ bool micbias_enabled = false; - if (snd_soc_read(codec, CDC_A_MICB_2_EN) & + if (snd_soc_component_read32(component, CDC_A_MICB_2_EN) & CDC_A_MICB_2_EN_ENABLE) micbias_enabled = true; @@ -1075,18 +1075,20 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = { }, }; -static const struct snd_soc_codec_driver pm8916_wcd_analog = { - .probe = pm8916_wcd_analog_probe, - .remove = pm8916_wcd_analog_remove, - .set_jack = pm8916_wcd_analog_set_jack, - .component_driver = { - .controls = pm8916_wcd_analog_snd_controls, - .num_controls = ARRAY_SIZE(pm8916_wcd_analog_snd_controls), - .dapm_widgets = pm8916_wcd_analog_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pm8916_wcd_analog_dapm_widgets), - .dapm_routes = pm8916_wcd_analog_audio_map, - .num_dapm_routes = ARRAY_SIZE(pm8916_wcd_analog_audio_map), - }, +static const struct snd_soc_component_driver pm8916_wcd_analog = { + .probe = pm8916_wcd_analog_probe, + .remove = pm8916_wcd_analog_remove, + .set_jack = pm8916_wcd_analog_set_jack, + .controls = pm8916_wcd_analog_snd_controls, + .num_controls = ARRAY_SIZE(pm8916_wcd_analog_snd_controls), + .dapm_widgets = pm8916_wcd_analog_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pm8916_wcd_analog_dapm_widgets), + .dapm_routes = pm8916_wcd_analog_audio_map, + .num_dapm_routes = ARRAY_SIZE(pm8916_wcd_analog_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int pm8916_wcd_analog_parse_dt(struct device *dev, @@ -1223,7 +1225,7 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev) dev_set_drvdata(dev, priv); - return snd_soc_register_codec(dev, &pm8916_wcd_analog, + return devm_snd_soc_register_component(dev, &pm8916_wcd_analog, pm8916_wcd_analog_dai, ARRAY_SIZE(pm8916_wcd_analog_dai)); } @@ -1232,7 +1234,6 @@ static int pm8916_wcd_analog_spmi_remove(struct platform_device *pdev) { struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); clk_disable_unprepare(priv->mclk); return 0; diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c index 13354d6304a8..3063dedd21cf 100644 --- a/sound/soc/codecs/msm8916-wcd-digital.c +++ b/sound/soc/codecs/msm8916-wcd-digital.c @@ -348,14 +348,14 @@ static int msm8916_wcd_digital_enable_interpolator( struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: /* apply the digital gain after the interpolator is enabled */ usleep_range(10000, 10100); - snd_soc_write(codec, rx_gain_reg[w->shift], - snd_soc_read(codec, rx_gain_reg[w->shift])); + snd_soc_component_write(component, rx_gain_reg[w->shift], + snd_soc_component_read32(component, rx_gain_reg[w->shift])); break; } return 0; @@ -365,7 +365,7 @@ static int msm8916_wcd_digital_enable_dec(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int decimator = w->shift + 1; u16 dec_reset_reg, tx_vol_ctl_reg, tx_mux_ctl_reg; u8 dec_hpf_cut_of_freq; @@ -377,46 +377,46 @@ static int msm8916_wcd_digital_enable_dec(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: /* Enable TX digital mute */ - snd_soc_update_bits(codec, tx_vol_ctl_reg, + snd_soc_component_update_bits(component, tx_vol_ctl_reg, TX_VOL_CTL_CFG_MUTE_EN_MASK, TX_VOL_CTL_CFG_MUTE_EN_ENABLE); - dec_hpf_cut_of_freq = snd_soc_read(codec, tx_mux_ctl_reg) & + dec_hpf_cut_of_freq = snd_soc_component_read32(component, tx_mux_ctl_reg) & TX_MUX_CTL_CUT_OFF_FREQ_MASK; dec_hpf_cut_of_freq >>= TX_MUX_CTL_CUT_OFF_FREQ_SHIFT; if (dec_hpf_cut_of_freq != TX_MUX_CTL_CF_NEG_3DB_150HZ) { /* set cut of freq to CF_MIN_3DB_150HZ (0x1) */ - snd_soc_update_bits(codec, tx_mux_ctl_reg, + snd_soc_component_update_bits(component, tx_mux_ctl_reg, TX_MUX_CTL_CUT_OFF_FREQ_MASK, TX_MUX_CTL_CF_NEG_3DB_150HZ); } break; case SND_SOC_DAPM_POST_PMU: /* enable HPF */ - snd_soc_update_bits(codec, tx_mux_ctl_reg, + snd_soc_component_update_bits(component, tx_mux_ctl_reg, TX_MUX_CTL_HPF_BP_SEL_MASK, TX_MUX_CTL_HPF_BP_SEL_NO_BYPASS); /* apply the digital gain after the decimator is enabled */ - snd_soc_write(codec, tx_gain_reg[w->shift], - snd_soc_read(codec, tx_gain_reg[w->shift])); - snd_soc_update_bits(codec, tx_vol_ctl_reg, + snd_soc_component_write(component, tx_gain_reg[w->shift], + snd_soc_component_read32(component, tx_gain_reg[w->shift])); + snd_soc_component_update_bits(component, tx_vol_ctl_reg, TX_VOL_CTL_CFG_MUTE_EN_MASK, 0); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, tx_vol_ctl_reg, + snd_soc_component_update_bits(component, tx_vol_ctl_reg, TX_VOL_CTL_CFG_MUTE_EN_MASK, TX_VOL_CTL_CFG_MUTE_EN_ENABLE); - snd_soc_update_bits(codec, tx_mux_ctl_reg, + snd_soc_component_update_bits(component, tx_mux_ctl_reg, TX_MUX_CTL_HPF_BP_SEL_MASK, TX_MUX_CTL_HPF_BP_SEL_BYPASS); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, + snd_soc_component_update_bits(component, dec_reset_reg, 1 << w->shift, 1 << w->shift); - snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, 0x0); - snd_soc_update_bits(codec, tx_mux_ctl_reg, + snd_soc_component_update_bits(component, dec_reset_reg, 1 << w->shift, 0x0); + snd_soc_component_update_bits(component, tx_mux_ctl_reg, TX_MUX_CTL_HPF_BP_SEL_MASK, TX_MUX_CTL_HPF_BP_SEL_BYPASS); - snd_soc_update_bits(codec, tx_vol_ctl_reg, + snd_soc_component_update_bits(component, tx_vol_ctl_reg, TX_VOL_CTL_CFG_MUTE_EN_MASK, 0); break; } @@ -428,35 +428,35 @@ static int msm8916_wcd_digital_enable_dmic(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int dmic; int ret; /* get dmic number out of widget name */ char *dmic_num = strpbrk(w->name, "12"); if (dmic_num == NULL) { - dev_err(codec->dev, "Invalid DMIC\n"); + dev_err(component->dev, "Invalid DMIC\n"); return -EINVAL; } ret = kstrtouint(dmic_num, 10, &dmic); if (ret < 0 || dmic > 2) { - dev_err(codec->dev, "Invalid DMIC line on the codec\n"); + dev_err(component->dev, "Invalid DMIC line on the component\n"); return -EINVAL; } switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, LPASS_CDC_CLK_DMIC_B1_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_CLK_DMIC_B1_CTL, DMIC_B1_CTL_DMIC0_CLK_SEL_MASK, DMIC_B1_CTL_DMIC0_CLK_SEL_DIV3); switch (dmic) { case 1: - snd_soc_update_bits(codec, LPASS_CDC_TX1_DMIC_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_TX1_DMIC_CTL, TXN_DMIC_CTL_CLK_SEL_MASK, TXN_DMIC_CTL_CLK_SEL_DIV3); break; case 2: - snd_soc_update_bits(codec, LPASS_CDC_TX2_DMIC_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_TX2_DMIC_CTL, TXN_DMIC_CTL_CLK_SEL_MASK, TXN_DMIC_CTL_CLK_SEL_DIV3); break; @@ -575,20 +575,20 @@ static int msm8916_wcd_digital_get_clks(struct platform_device *pdev, return 0; } -static int msm8916_wcd_digital_codec_probe(struct snd_soc_codec *codec) +static int msm8916_wcd_digital_component_probe(struct snd_soc_component *component) { - struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(codec->dev); + struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(component->dev); - snd_soc_codec_set_drvdata(codec, priv); + snd_soc_component_set_drvdata(component, priv); return 0; } -static int msm8916_wcd_digital_codec_set_sysclk(struct snd_soc_codec *codec, +static int msm8916_wcd_digital_component_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct msm8916_wcd_digital_priv *p = dev_get_drvdata(codec->dev); + struct msm8916_wcd_digital_priv *p = dev_get_drvdata(component->dev); return clk_set_rate(p->mclk, freq); } @@ -618,18 +618,18 @@ static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream, rx_fs_rate = RX_I2S_CTL_RX_I2S_FS_RATE_F_48_KHZ; break; default: - dev_err(dai->codec->dev, "Invalid sampling rate %d\n", + dev_err(dai->component->dev, "Invalid sampling rate %d\n", params_rate(params)); return -EINVAL; } switch (substream->stream) { case SNDRV_PCM_STREAM_CAPTURE: - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_TX_I2S_CTL, TX_I2S_CTL_TX_I2S_FS_RATE_MASK, tx_fs_rate); break; case SNDRV_PCM_STREAM_PLAYBACK: - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_RX_I2S_CTL, RX_I2S_CTL_RX_I2S_FS_RATE_MASK, rx_fs_rate); break; default: @@ -638,18 +638,19 @@ static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream, switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_TX_I2S_CTL, TX_I2S_CTL_TX_I2S_MODE_MASK, TX_I2S_CTL_TX_I2S_MODE_16); - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_RX_I2S_CTL, RX_I2S_CTL_RX_I2S_MODE_MASK, RX_I2S_CTL_RX_I2S_MODE_16); break; + case SNDRV_PCM_FORMAT_S32_LE: - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_TX_I2S_CTL, TX_I2S_CTL_TX_I2S_MODE_MASK, TX_I2S_CTL_TX_I2S_MODE_32); - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_RX_I2S_CTL, RX_I2S_CTL_RX_I2S_MODE_MASK, RX_I2S_CTL_RX_I2S_MODE_32); break; @@ -780,32 +781,32 @@ static const struct snd_soc_dapm_route msm8916_wcd_digital_audio_map[] = { static int msm8916_wcd_digital_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct msm8916_wcd_digital_priv *msm8916_wcd; unsigned long mclk_rate; - msm8916_wcd = snd_soc_codec_get_drvdata(codec); - snd_soc_update_bits(codec, LPASS_CDC_CLK_MCLK_CTL, + msm8916_wcd = snd_soc_component_get_drvdata(component); + snd_soc_component_update_bits(component, LPASS_CDC_CLK_MCLK_CTL, MCLK_CTL_MCLK_EN_MASK, MCLK_CTL_MCLK_EN_ENABLE); - snd_soc_update_bits(codec, LPASS_CDC_CLK_PDM_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_CLK_PDM_CTL, LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK, LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_FB); mclk_rate = clk_get_rate(msm8916_wcd->mclk); switch (mclk_rate) { case 12288000: - snd_soc_update_bits(codec, LPASS_CDC_TOP_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_TOP_CTL, TOP_CTL_DIG_MCLK_FREQ_MASK, TOP_CTL_DIG_MCLK_FREQ_F_12_288MHZ); break; case 9600000: - snd_soc_update_bits(codec, LPASS_CDC_TOP_CTL, + snd_soc_component_update_bits(component, LPASS_CDC_TOP_CTL, TOP_CTL_DIG_MCLK_FREQ_MASK, TOP_CTL_DIG_MCLK_FREQ_F_9_6MHZ); break; default: - dev_err(codec->dev, "Invalid mclk rate %ld\n", mclk_rate); + dev_err(component->dev, "Invalid mclk rate %ld\n", mclk_rate); break; } return 0; @@ -814,7 +815,7 @@ static int msm8916_wcd_digital_startup(struct snd_pcm_substream *substream, static void msm8916_wcd_digital_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_PDM_CTL, + snd_soc_component_update_bits(dai->component, LPASS_CDC_CLK_PDM_CTL, LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK, 0); } @@ -851,18 +852,19 @@ static struct snd_soc_dai_driver msm8916_wcd_digital_dai[] = { }, }; -static const struct snd_soc_codec_driver msm8916_wcd_digital = { - .probe = msm8916_wcd_digital_codec_probe, - .set_sysclk = msm8916_wcd_digital_codec_set_sysclk, - .component_driver = { - .controls = msm8916_wcd_digital_snd_controls, - .num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls), - .dapm_widgets = msm8916_wcd_digital_dapm_widgets, - .num_dapm_widgets = - ARRAY_SIZE(msm8916_wcd_digital_dapm_widgets), - .dapm_routes = msm8916_wcd_digital_audio_map, - .num_dapm_routes = ARRAY_SIZE(msm8916_wcd_digital_audio_map), - }, +static const struct snd_soc_component_driver msm8916_wcd_digital = { + .probe = msm8916_wcd_digital_component_probe, + .set_sysclk = msm8916_wcd_digital_component_set_sysclk, + .controls = msm8916_wcd_digital_snd_controls, + .num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls), + .dapm_widgets = msm8916_wcd_digital_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(msm8916_wcd_digital_dapm_widgets), + .dapm_routes = msm8916_wcd_digital_audio_map, + .num_dapm_routes = ARRAY_SIZE(msm8916_wcd_digital_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config msm8916_codec_regmap_config = { @@ -915,7 +917,7 @@ static int msm8916_wcd_digital_probe(struct platform_device *pdev) dev_set_drvdata(dev, priv); - return snd_soc_register_codec(dev, &msm8916_wcd_digital, + return devm_snd_soc_register_component(dev, &msm8916_wcd_digital, msm8916_wcd_digital_dai, ARRAY_SIZE(msm8916_wcd_digital_dai)); } @@ -924,7 +926,6 @@ static int msm8916_wcd_digital_remove(struct platform_device *pdev) { struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); clk_disable_unprepare(priv->mclk); clk_disable_unprepare(priv->ahbclk); diff --git a/sound/soc/codecs/nau8540.c b/sound/soc/codecs/nau8540.c index b08fb7e243c3..17104f8dc1a9 100644 --- a/sound/soc/codecs/nau8540.c +++ b/sound/soc/codecs/nau8540.c @@ -236,8 +236,8 @@ static const struct snd_kcontrol_new digital_ch1_mux = static int adc_power_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); if (SND_SOC_DAPM_EVENT_ON(event)) { msleep(300); @@ -258,8 +258,8 @@ static int adc_power_control(struct snd_soc_dapm_widget *w, static int aiftx_power_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); if (SND_SOC_DAPM_EVENT_OFF(event)) { regmap_write(nau8540->regmap, NAU8540_REG_RST, 0x0001); @@ -379,8 +379,8 @@ static int nau8540_clock_check(struct nau8540 *nau8540, int rate, int osr) static int nau8540_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, osr; /* CLK_ADC = OSR * FS @@ -422,8 +422,8 @@ static int nau8540_hw_params(struct snd_pcm_substream *substream, static int nau8540_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); unsigned int ctrl1_val = 0, ctrl2_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -493,8 +493,8 @@ static int nau8540_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int nau8540_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); unsigned int ctrl2_val = 0, ctrl4_val = 0; if (slots > 4 || ((tx_mask & 0xf0) && (tx_mask & 0xf))) @@ -649,10 +649,10 @@ static void nau8540_fll_apply(struct regmap *regmap, } /* freq_out must be 256*Fs in order to achieve the best performance */ -static int nau8540_set_pll(struct snd_soc_codec *codec, int pll_id, int source, +static int nau8540_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); struct nau8540_fll fll_param; int ret, fs; @@ -702,10 +702,10 @@ static int nau8540_set_pll(struct snd_soc_codec *codec, int pll_id, int source, return 0; } -static int nau8540_set_sysclk(struct snd_soc_codec *codec, +static int nau8540_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); switch (clk_id) { case NAU8540_CLK_DIS: @@ -777,9 +777,9 @@ static void nau8540_init_regs(struct nau8540 *nau8540) NAU8540_I2S_DO34_TRI, NAU8540_I2S_DO34_TRI); } -static int __maybe_unused nau8540_suspend(struct snd_soc_codec *codec) +static int __maybe_unused nau8540_suspend(struct snd_soc_component *component) { - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); regcache_cache_only(nau8540->regmap, true); regcache_mark_dirty(nau8540->regmap); @@ -787,9 +787,9 @@ static int __maybe_unused nau8540_suspend(struct snd_soc_codec *codec) return 0; } -static int __maybe_unused nau8540_resume(struct snd_soc_codec *codec) +static int __maybe_unused nau8540_resume(struct snd_soc_component *component) { - struct nau8540 *nau8540 = snd_soc_codec_get_drvdata(codec); + struct nau8540 *nau8540 = snd_soc_component_get_drvdata(component); regcache_cache_only(nau8540->regmap, false); regcache_sync(nau8540->regmap); @@ -797,21 +797,22 @@ static int __maybe_unused nau8540_resume(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver nau8540_codec_driver = { - .set_sysclk = nau8540_set_sysclk, - .set_pll = nau8540_set_pll, - .suspend = nau8540_suspend, - .resume = nau8540_resume, - .suspend_bias_off = true, - - .component_driver = { - .controls = nau8540_snd_controls, - .num_controls = ARRAY_SIZE(nau8540_snd_controls), - .dapm_widgets = nau8540_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(nau8540_dapm_widgets), - .dapm_routes = nau8540_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(nau8540_dapm_routes), - }, +static const struct snd_soc_component_driver nau8540_component_driver = { + .set_sysclk = nau8540_set_sysclk, + .set_pll = nau8540_set_pll, + .suspend = nau8540_suspend, + .resume = nau8540_resume, + .controls = nau8540_snd_controls, + .num_controls = ARRAY_SIZE(nau8540_snd_controls), + .dapm_widgets = nau8540_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(nau8540_dapm_widgets), + .dapm_routes = nau8540_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(nau8540_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config nau8540_regmap_config = { @@ -856,17 +857,10 @@ static int nau8540_i2c_probe(struct i2c_client *i2c, nau8540_reset_chip(nau8540->regmap); nau8540_init_regs(nau8540); - return snd_soc_register_codec(dev, - &nau8540_codec_driver, &nau8540_dai, 1); -} - -static int nau8540_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; + return devm_snd_soc_register_component(dev, + &nau8540_component_driver, &nau8540_dai, 1); } - static const struct i2c_device_id nau8540_i2c_ids[] = { { "nau8540", 0 }, { } @@ -887,7 +881,6 @@ static struct i2c_driver nau8540_i2c_driver = { .of_match_table = of_match_ptr(nau8540_of_ids), }, .probe = nau8540_i2c_probe, - .remove = nau8540_i2c_remove, .id_table = nau8540_i2c_ids, }; module_i2c_driver(nau8540_i2c_driver); diff --git a/sound/soc/codecs/nau8810.c b/sound/soc/codecs/nau8810.c index c8e2451ae0a3..ca2ba1c7bb9a 100644 --- a/sound/soc/codecs/nau8810.c +++ b/sound/soc/codecs/nau8810.c @@ -167,8 +167,8 @@ static bool nau8810_volatile_reg(struct device *dev, unsigned int reg) static int nau8810_eq_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); struct soc_bytes_ext *params = (void *)kcontrol->private_value; int i, reg, reg_val; u16 *val; @@ -198,8 +198,8 @@ static int nau8810_eq_get(struct snd_kcontrol *kcontrol, static int nau8810_eq_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); struct soc_bytes_ext *params = (void *)kcontrol->private_value; void *data; u16 *val, value; @@ -219,7 +219,7 @@ static int nau8810_eq_put(struct snd_kcontrol *kcontrol, value = be16_to_cpu(*(val + i)); ret = regmap_write(nau8810->regmap, reg + i, value); if (ret) { - dev_err(codec->dev, "EQ configuration fail, register: %x ret: %d\n", + dev_err(component->dev, "EQ configuration fail, register: %x ret: %d\n", reg + i, ret); kfree(data); return ret; @@ -399,8 +399,8 @@ static const struct snd_kcontrol_new nau8810_loopback = static int check_mclk_select_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); unsigned int value; regmap_read(nau8810->regmap, NAU8810_REG_CLOCK, &value); @@ -485,8 +485,8 @@ static const struct snd_soc_dapm_route nau8810_dapm_routes[] = { static int nau8810_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); nau8810->clk_id = clk_id; nau8810->sysclk = freq; @@ -538,8 +538,8 @@ static int nau88l0_calc_pll(unsigned int pll_in, static int nau8810_set_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = codec_dai->codec; - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); struct regmap *map = nau8810->regmap; struct nau8810_pll *pll_param = &nau8810->pll; int ret, fs; @@ -577,8 +577,8 @@ static int nau8810_set_pll(struct snd_soc_dai *codec_dai, int pll_id, static int nau8810_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); u16 ctrl1_val = 0, ctrl2_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -667,8 +667,8 @@ static int nau8810_mclk_clkdiv(struct nau8810 *nau8810, int rate) static int nau8810_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); int val_len = 0, val_rate = 0, ret = 0; switch (params_width(params)) { @@ -723,10 +723,10 @@ static int nau8810_pcm_hw_params(struct snd_pcm_substream *substream, return ret; } -static int nau8810_set_bias_level(struct snd_soc_codec *codec, +static int nau8810_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct nau8810 *nau8810 = snd_soc_codec_get_drvdata(codec); + struct nau8810 *nau8810 = snd_soc_component_get_drvdata(component); struct regmap *map = nau8810->regmap; switch (level) { @@ -741,7 +741,7 @@ static int nau8810_set_bias_level(struct snd_soc_codec *codec, NAU8810_IOBUF_EN | NAU8810_ABIAS_EN, NAU8810_IOBUF_EN | NAU8810_ABIAS_EN); - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { regcache_sync(map); regmap_update_bits(map, NAU8810_REG_POWER1, NAU8810_REFIMP_MASK, NAU8810_REFIMP_3K); @@ -808,18 +808,19 @@ static const struct regmap_config nau8810_regmap_config = { .num_reg_defaults = ARRAY_SIZE(nau8810_reg_defaults), }; -static const struct snd_soc_codec_driver nau8810_codec_driver = { - .set_bias_level = nau8810_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = nau8810_snd_controls, - .num_controls = ARRAY_SIZE(nau8810_snd_controls), - .dapm_widgets = nau8810_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(nau8810_dapm_widgets), - .dapm_routes = nau8810_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(nau8810_dapm_routes), - }, +static const struct snd_soc_component_driver nau8810_component_driver = { + .set_bias_level = nau8810_set_bias_level, + .controls = nau8810_snd_controls, + .num_controls = ARRAY_SIZE(nau8810_snd_controls), + .dapm_widgets = nau8810_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(nau8810_dapm_widgets), + .dapm_routes = nau8810_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(nau8810_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int nau8810_i2c_probe(struct i2c_client *i2c, @@ -842,15 +843,8 @@ static int nau8810_i2c_probe(struct i2c_client *i2c, regmap_write(nau8810->regmap, NAU8810_REG_RESET, 0x00); - return snd_soc_register_codec(dev, - &nau8810_codec_driver, &nau8810_dai, 1); -} - -static int nau8810_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - - return 0; + return devm_snd_soc_register_component(dev, + &nau8810_component_driver, &nau8810_dai, 1); } static const struct i2c_device_id nau8810_i2c_id[] = { @@ -873,7 +867,6 @@ static struct i2c_driver nau8810_i2c_driver = { .of_match_table = of_match_ptr(nau8810_of_match), }, .probe = nau8810_i2c_probe, - .remove = nau8810_i2c_remove, .id_table = nau8810_i2c_id, }; diff --git a/sound/soc/codecs/nau8824.c b/sound/soc/codecs/nau8824.c index 088e0cef4cb8..637e9527805f 100644 --- a/sound/soc/codecs/nau8824.c +++ b/sound/soc/codecs/nau8824.c @@ -414,8 +414,8 @@ static const struct snd_kcontrol_new nau8824_snd_controls[] = { static int nau8824_output_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -437,8 +437,8 @@ static int nau8824_output_dac_event(struct snd_soc_dapm_widget *w, static int nau8824_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -461,8 +461,8 @@ static int nau8824_spk_event(struct snd_soc_dapm_widget *w, static int nau8824_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -487,10 +487,14 @@ static int nau8824_pump_event(struct snd_soc_dapm_widget *w, static int system_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); + struct regmap *regmap = nau8824->regmap; + unsigned int value; + bool clk_fll, error; if (SND_SOC_DAPM_EVENT_OFF(event)) { + dev_dbg(nau8824->dev, "system clock control : POWER OFF\n"); /* Set clock source to disable or internal clock before the * playback or capture end. Codec needs clock for Jack * detection and button press if jack inserted; otherwise, @@ -502,15 +506,48 @@ static int system_clock_control(struct snd_soc_dapm_widget *w, } else { nau8824_config_sysclk(nau8824, NAU8824_CLK_DIS, 0); } + } else { + dev_dbg(nau8824->dev, "system clock control : POWER ON\n"); + /* Check the clock source setting is proper or not + * no matter the source is from FLL or MCLK. + */ + regmap_read(regmap, NAU8824_REG_FLL1, &value); + clk_fll = value & NAU8824_FLL_RATIO_MASK; + /* It's error to use internal clock when playback */ + regmap_read(regmap, NAU8824_REG_FLL6, &value); + error = value & NAU8824_DCO_EN; + if (!error) { + /* Check error depending on source is FLL or MCLK. */ + regmap_read(regmap, NAU8824_REG_CLK_DIVIDER, &value); + if (clk_fll) + error = !(value & NAU8824_CLK_SRC_VCO); + else + error = value & NAU8824_CLK_SRC_VCO; + } + /* Recover the clock source setting if error. */ + if (error) { + if (clk_fll) { + regmap_update_bits(regmap, + NAU8824_REG_FLL6, NAU8824_DCO_EN, 0); + regmap_update_bits(regmap, + NAU8824_REG_CLK_DIVIDER, + NAU8824_CLK_SRC_MASK, + NAU8824_CLK_SRC_VCO); + } else { + nau8824_config_sysclk(nau8824, + NAU8824_CLK_MCLK, 0); + } + } } + return 0; } static int dmic_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); int src; /* The DMIC clock is gotten from system clock (256fs) divided by @@ -591,7 +628,8 @@ static const struct snd_kcontrol_new nau8824_dacr_mux = static const struct snd_soc_dapm_widget nau8824_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("System Clock", SND_SOC_NOPM, 0, 0, - system_clock_control, SND_SOC_DAPM_POST_PMD), + system_clock_control, SND_SOC_DAPM_POST_PMD | + SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_INPUT("HSMIC1"), SND_SOC_DAPM_INPUT("HSMIC2"), @@ -988,8 +1026,8 @@ static int nau8824_clock_check(struct nau8824 *nau8824, static int nau8824_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, osr, ctrl_val, bclk_fs, bclk_div; nau8824_sema_acquire(nau8824, HZ); @@ -1072,8 +1110,8 @@ static int nau8824_hw_params(struct snd_pcm_substream *substream, static int nau8824_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); unsigned int ctrl1_val = 0, ctrl2_val = 0; nau8824_sema_acquire(nau8824, HZ); @@ -1149,8 +1187,8 @@ static int nau8824_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int nau8824_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); unsigned int tslot_l = 0, ctrl_val = 0; if (slots > 4 || ((tx_mask & 0xf0) && (tx_mask & 0xf)) || @@ -1288,10 +1326,10 @@ static void nau8824_fll_apply(struct regmap *regmap, } /* freq_out must be 256*Fs in order to achieve the best performance */ -static int nau8824_set_pll(struct snd_soc_codec *codec, int pll_id, int source, +static int nau8824_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); struct nau8824_fll fll_param; int ret, fs; @@ -1374,10 +1412,10 @@ static int nau8824_config_sysclk(struct nau8824 *nau8824, return 0; } -static int nau8824_set_sysclk(struct snd_soc_codec *codec, +static int nau8824_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); return nau8824_config_sysclk(nau8824, clk_id, freq); } @@ -1403,10 +1441,10 @@ static void nau8824_resume_setup(struct nau8824 *nau8824) } } -static int nau8824_set_bias_level(struct snd_soc_codec *codec, +static int nau8824_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -1416,7 +1454,7 @@ static int nau8824_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* Setup codec configuration after resume */ nau8824_resume_setup(nau8824); } @@ -1434,23 +1472,23 @@ static int nau8824_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int nau8824_codec_probe(struct snd_soc_codec *codec) +static int nau8824_component_probe(struct snd_soc_component *component) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); nau8824->dapm = dapm; return 0; } -static int __maybe_unused nau8824_suspend(struct snd_soc_codec *codec) +static int __maybe_unused nau8824_suspend(struct snd_soc_component *component) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); if (nau8824->irq) { disable_irq(nau8824->irq); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); } regcache_cache_only(nau8824->regmap, true); regcache_mark_dirty(nau8824->regmap); @@ -1458,9 +1496,9 @@ static int __maybe_unused nau8824_suspend(struct snd_soc_codec *codec) return 0; } -static int __maybe_unused nau8824_resume(struct snd_soc_codec *codec) +static int __maybe_unused nau8824_resume(struct snd_soc_component *component) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); regcache_cache_only(nau8824->regmap, false); regcache_sync(nau8824->regmap); @@ -1475,23 +1513,24 @@ static int __maybe_unused nau8824_resume(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver nau8824_codec_driver = { - .probe = nau8824_codec_probe, - .set_sysclk = nau8824_set_sysclk, - .set_pll = nau8824_set_pll, - .set_bias_level = nau8824_set_bias_level, - .suspend = nau8824_suspend, - .resume = nau8824_resume, - .suspend_bias_off = true, - - .component_driver = { - .controls = nau8824_snd_controls, - .num_controls = ARRAY_SIZE(nau8824_snd_controls), - .dapm_widgets = nau8824_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(nau8824_dapm_widgets), - .dapm_routes = nau8824_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(nau8824_dapm_routes), - }, +static const struct snd_soc_component_driver nau8824_component_driver = { + .probe = nau8824_component_probe, + .set_sysclk = nau8824_set_sysclk, + .set_pll = nau8824_set_pll, + .set_bias_level = nau8824_set_bias_level, + .suspend = nau8824_suspend, + .resume = nau8824_resume, + .controls = nau8824_snd_controls, + .num_controls = ARRAY_SIZE(nau8824_snd_controls), + .dapm_widgets = nau8824_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(nau8824_dapm_widgets), + .dapm_routes = nau8824_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(nau8824_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct snd_soc_dai_ops nau8824_dai_ops = { @@ -1547,10 +1586,10 @@ static const struct regmap_config nau8824_regmap_config = { * events will be routed to the given jack. Jack can be null to stop * reporting. */ -int nau8824_enable_jack_detect(struct snd_soc_codec *codec, +int nau8824_enable_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct nau8824 *nau8824 = snd_soc_codec_get_drvdata(codec); + struct nau8824 *nau8824 = snd_soc_component_get_drvdata(component); int ret; nau8824->jack = jack; @@ -1838,15 +1877,8 @@ static int nau8824_i2c_probe(struct i2c_client *i2c, if (i2c->irq) nau8824_setup_irq(nau8824); - return snd_soc_register_codec(dev, - &nau8824_codec_driver, &nau8824_dai, 1); -} - - -static int nau8824_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; + return devm_snd_soc_register_component(dev, + &nau8824_component_driver, &nau8824_dai, 1); } static const struct i2c_device_id nau8824_i2c_ids[] = { @@ -1878,7 +1910,6 @@ static struct i2c_driver nau8824_i2c_driver = { .acpi_match_table = ACPI_PTR(nau8824_acpi_match), }, .probe = nau8824_i2c_probe, - .remove = nau8824_i2c_remove, .id_table = nau8824_i2c_ids, }; module_i2c_driver(nau8824_i2c_driver); diff --git a/sound/soc/codecs/nau8824.h b/sound/soc/codecs/nau8824.h index 21eae2431c83..6184a2b5c941 100644 --- a/sound/soc/codecs/nau8824.h +++ b/sound/soc/codecs/nau8824.h @@ -471,7 +471,7 @@ struct nau8824_osr_attr { }; -int nau8824_enable_jack_detect(struct snd_soc_codec *codec, +int nau8824_enable_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif /* _NAU8824_H */ diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c index a1b697b6fb64..dc6ea4987b7d 100644 --- a/sound/soc/codecs/nau8825.c +++ b/sound/soc/codecs/nau8825.c @@ -914,8 +914,8 @@ static bool nau8825_volatile_reg(struct device *dev, unsigned int reg) static int nau8825_adc_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -938,8 +938,8 @@ static int nau8825_adc_event(struct snd_soc_dapm_widget *w, static int nau8825_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -962,8 +962,8 @@ static int nau8825_pump_event(struct snd_soc_dapm_widget *w, static int nau8825_output_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -1244,8 +1244,8 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, osr, ctrl_val, bclk_fs, bclk_div; nau8825_sema_acquire(nau8825, 3 * HZ); @@ -1329,8 +1329,8 @@ static int nau8825_hw_params(struct snd_pcm_substream *substream, static int nau8825_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); unsigned int ctrl1_val = 0, ctrl2_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1427,10 +1427,10 @@ static struct snd_soc_dai_driver nau8825_dai = { * events will be routed to the given jack. Jack can be null to stop * reporting. */ -int nau8825_enable_jack_detect(struct snd_soc_codec *codec, +int nau8825_enable_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); struct regmap *regmap = nau8825->regmap; nau8825->jack = jack; @@ -1952,24 +1952,22 @@ static const struct regmap_config nau8825_regmap_config = { .num_reg_defaults = ARRAY_SIZE(nau8825_reg_defaults), }; -static int nau8825_codec_probe(struct snd_soc_codec *codec) +static int nau8825_component_probe(struct snd_soc_component *component) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); nau8825->dapm = dapm; return 0; } -static int nau8825_codec_remove(struct snd_soc_codec *codec) +static void nau8825_component_remove(struct snd_soc_component *component) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); /* Cancel and reset cross tak suppresstion detection funciton */ nau8825_xtalk_cancel(nau8825); - - return 0; } /** @@ -2084,20 +2082,20 @@ static void nau8825_fll_apply(struct nau8825 *nau8825, } /* freq_out must be 256*Fs in order to achieve the best performance */ -static int nau8825_set_pll(struct snd_soc_codec *codec, int pll_id, int source, +static int nau8825_set_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); struct nau8825_fll fll_param; int ret, fs; fs = freq_out / 256; ret = nau8825_calc_fll_param(freq_in, fs, &fll_param); if (ret < 0) { - dev_err(codec->dev, "Unsupported input clock %d\n", freq_in); + dev_err(component->dev, "Unsupported input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "mclk_src=%x ratio=%x fll_frac=%x fll_int=%x clk_ref_div=%x\n", + dev_dbg(component->dev, "mclk_src=%x ratio=%x fll_frac=%x fll_int=%x clk_ref_div=%x\n", fll_param.mclk_src, fll_param.ratio, fll_param.fll_frac, fll_param.fll_int, fll_param.clk_ref_div); @@ -2298,10 +2296,10 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id, return 0; } -static int nau8825_set_sysclk(struct snd_soc_codec *codec, int clk_id, +static int nau8825_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); return nau8825_configure_sysclk(nau8825, clk_id, freq); } @@ -2331,10 +2329,10 @@ static int nau8825_resume_setup(struct nau8825 *nau8825) return 0; } -static int nau8825_set_bias_level(struct snd_soc_codec *codec, +static int nau8825_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -2345,11 +2343,11 @@ static int nau8825_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { if (nau8825->mclk_freq) { ret = clk_prepare_enable(nau8825->mclk); if (ret) { - dev_err(nau8825->dev, "Unable to prepare codec mclk\n"); + dev_err(nau8825->dev, "Unable to prepare component mclk\n"); return ret; } } @@ -2383,12 +2381,12 @@ static int nau8825_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int __maybe_unused nau8825_suspend(struct snd_soc_codec *codec) +static int __maybe_unused nau8825_suspend(struct snd_soc_component *component) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); disable_irq(nau8825->irq); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); /* Power down codec power; don't suppoet button wakeup */ snd_soc_dapm_disable_pin(nau8825->dapm, "SAR"); snd_soc_dapm_disable_pin(nau8825->dapm, "MICBIAS"); @@ -2399,9 +2397,9 @@ static int __maybe_unused nau8825_suspend(struct snd_soc_codec *codec) return 0; } -static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec) +static int __maybe_unused nau8825_resume(struct snd_soc_component *component) { - struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); + struct nau8825 *nau8825 = snd_soc_component_get_drvdata(component); int ret; regcache_cache_only(nau8825->regmap, false); @@ -2415,24 +2413,25 @@ static int __maybe_unused nau8825_resume(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver nau8825_codec_driver = { - .probe = nau8825_codec_probe, - .remove = nau8825_codec_remove, - .set_sysclk = nau8825_set_sysclk, - .set_pll = nau8825_set_pll, - .set_bias_level = nau8825_set_bias_level, - .suspend_bias_off = true, - .suspend = nau8825_suspend, - .resume = nau8825_resume, - - .component_driver = { - .controls = nau8825_controls, - .num_controls = ARRAY_SIZE(nau8825_controls), - .dapm_widgets = nau8825_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(nau8825_dapm_widgets), - .dapm_routes = nau8825_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(nau8825_dapm_routes), - }, +static const struct snd_soc_component_driver nau8825_component_driver = { + .probe = nau8825_component_probe, + .remove = nau8825_component_remove, + .set_sysclk = nau8825_set_sysclk, + .set_pll = nau8825_set_pll, + .set_bias_level = nau8825_set_bias_level, + .suspend = nau8825_suspend, + .resume = nau8825_resume, + .controls = nau8825_controls, + .num_controls = ARRAY_SIZE(nau8825_controls), + .dapm_widgets = nau8825_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(nau8825_dapm_widgets), + .dapm_routes = nau8825_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(nau8825_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static void nau8825_reset_chip(struct regmap *regmap) @@ -2619,13 +2618,13 @@ static int nau8825_i2c_probe(struct i2c_client *i2c, if (i2c->irq) nau8825_setup_irq(nau8825); - return snd_soc_register_codec(&i2c->dev, &nau8825_codec_driver, + return devm_snd_soc_register_component(&i2c->dev, + &nau8825_component_driver, &nau8825_dai, 1); } static int nau8825_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/nau8825.h b/sound/soc/codecs/nau8825.h index f7e732125882..f6074c618569 100644 --- a/sound/soc/codecs/nau8825.h +++ b/sound/soc/codecs/nau8825.h @@ -480,7 +480,7 @@ struct nau8825 { bool xtalk_baktab_initialized; /* True if initialized. */ }; -int nau8825_enable_jack_detect(struct snd_soc_codec *codec, +int nau8825_enable_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); diff --git a/sound/soc/codecs/pcm1681.c b/sound/soc/codecs/pcm1681.c index c7e28dd2e815..84777d3fa464 100644 --- a/sound/soc/codecs/pcm1681.c +++ b/sound/soc/codecs/pcm1681.c @@ -90,9 +90,9 @@ struct pcm1681_private { static const int pcm1681_deemph[] = { 44100, 48000, 32000 }; -static int pcm1681_set_deemph(struct snd_soc_codec *codec) +static int pcm1681_set_deemph(struct snd_soc_component *component) { - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); int i = 0, val = -1, enable = 0; if (priv->deemph) { @@ -120,8 +120,8 @@ static int pcm1681_set_deemph(struct snd_soc_codec *codec) static int pcm1681_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = priv->deemph; @@ -131,23 +131,23 @@ static int pcm1681_get_deemph(struct snd_kcontrol *kcontrol, static int pcm1681_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); priv->deemph = ucontrol->value.integer.value[0]; - return pcm1681_set_deemph(codec); + return pcm1681_set_deemph(component); } static int pcm1681_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); /* The PCM1681 can only be slave to all clocks */ if ((format & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(codec->dev, "Invalid clocking mode\n"); + dev_err(component->dev, "Invalid clocking mode\n"); return -EINVAL; } @@ -158,8 +158,8 @@ static int pcm1681_set_dai_fmt(struct snd_soc_dai *codec_dai, static int pcm1681_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); int val; if (mute) @@ -174,8 +174,8 @@ static int pcm1681_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm1681_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm1681_private *priv = snd_soc_component_get_drvdata(component); int val = 0, ret; priv->rate = params_rate(params); @@ -200,7 +200,7 @@ static int pcm1681_hw_params(struct snd_pcm_substream *substream, val = 0x05; break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -208,7 +208,7 @@ static int pcm1681_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - return pcm1681_set_deemph(codec); + return pcm1681_set_deemph(component); } static const struct snd_soc_dai_ops pcm1681_dai_ops = { @@ -288,15 +288,17 @@ static const struct regmap_config pcm1681_regmap = { .readable_reg = pcm1681_accessible_reg, }; -static const struct snd_soc_codec_driver soc_codec_dev_pcm1681 = { - .component_driver = { - .controls = pcm1681_controls, - .num_controls = ARRAY_SIZE(pcm1681_controls), - .dapm_widgets = pcm1681_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm1681_dapm_widgets), - .dapm_routes = pcm1681_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm1681_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_pcm1681 = { + .controls = pcm1681_controls, + .num_controls = ARRAY_SIZE(pcm1681_controls), + .dapm_widgets = pcm1681_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm1681_dapm_widgets), + .dapm_routes = pcm1681_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm1681_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct i2c_device_id pcm1681_i2c_id[] = { @@ -324,16 +326,11 @@ static int pcm1681_i2c_probe(struct i2c_client *client, i2c_set_clientdata(client, priv); - return snd_soc_register_codec(&client->dev, &soc_codec_dev_pcm1681, + return devm_snd_soc_register_component(&client->dev, + &soc_component_dev_pcm1681, &pcm1681_dai, 1); } -static int pcm1681_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static struct i2c_driver pcm1681_i2c_driver = { .driver = { .name = "pcm1681", @@ -341,7 +338,6 @@ static struct i2c_driver pcm1681_i2c_driver = { }, .id_table = pcm1681_i2c_id, .probe = pcm1681_i2c_probe, - .remove = pcm1681_i2c_remove, }; module_i2c_driver(pcm1681_i2c_driver); diff --git a/sound/soc/codecs/pcm1789-i2c.c b/sound/soc/codecs/pcm1789-i2c.c new file mode 100644 index 000000000000..327ec584f240 --- /dev/null +++ b/sound/soc/codecs/pcm1789-i2c.c @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: GPL-2.0 +// Audio driver for PCM1789 I2C +// Copyright (C) 2018 Bootlin +// Mylène Josserand <mylene.josserand@bootlin.com> + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regmap.h> + +#include "pcm1789.h" + +static int pcm1789_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct regmap *regmap; + int ret; + + regmap = devm_regmap_init_i2c(client, &pcm1789_regmap_config); + if (IS_ERR(regmap)) { + ret = PTR_ERR(regmap); + dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret); + return ret; + } + + return pcm1789_common_init(&client->dev, regmap); +} + +static int pcm1789_i2c_remove(struct i2c_client *client) +{ + return pcm1789_common_exit(&client->dev); +} + +static const struct of_device_id pcm1789_of_match[] = { + { .compatible = "ti,pcm1789", }, + { } +}; +MODULE_DEVICE_TABLE(of, pcm1789_of_match); + +static const struct i2c_device_id pcm1789_i2c_ids[] = { + { "pcm1789", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, pcm1789_i2c_ids); + +static struct i2c_driver pcm1789_i2c_driver = { + .driver = { + .name = "pcm1789", + .of_match_table = of_match_ptr(pcm1789_of_match), + }, + .id_table = pcm1789_i2c_ids, + .probe = pcm1789_i2c_probe, + .remove = pcm1789_i2c_remove, +}; + +module_i2c_driver(pcm1789_i2c_driver); + +MODULE_DESCRIPTION("ASoC PCM1789 I2C driver"); +MODULE_AUTHOR("Mylène Josserand <mylene.josserand@bootlin.com>"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/pcm1789.c b/sound/soc/codecs/pcm1789.c new file mode 100644 index 000000000000..507ac9412d6c --- /dev/null +++ b/sound/soc/codecs/pcm1789.c @@ -0,0 +1,274 @@ +// SPDX-License-Identifier: GPL-2.0 +// Audio driver for PCM1789 +// Copyright (C) 2018 Bootlin +// Mylène Josserand <mylene.josserand@bootlin.com> + +#include <linux/gpio.h> +#include <linux/module.h> +#include <linux/workqueue.h> + +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/tlv.h> + +#include "pcm1789.h" + +#define PCM1789_MUTE_CONTROL 0x10 +#define PCM1789_FMT_CONTROL 0x11 +#define PCM1789_SOFT_MUTE 0x14 +#define PCM1789_DAC_VOL_LEFT 0x18 +#define PCM1789_DAC_VOL_RIGHT 0x19 + +#define PCM1789_FMT_MASK 0x07 +#define PCM1789_MUTE_MASK 0x03 +#define PCM1789_MUTE_SRET 0x06 + +struct pcm1789_private { + struct regmap *regmap; + unsigned int format; + unsigned int rate; + struct gpio_desc *reset; + struct work_struct work; + struct device *dev; +}; + +static const struct reg_default pcm1789_reg_defaults[] = { + { PCM1789_FMT_CONTROL, 0x00 }, + { PCM1789_SOFT_MUTE, 0x00 }, + { PCM1789_DAC_VOL_LEFT, 0xff }, + { PCM1789_DAC_VOL_RIGHT, 0xff }, +}; + +static bool pcm1789_accessible_reg(struct device *dev, unsigned int reg) +{ + return reg >= PCM1789_MUTE_CONTROL && reg <= PCM1789_DAC_VOL_RIGHT; +} + +static bool pcm1789_writeable_reg(struct device *dev, unsigned int reg) +{ + return pcm1789_accessible_reg(dev, reg); +} + +static int pcm1789_set_dai_fmt(struct snd_soc_dai *codec_dai, + unsigned int format) +{ + struct snd_soc_component *component = codec_dai->component; + struct pcm1789_private *priv = snd_soc_component_get_drvdata(component); + + priv->format = format; + + return 0; +} + +static int pcm1789_digital_mute(struct snd_soc_dai *codec_dai, int mute) +{ + struct snd_soc_component *component = codec_dai->component; + struct pcm1789_private *priv = snd_soc_component_get_drvdata(component); + + return regmap_update_bits(priv->regmap, PCM1789_SOFT_MUTE, + PCM1789_MUTE_MASK, + mute ? 0 : PCM1789_MUTE_MASK); +} + +static int pcm1789_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *codec_dai) +{ + struct snd_soc_component *component = codec_dai->component; + struct pcm1789_private *priv = snd_soc_component_get_drvdata(component); + int val = 0, ret; + + priv->rate = params_rate(params); + + switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_RIGHT_J: + switch (params_width(params)) { + case 24: + val = 2; + break; + case 16: + val = 3; + break; + default: + return -EINVAL; + } + break; + case SND_SOC_DAIFMT_I2S: + switch (params_width(params)) { + case 16: + case 24: + case 32: + val = 0; + break; + default: + return -EINVAL; + } + break; + case SND_SOC_DAIFMT_LEFT_J: + switch (params_width(params)) { + case 16: + case 24: + case 32: + val = 1; + break; + default: + return -EINVAL; + } + break; + default: + dev_err(component->dev, "Invalid DAI format\n"); + return -EINVAL; + } + + ret = regmap_update_bits(priv->regmap, PCM1789_FMT_CONTROL, + PCM1789_FMT_MASK, val); + if (ret < 0) + return ret; + + return 0; +} + +static void pcm1789_work_queue(struct work_struct *work) +{ + struct pcm1789_private *priv = container_of(work, + struct pcm1789_private, + work); + + /* Perform a software reset to remove codec from desynchronized state */ + if (regmap_update_bits(priv->regmap, PCM1789_MUTE_CONTROL, + 0x3 << PCM1789_MUTE_SRET, 0) < 0) + dev_err(priv->dev, "Error while setting SRET"); +} + +static int pcm1789_trigger(struct snd_pcm_substream *substream, int cmd, + struct snd_soc_dai *dai) +{ + struct snd_soc_component *component = dai->component; + struct pcm1789_private *priv = snd_soc_component_get_drvdata(component); + int ret = 0; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + schedule_work(&priv->work); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + break; + default: + ret = -EINVAL; + } + + return ret; +} + +static const struct snd_soc_dai_ops pcm1789_dai_ops = { + .set_fmt = pcm1789_set_dai_fmt, + .hw_params = pcm1789_hw_params, + .digital_mute = pcm1789_digital_mute, + .trigger = pcm1789_trigger, +}; + +static const DECLARE_TLV_DB_SCALE(pcm1789_dac_tlv, -12000, 50, 1); + +static const struct snd_kcontrol_new pcm1789_controls[] = { + SOC_DOUBLE_R_RANGE_TLV("DAC Playback Volume", PCM1789_DAC_VOL_LEFT, + PCM1789_DAC_VOL_RIGHT, 0, 0xf, 0xff, 0, + pcm1789_dac_tlv), +}; + +static const struct snd_soc_dapm_widget pcm1789_dapm_widgets[] = { + SND_SOC_DAPM_OUTPUT("IOUTL+"), + SND_SOC_DAPM_OUTPUT("IOUTL-"), + SND_SOC_DAPM_OUTPUT("IOUTR+"), + SND_SOC_DAPM_OUTPUT("IOUTR-"), +}; + +static const struct snd_soc_dapm_route pcm1789_dapm_routes[] = { + { "IOUTL+", NULL, "Playback" }, + { "IOUTL-", NULL, "Playback" }, + { "IOUTR+", NULL, "Playback" }, + { "IOUTR-", NULL, "Playback" }, +}; + +static struct snd_soc_dai_driver pcm1789_dai = { + .name = "pcm1789-hifi", + .playback = { + .stream_name = "Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_CONTINUOUS, + .rate_min = 10000, + .rate_max = 200000, + .formats = PCM1789_FORMATS, + }, + .ops = &pcm1789_dai_ops, +}; + +const struct regmap_config pcm1789_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = PCM1789_DAC_VOL_RIGHT, + .reg_defaults = pcm1789_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(pcm1789_reg_defaults), + .writeable_reg = pcm1789_writeable_reg, + .readable_reg = pcm1789_accessible_reg, +}; +EXPORT_SYMBOL_GPL(pcm1789_regmap_config); + +static const struct snd_soc_component_driver soc_component_dev_pcm1789 = { + .controls = pcm1789_controls, + .num_controls = ARRAY_SIZE(pcm1789_controls), + .dapm_widgets = pcm1789_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm1789_dapm_widgets), + .dapm_routes = pcm1789_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm1789_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; + +int pcm1789_common_init(struct device *dev, struct regmap *regmap) +{ + struct pcm1789_private *pcm1789; + + pcm1789 = devm_kzalloc(dev, sizeof(struct pcm1789_private), + GFP_KERNEL); + if (!pcm1789) + return -ENOMEM; + + pcm1789->regmap = regmap; + pcm1789->dev = dev; + dev_set_drvdata(dev, pcm1789); + + pcm1789->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(pcm1789->reset)) + return PTR_ERR(pcm1789->reset); + + gpiod_set_value_cansleep(pcm1789->reset, 0); + msleep(300); + + INIT_WORK(&pcm1789->work, pcm1789_work_queue); + + return devm_snd_soc_register_component(dev, &soc_component_dev_pcm1789, + &pcm1789_dai, 1); +} +EXPORT_SYMBOL_GPL(pcm1789_common_init); + +int pcm1789_common_exit(struct device *dev) +{ + struct pcm1789_private *priv = dev_get_drvdata(dev); + + if (&priv->work) + flush_work(&priv->work); + + return 0; +} +EXPORT_SYMBOL_GPL(pcm1789_common_exit); + +MODULE_DESCRIPTION("ASoC PCM1789 driver"); +MODULE_AUTHOR("Mylène Josserand <mylene.josserand@free-electrons.com>"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/pcm1789.h b/sound/soc/codecs/pcm1789.h new file mode 100644 index 000000000000..c446d789ed48 --- /dev/null +++ b/sound/soc/codecs/pcm1789.h @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 +// Definitions for PCM1789 audio driver +// Copyright (C) 2018 Bootlin +// Mylène Josserand <mylene.josserand@bootlin.com> + +#ifndef __PCM1789_H__ +#define __PCM1789_H__ + +#define PCM1789_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \ + SNDRV_PCM_FMTBIT_S16_LE) + +extern const struct regmap_config pcm1789_regmap_config; + +int pcm1789_common_init(struct device *dev, struct regmap *regmap); +int pcm1789_common_exit(struct device *dev); + +#endif diff --git a/sound/soc/codecs/pcm179x-i2c.c b/sound/soc/codecs/pcm179x-i2c.c index 4118106abb8d..03747966c6bc 100644 --- a/sound/soc/codecs/pcm179x-i2c.c +++ b/sound/soc/codecs/pcm179x-i2c.c @@ -39,11 +39,6 @@ static int pcm179x_i2c_probe(struct i2c_client *client, return pcm179x_common_init(&client->dev, regmap); } -static int pcm179x_i2c_remove(struct i2c_client *client) -{ - return pcm179x_common_exit(&client->dev); -} - static const struct of_device_id pcm179x_of_match[] = { { .compatible = "ti,pcm1792a", }, { } @@ -63,7 +58,6 @@ static struct i2c_driver pcm179x_i2c_driver = { }, .id_table = pcm179x_i2c_ids, .probe = pcm179x_i2c_probe, - .remove = pcm179x_i2c_remove, }; module_i2c_driver(pcm179x_i2c_driver); diff --git a/sound/soc/codecs/pcm179x-spi.c b/sound/soc/codecs/pcm179x-spi.c index da924d444083..89ad715676fc 100644 --- a/sound/soc/codecs/pcm179x-spi.c +++ b/sound/soc/codecs/pcm179x-spi.c @@ -38,11 +38,6 @@ static int pcm179x_spi_probe(struct spi_device *spi) return pcm179x_common_init(&spi->dev, regmap); } -static int pcm179x_spi_remove(struct spi_device *spi) -{ - return pcm179x_common_exit(&spi->dev); -} - static const struct of_device_id pcm179x_of_match[] = { { .compatible = "ti,pcm1792a", }, { } @@ -62,7 +57,6 @@ static struct spi_driver pcm179x_spi_driver = { }, .id_table = pcm179x_spi_ids, .probe = pcm179x_spi_probe, - .remove = pcm179x_spi_remove, }; module_spi_driver(pcm179x_spi_driver); diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c index 82a3d9db32cb..4b311c06f97d 100644 --- a/sound/soc/codecs/pcm179x.c +++ b/sound/soc/codecs/pcm179x.c @@ -77,8 +77,8 @@ struct pcm179x_private { static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct pcm179x_private *priv = snd_soc_component_get_drvdata(component); priv->format = format; @@ -87,8 +87,8 @@ static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai, static int pcm179x_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm179x_private *priv = snd_soc_component_get_drvdata(component); int ret; ret = regmap_update_bits(priv->regmap, PCM179X_SOFT_MUTE, @@ -103,8 +103,8 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm179x_private *priv = snd_soc_component_get_drvdata(component); int val = 0, ret; priv->rate = params_rate(params); @@ -137,7 +137,7 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream, } break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -205,15 +205,17 @@ const struct regmap_config pcm179x_regmap_config = { }; EXPORT_SYMBOL_GPL(pcm179x_regmap_config); -static const struct snd_soc_codec_driver soc_codec_dev_pcm179x = { - .component_driver = { - .controls = pcm179x_controls, - .num_controls = ARRAY_SIZE(pcm179x_controls), - .dapm_widgets = pcm179x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm179x_dapm_widgets), - .dapm_routes = pcm179x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm179x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_pcm179x = { + .controls = pcm179x_controls, + .num_controls = ARRAY_SIZE(pcm179x_controls), + .dapm_widgets = pcm179x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm179x_dapm_widgets), + .dapm_routes = pcm179x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm179x_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; int pcm179x_common_init(struct device *dev, struct regmap *regmap) @@ -228,18 +230,11 @@ int pcm179x_common_init(struct device *dev, struct regmap *regmap) pcm179x->regmap = regmap; dev_set_drvdata(dev, pcm179x); - return snd_soc_register_codec(dev, - &soc_codec_dev_pcm179x, &pcm179x_dai, 1); + return devm_snd_soc_register_component(dev, + &soc_component_dev_pcm179x, &pcm179x_dai, 1); } EXPORT_SYMBOL_GPL(pcm179x_common_init); -int pcm179x_common_exit(struct device *dev) -{ - snd_soc_unregister_codec(dev); - return 0; -} -EXPORT_SYMBOL_GPL(pcm179x_common_exit); - MODULE_DESCRIPTION("ASoC PCM179X driver"); MODULE_AUTHOR("Michael Trimarchi <michael@amarulasolutions.com>"); MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/pcm179x.h b/sound/soc/codecs/pcm179x.h index 11e331268aae..cf8681c9a373 100644 --- a/sound/soc/codecs/pcm179x.h +++ b/sound/soc/codecs/pcm179x.h @@ -23,6 +23,5 @@ extern const struct regmap_config pcm179x_regmap_config; int pcm179x_common_init(struct device *dev, struct regmap *regmap); -int pcm179x_common_exit(struct device *dev); #endif diff --git a/sound/soc/codecs/pcm186x-i2c.c b/sound/soc/codecs/pcm186x-i2c.c index 543621232d60..0214dc6d84d0 100644 --- a/sound/soc/codecs/pcm186x-i2c.c +++ b/sound/soc/codecs/pcm186x-i2c.c @@ -36,13 +36,6 @@ static int pcm186x_i2c_probe(struct i2c_client *i2c, return pcm186x_probe(&i2c->dev, type, irq, regmap); } -static int pcm186x_i2c_remove(struct i2c_client *i2c) -{ - pcm186x_remove(&i2c->dev); - - return 0; -} - static const struct i2c_device_id pcm186x_i2c_id[] = { { "pcm1862", PCM1862 }, { "pcm1863", PCM1863 }, @@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(i2c, pcm186x_i2c_id); static struct i2c_driver pcm186x_i2c_driver = { .probe = pcm186x_i2c_probe, - .remove = pcm186x_i2c_remove, .id_table = pcm186x_i2c_id, .driver = { .name = "pcm186x", diff --git a/sound/soc/codecs/pcm186x-spi.c b/sound/soc/codecs/pcm186x-spi.c index 2366f8e4d4d4..b56e19827497 100644 --- a/sound/soc/codecs/pcm186x-spi.c +++ b/sound/soc/codecs/pcm186x-spi.c @@ -36,13 +36,6 @@ static int pcm186x_spi_probe(struct spi_device *spi) return pcm186x_probe(&spi->dev, type, irq, regmap); } -static int pcm186x_spi_remove(struct spi_device *spi) -{ - pcm186x_remove(&spi->dev); - - return 0; -} - static const struct spi_device_id pcm186x_spi_id[] = { { "pcm1862", PCM1862 }, { "pcm1863", PCM1863 }, @@ -54,7 +47,6 @@ MODULE_DEVICE_TABLE(spi, pcm186x_spi_id); static struct spi_driver pcm186x_spi_driver = { .probe = pcm186x_spi_probe, - .remove = pcm186x_spi_remove, .id_table = pcm186x_spi_id, .driver = { .name = "pcm186x", diff --git a/sound/soc/codecs/pcm186x.c b/sound/soc/codecs/pcm186x.c index cdb51427facc..88fde70b1e9e 100644 --- a/sound/soc/codecs/pcm186x.c +++ b/sound/soc/codecs/pcm186x.c @@ -262,9 +262,8 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); unsigned int format = params_format(params); unsigned int width = params_width(params); @@ -274,7 +273,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, u8 tdm_tx_sel = 0; u8 pcm_cfg = 0; - dev_dbg(codec->dev, "%s() rate=%u format=0x%x width=%u channels=%u\n", + dev_dbg(component->dev, "%s() rate=%u format=0x%x width=%u channels=%u\n", __func__, rate, format, width, channels); switch (width) { @@ -306,7 +305,7 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, PCM186X_PCM_CFG, + snd_soc_component_update_bits(component, PCM186X_PCM_CFG, PCM186X_PCM_CFG_RX_WLEN_MASK | PCM186X_PCM_CFG_TX_WLEN_MASK, pcm_cfg); @@ -329,14 +328,14 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, PCM186X_TDM_TX_SEL, + snd_soc_component_update_bits(component, PCM186X_TDM_TX_SEL, PCM186X_TDM_TX_SEL_MASK, tdm_tx_sel); /* In DSP/TDM mode, the LRCLK divider must be 256 */ div_lrck = 256; /* Configure 1/256 duty cycle for LRCK */ - snd_soc_update_bits(codec, PCM186X_PCM_CFG, + snd_soc_component_update_bits(component, PCM186X_PCM_CFG, PCM186X_PCM_CFG_TDM_LRCK_MODE, PCM186X_PCM_CFG_TDM_LRCK_MODE); } @@ -345,12 +344,12 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, if (priv->is_master_mode) { div_bck = priv->sysclk / (div_lrck * rate); - dev_dbg(codec->dev, + dev_dbg(component->dev, "%s() master_clk=%u div_bck=%u div_lrck=%u\n", __func__, priv->sysclk, div_bck, div_lrck); - snd_soc_write(codec, PCM186X_BCK_DIV, div_bck - 1); - snd_soc_write(codec, PCM186X_LRK_DIV, div_lrck - 1); + snd_soc_component_write(component, PCM186X_BCK_DIV, div_bck - 1); + snd_soc_component_write(component, PCM186X_LRK_DIV, div_lrck - 1); } return 0; @@ -358,18 +357,18 @@ static int pcm186x_hw_params(struct snd_pcm_substream *substream, static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) { - struct snd_soc_codec *codec = dai->codec; - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); u8 clk_ctrl = 0; u8 pcm_cfg = 0; - dev_dbg(codec->dev, "%s() format=0x%x\n", __func__, format); + dev_dbg(component->dev, "%s() format=0x%x\n", __func__, format); /* set master/slave audio interface */ switch (format & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: if (!priv->sysclk) { - dev_err(codec->dev, "operating in master mode requires sysclock to be configured\n"); + dev_err(component->dev, "operating in master mode requires sysclock to be configured\n"); return -EINVAL; } clk_ctrl |= PCM186X_CLK_CTRL_MST_MODE; @@ -379,7 +378,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) priv->is_master_mode = false; break; default: - dev_err(codec->dev, "Invalid DAI master/slave interface\n"); + dev_err(component->dev, "Invalid DAI master/slave interface\n"); return -EINVAL; } @@ -388,7 +387,7 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) case SND_SOC_DAIFMT_NB_NF: break; default: - dev_err(codec->dev, "Inverted DAI clocks not supported\n"); + dev_err(component->dev, "Inverted DAI clocks not supported\n"); return -EINVAL; } @@ -410,16 +409,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) pcm_cfg = PCM186X_PCM_CFG_FMT_TDM; break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } - snd_soc_update_bits(codec, PCM186X_CLK_CTRL, + snd_soc_component_update_bits(component, PCM186X_CLK_CTRL, PCM186X_CLK_CTRL_MST_MODE, clk_ctrl); - snd_soc_write(codec, PCM186X_TDM_TX_OFFSET, priv->tdm_offset); + snd_soc_component_write(component, PCM186X_TDM_TX_OFFSET, priv->tdm_offset); - snd_soc_update_bits(codec, PCM186X_PCM_CFG, + snd_soc_component_update_bits(component, PCM186X_PCM_CFG, PCM186X_PCM_CFG_FMT_MASK, pcm_cfg); return 0; @@ -428,16 +427,16 @@ static int pcm186x_set_fmt(struct snd_soc_dai *dai, unsigned int format) static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); unsigned int first_slot, last_slot, tdm_offset; - dev_dbg(codec->dev, + dev_dbg(component->dev, "%s() tx_mask=0x%x rx_mask=0x%x slots=%d slot_width=%d\n", __func__, tx_mask, rx_mask, slots, slot_width); if (!tx_mask) { - dev_err(codec->dev, "tdm tx mask must not be 0\n"); + dev_err(component->dev, "tdm tx mask must not be 0\n"); return -EINVAL; } @@ -445,14 +444,14 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, last_slot = __fls(tx_mask); if (last_slot - first_slot != hweight32(tx_mask) - 1) { - dev_err(codec->dev, "tdm tx mask must be contiguous\n"); + dev_err(component->dev, "tdm tx mask must be contiguous\n"); return -EINVAL; } tdm_offset = first_slot * slot_width; if (tdm_offset > 255) { - dev_err(codec->dev, "tdm tx slot selection out of bounds\n"); + dev_err(component->dev, "tdm tx slot selection out of bounds\n"); return -EINVAL; } @@ -464,10 +463,10 @@ static int pcm186x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int pcm186x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s() clk_id=%d freq=%u dir=%d\n", + dev_dbg(component->dev, "%s() clk_id=%d freq=%u dir=%d\n", __func__, clk_id, freq, dir); priv->sysclk = freq; @@ -506,9 +505,9 @@ static struct snd_soc_dai_driver pcm1865_dai = { .ops = &pcm186x_dai_ops, }; -static int pcm186x_power_on(struct snd_soc_codec *codec) +static int pcm186x_power_on(struct snd_soc_component *component) { - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); int ret = 0; ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), @@ -519,25 +518,25 @@ static int pcm186x_power_on(struct snd_soc_codec *codec) regcache_cache_only(priv->regmap, false); ret = regcache_sync(priv->regmap); if (ret) { - dev_err(codec->dev, "Failed to restore cache\n"); + dev_err(component->dev, "Failed to restore cache\n"); regcache_cache_only(priv->regmap, true); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); return ret; } - snd_soc_update_bits(codec, PCM186X_POWER_CTRL, + snd_soc_component_update_bits(component, PCM186X_POWER_CTRL, PCM186X_PWR_CTRL_PWRDN, 0); return 0; } -static int pcm186x_power_off(struct snd_soc_codec *codec) +static int pcm186x_power_off(struct snd_soc_component *component) { - struct pcm186x_priv *priv = snd_soc_codec_get_drvdata(codec); + struct pcm186x_priv *priv = snd_soc_component_get_drvdata(component); int ret; - snd_soc_update_bits(codec, PCM186X_POWER_CTRL, + snd_soc_component_update_bits(component, PCM186X_POWER_CTRL, PCM186X_PWR_CTRL_PWRDN, PCM186X_PWR_CTRL_PWRDN); regcache_cache_only(priv->regmap, true); @@ -550,11 +549,11 @@ static int pcm186x_power_off(struct snd_soc_codec *codec) return 0; } -static int pcm186x_set_bias_level(struct snd_soc_codec *codec, +static int pcm186x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - dev_dbg(codec->dev, "## %s: %d -> %d\n", __func__, - snd_soc_codec_get_bias_level(codec), level); + dev_dbg(component->dev, "## %s: %d -> %d\n", __func__, + snd_soc_component_get_bias_level(component), level); switch (level) { case SND_SOC_BIAS_ON: @@ -562,42 +561,44 @@ static int pcm186x_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) - pcm186x_power_on(codec); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) + pcm186x_power_on(component); break; case SND_SOC_BIAS_OFF: - pcm186x_power_off(codec); + pcm186x_power_off(component); break; } return 0; } -static struct snd_soc_codec_driver soc_codec_dev_pcm1863 = { - .set_bias_level = pcm186x_set_bias_level, - - .component_driver = { - .controls = pcm1863_snd_controls, - .num_controls = ARRAY_SIZE(pcm1863_snd_controls), - .dapm_widgets = pcm1863_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm1863_dapm_widgets), - .dapm_routes = pcm1863_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm1863_dapm_routes), - }, +static struct snd_soc_component_driver soc_codec_dev_pcm1863 = { + .set_bias_level = pcm186x_set_bias_level, + .controls = pcm1863_snd_controls, + .num_controls = ARRAY_SIZE(pcm1863_snd_controls), + .dapm_widgets = pcm1863_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm1863_dapm_widgets), + .dapm_routes = pcm1863_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm1863_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; -static struct snd_soc_codec_driver soc_codec_dev_pcm1865 = { - .set_bias_level = pcm186x_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = pcm1865_snd_controls, - .num_controls = ARRAY_SIZE(pcm1865_snd_controls), - .dapm_widgets = pcm1865_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm1865_dapm_widgets), - .dapm_routes = pcm1865_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm1865_dapm_routes), - }, +static struct snd_soc_component_driver soc_codec_dev_pcm1865 = { + .set_bias_level = pcm186x_set_bias_level, + .controls = pcm1865_snd_controls, + .num_controls = ARRAY_SIZE(pcm1865_snd_controls), + .dapm_widgets = pcm1865_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm1865_dapm_widgets), + .dapm_routes = pcm1865_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm1865_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static bool pcm186x_volatile(struct device *dev, unsigned int reg) @@ -687,13 +688,13 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, switch (type) { case PCM1865: case PCM1864: - ret = snd_soc_register_codec(dev, &soc_codec_dev_pcm1865, + ret = devm_snd_soc_register_component(dev, &soc_codec_dev_pcm1865, &pcm1865_dai, 1); break; case PCM1863: case PCM1862: default: - ret = snd_soc_register_codec(dev, &soc_codec_dev_pcm1863, + ret = devm_snd_soc_register_component(dev, &soc_codec_dev_pcm1863, &pcm1863_dai, 1); } if (ret) { @@ -705,14 +706,6 @@ int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, } EXPORT_SYMBOL_GPL(pcm186x_probe); -int pcm186x_remove(struct device *dev) -{ - snd_soc_unregister_codec(dev); - - return 0; -} -EXPORT_SYMBOL_GPL(pcm186x_remove); - MODULE_AUTHOR("Andreas Dannenberg <dannenberg@ti.com>"); MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>"); MODULE_DESCRIPTION("PCM186x Universal Audio ADC driver"); diff --git a/sound/soc/codecs/pcm186x.h b/sound/soc/codecs/pcm186x.h index b630111bb3c4..2c6ba55bf394 100644 --- a/sound/soc/codecs/pcm186x.h +++ b/sound/soc/codecs/pcm186x.h @@ -215,6 +215,5 @@ extern const struct regmap_config pcm186x_regmap; int pcm186x_probe(struct device *dev, enum pcm186x_type type, int irq, struct regmap *regmap); -int pcm186x_remove(struct device *dev); #endif /* _PCM186X_H_ */ diff --git a/sound/soc/codecs/pcm3008.c b/sound/soc/codecs/pcm3008.c index e59d8ffb93bd..c6ce9bd77c5e 100644 --- a/sound/soc/codecs/pcm3008.c +++ b/sound/soc/codecs/pcm3008.c @@ -32,8 +32,8 @@ static int pcm3008_dac_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pcm3008_setup_data *setup = codec->dev->platform_data; + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pcm3008_setup_data *setup = component->dev->platform_data; gpio_set_value_cansleep(setup->pdda_pin, SND_SOC_DAPM_EVENT_ON(event)); @@ -45,8 +45,8 @@ static int pcm3008_adc_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct pcm3008_setup_data *setup = codec->dev->platform_data; + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct pcm3008_setup_data *setup = component->dev->platform_data; gpio_set_value_cansleep(setup->pdad_pin, SND_SOC_DAPM_EVENT_ON(event)); @@ -98,13 +98,15 @@ static struct snd_soc_dai_driver pcm3008_dai = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_pcm3008 = { - .component_driver = { - .dapm_widgets = pcm3008_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm3008_dapm_widgets), - .dapm_routes = pcm3008_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm3008_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_pcm3008 = { + .dapm_widgets = pcm3008_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm3008_dapm_widgets), + .dapm_routes = pcm3008_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm3008_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int pcm3008_codec_probe(struct platform_device *pdev) @@ -146,22 +148,14 @@ static int pcm3008_codec_probe(struct platform_device *pdev) if (ret != 0) return ret; - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_pcm3008, &pcm3008_dai, 1); -} - -static int pcm3008_codec_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_pcm3008, &pcm3008_dai, 1); } MODULE_ALIAS("platform:pcm3008-codec"); static struct platform_driver pcm3008_codec_driver = { .probe = pcm3008_codec_probe, - .remove = pcm3008_codec_remove, .driver = { .name = "pcm3008-codec", }, diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c index b9d1207ccef2..3356c91f55b0 100644 --- a/sound/soc/codecs/pcm3168a.c +++ b/sound/soc/codecs/pcm3168a.c @@ -287,8 +287,8 @@ static int pcm3168a_reset(struct pcm3168a_priv *pcm3168a) static int pcm3168a_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); regmap_write(pcm3168a->regmap, PCM3168A_DAC_MUTE, mute ? 0xff : 0); @@ -298,7 +298,7 @@ static int pcm3168a_digital_mute(struct snd_soc_dai *dai, int mute) static int pcm3168a_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(dai->codec); + struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(dai->component); int ret; if (freq > PCM1368A_MAX_SYSCLK) @@ -316,8 +316,8 @@ static int pcm3168a_set_dai_sysclk(struct snd_soc_dai *dai, static int pcm3168a_set_dai_fmt(struct snd_soc_dai *dai, unsigned int format, bool dac) { - struct snd_soc_codec *codec = dai->codec; - struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); u32 fmt, reg, mask, shift; bool master_mode; @@ -338,7 +338,7 @@ static int pcm3168a_set_dai_fmt(struct snd_soc_dai *dai, fmt = PCM3168A_FMT_DSP_B; break; default: - dev_err(codec->dev, "unsupported dai format\n"); + dev_err(component->dev, "unsupported dai format\n"); return -EINVAL; } @@ -350,7 +350,7 @@ static int pcm3168a_set_dai_fmt(struct snd_soc_dai *dai, master_mode = true; break; default: - dev_err(codec->dev, "unsupported master/slave mode\n"); + dev_err(component->dev, "unsupported master/slave mode\n"); return -EINVAL; } @@ -396,8 +396,8 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm3168a_priv *pcm3168a = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm3168a_priv *pcm3168a = snd_soc_component_get_drvdata(component); bool tx, master_mode; u32 val, mask, shift, reg; unsigned int rate, fmt, ratio, max_ratio; @@ -430,7 +430,7 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream, } if (i == max_ratio) { - dev_err(codec->dev, "unsupported sysclk ratio\n"); + dev_err(component->dev, "unsupported sysclk ratio\n"); return -EINVAL; } @@ -438,21 +438,21 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream, switch (min_frame_size) { case 32: if (master_mode || (fmt != PCM3168A_FMT_RIGHT_J)) { - dev_err(codec->dev, "32-bit frames are supported only for slave mode using right justified\n"); + dev_err(component->dev, "32-bit frames are supported only for slave mode using right justified\n"); return -EINVAL; } fmt = PCM3168A_FMT_RIGHT_J_16; break; case 48: if (master_mode || (fmt & PCM3168A_FMT_DSP_MASK)) { - dev_err(codec->dev, "48-bit frames not supported in master mode, or slave mode using DSP\n"); + dev_err(component->dev, "48-bit frames not supported in master mode, or slave mode using DSP\n"); return -EINVAL; } break; case 64: break; default: - dev_err(codec->dev, "unsupported frame size: %d\n", min_frame_size); + dev_err(component->dev, "unsupported frame size: %d\n", min_frame_size); return -EINVAL; } @@ -595,16 +595,16 @@ const struct regmap_config pcm3168a_regmap = { }; EXPORT_SYMBOL_GPL(pcm3168a_regmap); -static const struct snd_soc_codec_driver pcm3168a_driver = { - .idle_bias_off = true, - .component_driver = { - .controls = pcm3168a_snd_controls, - .num_controls = ARRAY_SIZE(pcm3168a_snd_controls), - .dapm_widgets = pcm3168a_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm3168a_dapm_widgets), - .dapm_routes = pcm3168a_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm3168a_dapm_routes) - }, +static const struct snd_soc_component_driver pcm3168a_driver = { + .controls = pcm3168a_snd_controls, + .num_controls = ARRAY_SIZE(pcm3168a_snd_controls), + .dapm_widgets = pcm3168a_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm3168a_dapm_widgets), + .dapm_routes = pcm3168a_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm3168a_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; int pcm3168a_probe(struct device *dev, struct regmap *regmap) @@ -669,10 +669,10 @@ int pcm3168a_probe(struct device *dev, struct regmap *regmap) pm_runtime_enable(dev); pm_runtime_idle(dev); - ret = snd_soc_register_codec(dev, &pcm3168a_driver, pcm3168a_dais, + ret = devm_snd_soc_register_component(dev, &pcm3168a_driver, pcm3168a_dais, ARRAY_SIZE(pcm3168a_dais)); if (ret) { - dev_err(dev, "failed to register codec: %d\n", ret); + dev_err(dev, "failed to register component: %d\n", ret); goto err_regulator; } @@ -692,7 +692,6 @@ void pcm3168a_remove(struct device *dev) { struct pcm3168a_priv *pcm3168a = dev_get_drvdata(dev); - snd_soc_unregister_codec(dev); pm_runtime_disable(dev); regulator_bulk_disable(ARRAY_SIZE(pcm3168a->supplies), pcm3168a->supplies); diff --git a/sound/soc/codecs/pcm5102a.c b/sound/soc/codecs/pcm5102a.c index 8ba322a00363..39ac2857a554 100644 --- a/sound/soc/codecs/pcm5102a.c +++ b/sound/soc/codecs/pcm5102a.c @@ -32,20 +32,19 @@ static struct snd_soc_dai_driver pcm5102a_dai = { }, }; -static struct snd_soc_codec_driver soc_codec_dev_pcm5102a; +static struct snd_soc_component_driver soc_component_dev_pcm5102a = { + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; static int pcm5102a_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_pcm5102a, + return devm_snd_soc_register_component(&pdev->dev, &soc_component_dev_pcm5102a, &pcm5102a_dai, 1); } -static int pcm5102a_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - static const struct of_device_id pcm5102a_of_match[] = { { .compatible = "ti,pcm5102a", }, { } @@ -54,7 +53,6 @@ MODULE_DEVICE_TABLE(of, pcm5102a_of_match); static struct platform_driver pcm5102a_codec_driver = { .probe = pcm5102a_probe, - .remove = pcm5102a_remove, .driver = { .name = "pcm5102a-codec", .of_match_table = pcm5102a_of_match, diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c index e0f3556d3872..f0f2d4fd3769 100644 --- a/sound/soc/codecs/pcm512x.c +++ b/sound/soc/codecs/pcm512x.c @@ -226,8 +226,8 @@ static bool pcm512x_volatile(struct device *dev, unsigned int reg) static int pcm512x_overclock_pll_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = pcm512x->overclock_pll; return 0; @@ -236,10 +236,10 @@ static int pcm512x_overclock_pll_get(struct snd_kcontrol *kcontrol, static int pcm512x_overclock_pll_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); - switch (snd_soc_codec_get_bias_level(codec)) { + switch (snd_soc_component_get_bias_level(component)) { case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_STANDBY: break; @@ -254,8 +254,8 @@ static int pcm512x_overclock_pll_put(struct snd_kcontrol *kcontrol, static int pcm512x_overclock_dsp_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = pcm512x->overclock_dsp; return 0; @@ -264,10 +264,10 @@ static int pcm512x_overclock_dsp_get(struct snd_kcontrol *kcontrol, static int pcm512x_overclock_dsp_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); - switch (snd_soc_codec_get_bias_level(codec)) { + switch (snd_soc_component_get_bias_level(component)) { case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_STANDBY: break; @@ -282,8 +282,8 @@ static int pcm512x_overclock_dsp_put(struct snd_kcontrol *kcontrol, static int pcm512x_overclock_dac_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = pcm512x->overclock_dac; return 0; @@ -292,10 +292,10 @@ static int pcm512x_overclock_dac_get(struct snd_kcontrol *kcontrol, static int pcm512x_overclock_dac_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); - switch (snd_soc_codec_get_bias_level(codec)) { + switch (snd_soc_component_get_bias_level(component)) { case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_STANDBY: break; @@ -522,8 +522,8 @@ static int pcm512x_hw_rule_rate(struct snd_pcm_hw_params *params, static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); struct device *dev = dai->dev; struct snd_pcm_hw_constraint_ratnums *constraints_no_pll; struct snd_ratnum *rats_no_pll; @@ -564,8 +564,8 @@ static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream, static int pcm512x_dai_startup_slave(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); struct device *dev = dai->dev; struct regmap *regmap = pcm512x->regmap; @@ -590,8 +590,8 @@ static int pcm512x_dai_startup_slave(struct snd_pcm_substream *substream, static int pcm512x_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -606,10 +606,10 @@ static int pcm512x_dai_startup(struct snd_pcm_substream *substream, } } -static int pcm512x_set_bias_level(struct snd_soc_codec *codec, +static int pcm512x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct pcm512x_priv *pcm512x = dev_get_drvdata(codec->dev); + struct pcm512x_priv *pcm512x = dev_get_drvdata(component->dev); int ret; switch (level) { @@ -621,7 +621,7 @@ static int pcm512x_set_bias_level(struct snd_soc_codec *codec, ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER, PCM512x_RQST, 0); if (ret != 0) { - dev_err(codec->dev, "Failed to remove standby: %d\n", + dev_err(component->dev, "Failed to remove standby: %d\n", ret); return ret; } @@ -631,7 +631,7 @@ static int pcm512x_set_bias_level(struct snd_soc_codec *codec, ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER, PCM512x_RQST, PCM512x_RQST); if (ret != 0) { - dev_err(codec->dev, "Failed to request standby: %d\n", + dev_err(component->dev, "Failed to request standby: %d\n", ret); return ret; } @@ -645,8 +645,8 @@ static unsigned long pcm512x_find_sck(struct snd_soc_dai *dai, unsigned long bclk_rate) { struct device *dev = dai->dev; - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); unsigned long sck_rate; int pow2; @@ -691,8 +691,8 @@ static int pcm512x_find_pll_coeff(struct snd_soc_dai *dai, unsigned long pll_rate) { struct device *dev = dai->dev; - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); unsigned long common; int R, J, D, P; unsigned long K; /* 10000 * J.D */ @@ -798,8 +798,8 @@ static unsigned long pcm512x_pllin_dac_rate(struct snd_soc_dai *dai, unsigned long osr_rate, unsigned long pllin_rate) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); unsigned long dac_rate; if (!pcm512x->pll_out) @@ -829,8 +829,8 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai, struct snd_pcm_hw_params *params) { struct device *dev = dai->dev; - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); unsigned long pllin_rate = 0; unsigned long pll_rate; unsigned long sck_rate; @@ -949,7 +949,7 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai, ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF, PCM512x_SDAC, PCM512x_SDAC_GPIO); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set gpio as dacref: %d\n", ret); return ret; } @@ -958,7 +958,7 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai, ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_DACIN, PCM512x_GREF, gpio); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set gpio %d as dacin: %d\n", pcm512x->pll_in, ret); return ret; @@ -987,7 +987,7 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai, ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF, PCM512x_SDAC, PCM512x_SDAC_SCK); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set sck as dacref: %d\n", ret); return ret; } @@ -1082,18 +1082,18 @@ static int pcm512x_set_dividers(struct snd_soc_dai *dai, ret = regmap_update_bits(pcm512x->regmap, PCM512x_FS_SPEED_MODE, PCM512x_FSSP, fssp); if (ret != 0) { - dev_err(codec->dev, "Failed to set fs speed: %d\n", ret); + dev_err(component->dev, "Failed to set fs speed: %d\n", ret); return ret; } - dev_dbg(codec->dev, "DSP divider %d\n", dsp_div); - dev_dbg(codec->dev, "DAC divider %d\n", dac_div); - dev_dbg(codec->dev, "NCP divider %d\n", ncp_div); - dev_dbg(codec->dev, "OSR divider %d\n", osr_div); - dev_dbg(codec->dev, "BCK divider %d\n", bclk_div); - dev_dbg(codec->dev, "LRCK divider %d\n", lrclk_div); - dev_dbg(codec->dev, "IDAC %d\n", idac); - dev_dbg(codec->dev, "1<<FSSP %d\n", 1 << fssp); + dev_dbg(component->dev, "DSP divider %d\n", dsp_div); + dev_dbg(component->dev, "DAC divider %d\n", dac_div); + dev_dbg(component->dev, "NCP divider %d\n", ncp_div); + dev_dbg(component->dev, "OSR divider %d\n", osr_div); + dev_dbg(component->dev, "BCK divider %d\n", bclk_div); + dev_dbg(component->dev, "LRCK divider %d\n", lrclk_div); + dev_dbg(component->dev, "IDAC %d\n", idac); + dev_dbg(component->dev, "1<<FSSP %d\n", 1 << fssp); return 0; } @@ -1102,15 +1102,15 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); int alen; int gpio; int clock_output; int master_mode; int ret; - dev_dbg(codec->dev, "hw_params %u Hz, %u channels\n", + dev_dbg(component->dev, "hw_params %u Hz, %u channels\n", params_rate(params), params_channels(params)); @@ -1128,7 +1128,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, alen = PCM512x_ALEN_32; break; default: - dev_err(codec->dev, "Bad frame size: %d\n", + dev_err(component->dev, "Bad frame size: %d\n", params_width(params)); return -EINVAL; } @@ -1141,7 +1141,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, | PCM512x_BCKO | PCM512x_LRKO, 0); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable slave mode: %d\n", ret); return ret; } @@ -1149,7 +1149,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_ERROR_DETECT, PCM512x_DCAS, 0); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable clock divider autoset: %d\n", ret); return ret; @@ -1170,20 +1170,20 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_I2S_1, PCM512x_ALEN, alen); if (ret != 0) { - dev_err(codec->dev, "Failed to set frame size: %d\n", ret); + dev_err(component->dev, "Failed to set frame size: %d\n", ret); return ret; } if (pcm512x->pll_out) { ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_A, 0x11); if (ret != 0) { - dev_err(codec->dev, "Failed to set FLEX_A: %d\n", ret); + dev_err(component->dev, "Failed to set FLEX_A: %d\n", ret); return ret; } ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_B, 0xff); if (ret != 0) { - dev_err(codec->dev, "Failed to set FLEX_B: %d\n", ret); + dev_err(component->dev, "Failed to set FLEX_B: %d\n", ret); return ret; } @@ -1196,7 +1196,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, | PCM512x_IDSK | PCM512x_IDCH | PCM512x_DCAS); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to ignore auto-clock failures: %d\n", ret); return ret; @@ -1211,7 +1211,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, | PCM512x_IDSK | PCM512x_IDCH | PCM512x_DCAS | PCM512x_IPLK); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to ignore auto-clock failures: %d\n", ret); return ret; @@ -1220,7 +1220,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN, PCM512x_PLLE, 0); if (ret != 0) { - dev_err(codec->dev, "Failed to disable pll: %d\n", ret); + dev_err(component->dev, "Failed to disable pll: %d\n", ret); return ret; } } @@ -1233,7 +1233,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_REF, PCM512x_SREF, PCM512x_SREF_GPIO); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set gpio as pllref: %d\n", ret); return ret; } @@ -1242,7 +1242,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_PLLIN, PCM512x_GREF, gpio); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set gpio %d as pllin: %d\n", pcm512x->pll_in, ret); return ret; @@ -1251,7 +1251,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN, PCM512x_PLLE, PCM512x_PLLE); if (ret != 0) { - dev_err(codec->dev, "Failed to enable pll: %d\n", ret); + dev_err(component->dev, "Failed to enable pll: %d\n", ret); return ret; } } @@ -1260,7 +1260,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, PCM512x_BCKP | PCM512x_BCKO | PCM512x_LRKO, clock_output); if (ret != 0) { - dev_err(codec->dev, "Failed to enable clock output: %d\n", ret); + dev_err(component->dev, "Failed to enable clock output: %d\n", ret); return ret; } @@ -1268,7 +1268,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, PCM512x_RLRK | PCM512x_RBCK, master_mode); if (ret != 0) { - dev_err(codec->dev, "Failed to enable master mode: %d\n", ret); + dev_err(component->dev, "Failed to enable master mode: %d\n", ret); return ret; } @@ -1277,7 +1277,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_EN, gpio, gpio); if (ret != 0) { - dev_err(codec->dev, "Failed to enable gpio %d: %d\n", + dev_err(component->dev, "Failed to enable gpio %d: %d\n", pcm512x->pll_out, ret); return ret; } @@ -1286,7 +1286,7 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, gpio, PCM512x_GxSL, PCM512x_GxSL_PLLCK); if (ret != 0) { - dev_err(codec->dev, "Failed to output pll on %d: %d\n", + dev_err(component->dev, "Failed to output pll on %d: %d\n", ret, pcm512x->pll_out); return ret; } @@ -1295,14 +1295,14 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE, PCM512x_RQSY, PCM512x_RQSY_HALT); if (ret != 0) { - dev_err(codec->dev, "Failed to halt clocks: %d\n", ret); + dev_err(component->dev, "Failed to halt clocks: %d\n", ret); return ret; } ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE, PCM512x_RQSY, PCM512x_RQSY_RESUME); if (ret != 0) { - dev_err(codec->dev, "Failed to resume clocks: %d\n", ret); + dev_err(component->dev, "Failed to resume clocks: %d\n", ret); return ret; } @@ -1311,8 +1311,8 @@ static int pcm512x_hw_params(struct snd_pcm_substream *substream, static int pcm512x_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component); pcm512x->fmt = fmt; @@ -1341,18 +1341,17 @@ static struct snd_soc_dai_driver pcm512x_dai = { .ops = &pcm512x_dai_ops, }; -static const struct snd_soc_codec_driver pcm512x_codec_driver = { - .set_bias_level = pcm512x_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = pcm512x_controls, - .num_controls = ARRAY_SIZE(pcm512x_controls), - .dapm_widgets = pcm512x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(pcm512x_dapm_widgets), - .dapm_routes = pcm512x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(pcm512x_dapm_routes), - }, +static const struct snd_soc_component_driver pcm512x_component_driver = { + .set_bias_level = pcm512x_set_bias_level, + .controls = pcm512x_controls, + .num_controls = ARRAY_SIZE(pcm512x_controls), + .dapm_widgets = pcm512x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(pcm512x_dapm_widgets), + .dapm_routes = pcm512x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(pcm512x_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_range_cfg pcm512x_range = { @@ -1498,7 +1497,7 @@ int pcm512x_probe(struct device *dev, struct regmap *regmap) } #endif - ret = snd_soc_register_codec(dev, &pcm512x_codec_driver, + ret = devm_snd_soc_register_component(dev, &pcm512x_component_driver, &pcm512x_dai, 1); if (ret != 0) { dev_err(dev, "Failed to register CODEC: %d\n", ret); @@ -1523,7 +1522,6 @@ void pcm512x_remove(struct device *dev) { struct pcm512x_priv *pcm512x = dev_get_drvdata(dev); - snd_soc_unregister_codec(dev); pm_runtime_disable(dev); if (!IS_ERR(pcm512x->sclk)) clk_disable_unprepare(pcm512x->sclk); diff --git a/sound/soc/codecs/rt274.c b/sound/soc/codecs/rt274.c index 8f92e5c4dd9d..d88e67341083 100644 --- a/sound/soc/codecs/rt274.c +++ b/sound/soc/codecs/rt274.c @@ -38,7 +38,7 @@ struct rt274_priv { struct reg_default *index_cache; int index_cache_size; struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct i2c_client *i2c; struct snd_soc_jack *jack; struct delayed_work jack_detect_work; @@ -338,13 +338,13 @@ static bool rt274_readable_register(struct device *dev, unsigned int reg) } #ifdef CONFIG_PM -static void rt274_index_sync(struct snd_soc_codec *codec) +static void rt274_index_sync(struct snd_soc_component *component) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < INDEX_CACHE_SIZE; i++) { - snd_soc_write(codec, rt274->index_cache[i].reg, + snd_soc_component_write(component, rt274->index_cache[i].reg, rt274->index_cache[i].def); } } @@ -357,7 +357,7 @@ static int rt274_jack_detect(struct rt274_priv *rt274, bool *hp, bool *mic) *hp = false; *mic = false; - if (!rt274->codec) + if (!rt274->component) return -EINVAL; regmap_read(rt274->regmap, RT274_GET_HP_SENSE, &buf); @@ -393,10 +393,10 @@ static void rt274_jack_detect_work(struct work_struct *work) static irqreturn_t rt274_irq(int irq, void *data); -static int rt274_mic_detect(struct snd_soc_codec *codec, +static int rt274_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, void *data) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); if (jack == NULL) { /* Disable jack detection */ @@ -609,8 +609,8 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); unsigned int val = 0; int d_len_code = 0, c_len_code = 0; @@ -620,7 +620,7 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, case 48000: break; default: - dev_err(codec->dev, "Unsupported sample rate %d\n", + dev_err(component->dev, "Unsupported sample rate %d\n", params_rate(params)); return -EINVAL; } @@ -628,7 +628,7 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, case 12288000: case 24576000: if (params_rate(params) != 48000) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt274->sys_clk); return -EINVAL; } @@ -636,7 +636,7 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, case 11289600: case 22579200: if (params_rate(params) != 44100) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt274->sys_clk); return -EINVAL; } @@ -647,7 +647,7 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, /* bit 3:0 Number of Channel */ val |= (params_channels(params) - 1); } else { - dev_err(codec->dev, "Unsupported channels %d\n", + dev_err(component->dev, "Unsupported channels %d\n", params_channels(params)); return -EINVAL; } @@ -685,29 +685,29 @@ static int rt274_hw_params(struct snd_pcm_substream *substream, if (rt274->master) c_len_code = 0x3; - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, 0xc018, d_len_code << 3 | c_len_code << 14); - dev_dbg(codec->dev, "format val = 0x%x\n", val); + dev_dbg(component->dev, "format val = 0x%x\n", val); - snd_soc_update_bits(codec, RT274_DAC_FORMAT, 0x407f, val); - snd_soc_update_bits(codec, RT274_ADC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT274_DAC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT274_ADC_FORMAT, 0x407f, val); return 0; } static int rt274_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_MODE_MASK, RT274_I2S_MODE_M); rt274->master = true; break; case SND_SOC_DAIFMT_CBS_CFS: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_MODE_MASK, RT274_I2S_MODE_S); rt274->master = false; break; @@ -717,27 +717,27 @@ static int rt274_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: - snd_soc_update_bits(codec, RT274_I2S_CTRL1, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_FMT_MASK, RT274_I2S_FMT_I2S); break; case SND_SOC_DAIFMT_LEFT_J: - snd_soc_update_bits(codec, RT274_I2S_CTRL1, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_FMT_MASK, RT274_I2S_FMT_LJ); break; case SND_SOC_DAIFMT_DSP_A: - snd_soc_update_bits(codec, RT274_I2S_CTRL1, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_FMT_MASK, RT274_I2S_FMT_PCMA); break; case SND_SOC_DAIFMT_DSP_B: - snd_soc_update_bits(codec, RT274_I2S_CTRL1, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_I2S_FMT_MASK, RT274_I2S_FMT_PCMB); break; default: return -EINVAL; } /* bit 15 Stream Type 0:PCM 1:Non-PCM */ - snd_soc_update_bits(codec, RT274_DAC_FORMAT, 0x8000, 0); - snd_soc_update_bits(codec, RT274_ADC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT274_DAC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT274_ADC_FORMAT, 0x8000, 0); return 0; } @@ -745,47 +745,47 @@ static int rt274_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt274_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); switch (source) { case RT274_PLL2_S_MCLK: - snd_soc_update_bits(codec, RT274_PLL2_CTRL, + snd_soc_component_update_bits(component, RT274_PLL2_CTRL, RT274_PLL2_SRC_MASK, RT274_PLL2_SRC_MCLK); break; default: - dev_warn(codec->dev, "invalid pll source, use BCLK\n"); + dev_warn(component->dev, "invalid pll source, use BCLK\n"); case RT274_PLL2_S_BCLK: - snd_soc_update_bits(codec, RT274_PLL2_CTRL, + snd_soc_component_update_bits(component, RT274_PLL2_CTRL, RT274_PLL2_SRC_MASK, RT274_PLL2_SRC_BCLK); break; } if (source == RT274_PLL2_S_BCLK) { - snd_soc_update_bits(codec, RT274_MCLK_CTRL, + snd_soc_component_update_bits(component, RT274_MCLK_CTRL, (0x3 << 12), (0x3 << 12)); switch (rt274->fs) { case 50: - snd_soc_write(codec, 0x7a, 0xaab6); - snd_soc_write(codec, 0x7b, 0x0301); - snd_soc_write(codec, 0x7c, 0x04fe); + snd_soc_component_write(component, 0x7a, 0xaab6); + snd_soc_component_write(component, 0x7b, 0x0301); + snd_soc_component_write(component, 0x7c, 0x04fe); break; case 64: - snd_soc_write(codec, 0x7a, 0xaa96); - snd_soc_write(codec, 0x7b, 0x8003); - snd_soc_write(codec, 0x7c, 0x081e); + snd_soc_component_write(component, 0x7a, 0xaa96); + snd_soc_component_write(component, 0x7b, 0x8003); + snd_soc_component_write(component, 0x7c, 0x081e); break; case 128: - snd_soc_write(codec, 0x7a, 0xaa96); - snd_soc_write(codec, 0x7b, 0x8003); - snd_soc_write(codec, 0x7c, 0x080e); + snd_soc_component_write(component, 0x7a, 0xaa96); + snd_soc_component_write(component, 0x7b, 0x8003); + snd_soc_component_write(component, 0x7c, 0x080e); break; default: - dev_warn(codec->dev, "invalid freq_in, assume 4.8M\n"); + dev_warn(component->dev, "invalid freq_in, assume 4.8M\n"); case 100: - snd_soc_write(codec, 0x7a, 0xaab6); - snd_soc_write(codec, 0x7b, 0x0301); - snd_soc_write(codec, 0x7c, 0x047e); + snd_soc_component_write(component, 0x7a, 0xaab6); + snd_soc_component_write(component, 0x7b, 0x0301); + snd_soc_component_write(component, 0x7c, 0x047e); break; } } @@ -796,11 +796,11 @@ static int rt274_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt274_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); unsigned int clk_src, mclk_en; - dev_dbg(codec->dev, "%s freq=%d\n", __func__, freq); + dev_dbg(component->dev, "%s freq=%d\n", __func__, freq); switch (clk_id) { case RT274_SCLK_S_MCLK: @@ -818,43 +818,43 @@ static int rt274_set_dai_sysclk(struct snd_soc_dai *dai, default: mclk_en = RT274_MCLK_MODE_DIS; clk_src = RT274_CLK_SRC_MCLK; - dev_warn(codec->dev, "invalid sysclk source, use PLL1\n"); + dev_warn(component->dev, "invalid sysclk source, use PLL1\n"); break; } - snd_soc_update_bits(codec, RT274_MCLK_CTRL, + snd_soc_component_update_bits(component, RT274_MCLK_CTRL, RT274_MCLK_MODE_MASK, mclk_en); - snd_soc_update_bits(codec, RT274_CLK_CTRL, + snd_soc_component_update_bits(component, RT274_CLK_CTRL, RT274_CLK_SRC_MASK, clk_src); switch (freq) { case 19200000: if (clk_id == RT274_SCLK_S_MCLK) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL2, 0x40, 0x40); break; case 24000000: if (clk_id == RT274_SCLK_S_MCLK) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL2, 0x40, 0x0); break; case 12288000: case 11289600: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_MCLK_CTRL, 0x1fcf, 0x0008); break; case 24576000: case 22579200: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_MCLK_CTRL, 0x1fcf, 0x1543); break; default: - dev_err(codec->dev, "Unsupported system clock\n"); + dev_err(component->dev, "Unsupported system clock\n"); return -EINVAL; } @@ -866,16 +866,16 @@ static int rt274_set_dai_sysclk(struct snd_soc_dai *dai, static int rt274_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); rt274->fs = ratio; if ((ratio / 50) == 0) - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, 0x1000, 0x1000); else - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, 0x1000, 0x0); @@ -886,28 +886,28 @@ static int rt274_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (rx_mask || tx_mask) { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_TDM_EN, RT274_TDM_EN); } else { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_TDM_EN, RT274_TDM_DIS); return 0; } switch (slots) { case 4: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_TDM_CH_NUM, RT274_TDM_4CH); break; case 2: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT274_I2S_CTRL1, RT274_TDM_CH_NUM, RT274_TDM_2CH); break; default: - dev_err(codec->dev, + dev_err(component->dev, "Support 2 or 4 slots TDM only\n"); return -EINVAL; } @@ -915,20 +915,20 @@ static int rt274_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return 0; } -static int rt274_set_bias_level(struct snd_soc_codec *codec, +static int rt274_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_PREPARE: if (SND_SOC_BIAS_STANDBY == - snd_soc_codec_get_bias_level(codec)) { - snd_soc_write(codec, + snd_soc_component_get_bias_level(component)) { + snd_soc_component_write(component, RT274_SET_AUDIO_POWER, AC_PWRST_D0); } break; case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, + snd_soc_component_write(component, RT274_SET_AUDIO_POWER, AC_PWRST_D3); break; @@ -968,11 +968,11 @@ static irqreturn_t rt274_irq(int irq, void *data) return IRQ_HANDLED; } -static int rt274_probe(struct snd_soc_codec *codec) +static int rt274_probe(struct snd_soc_component *component) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); - rt274->codec = codec; + rt274->component = component; if (rt274->i2c->irq) { INIT_DELAYED_WORK(&rt274->jack_detect_work, @@ -984,19 +984,17 @@ static int rt274_probe(struct snd_soc_codec *codec) return 0; } -static int rt274_remove(struct snd_soc_codec *codec) +static void rt274_remove(struct snd_soc_component *component) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); cancel_delayed_work_sync(&rt274->jack_detect_work); - - return 0; } #ifdef CONFIG_PM -static int rt274_suspend(struct snd_soc_codec *codec) +static int rt274_suspend(struct snd_soc_component *component) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt274->regmap, true); regcache_mark_dirty(rt274->regmap); @@ -1004,12 +1002,12 @@ static int rt274_suspend(struct snd_soc_codec *codec) return 0; } -static int rt274_resume(struct snd_soc_codec *codec) +static int rt274_resume(struct snd_soc_component *component) { - struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec); + struct rt274_priv *rt274 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt274->regmap, false); - rt274_index_sync(codec); + rt274_index_sync(component); regcache_sync(rt274->regmap); return 0; @@ -1055,22 +1053,22 @@ static struct snd_soc_dai_driver rt274_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt274 = { - .probe = rt274_probe, - .remove = rt274_remove, - .suspend = rt274_suspend, - .resume = rt274_resume, - .set_bias_level = rt274_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt274_snd_controls, - .num_controls = ARRAY_SIZE(rt274_snd_controls), - .dapm_widgets = rt274_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt274_dapm_widgets), - .dapm_routes = rt274_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt274_dapm_routes), - }, - .set_jack = rt274_mic_detect, +static const struct snd_soc_component_driver soc_component_dev_rt274 = { + .probe = rt274_probe, + .remove = rt274_remove, + .suspend = rt274_suspend, + .resume = rt274_resume, + .set_bias_level = rt274_set_bias_level, + .set_jack = rt274_mic_detect, + .controls = rt274_snd_controls, + .num_controls = ARRAY_SIZE(rt274_snd_controls), + .dapm_widgets = rt274_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt274_dapm_widgets), + .dapm_routes = rt274_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt274_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt274_regmap = { @@ -1191,7 +1189,8 @@ static int rt274_i2c_probe(struct i2c_client *i2c, } } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt274, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt274, rt274_dai, ARRAY_SIZE(rt274_dai)); return ret; @@ -1203,7 +1202,6 @@ static int rt274_i2c_remove(struct i2c_client *i2c) if (i2c->irq) free_irq(i2c->irq, rt274); - snd_soc_unregister_codec(&i2c->dev); return 0; } diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c index af6325c78292..0b0f748bffbe 100644 --- a/sound/soc/codecs/rt286.c +++ b/sound/soc/codecs/rt286.c @@ -40,7 +40,7 @@ struct rt286_priv { struct reg_default *index_cache; int index_cache_size; struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt286_platform_data pdata; struct i2c_client *i2c; struct snd_soc_jack *jack; @@ -187,13 +187,13 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg) } #ifdef CONFIG_PM -static void rt286_index_sync(struct snd_soc_codec *codec) +static void rt286_index_sync(struct snd_soc_component *component) { - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < INDEX_CACHE_SIZE; i++) { - snd_soc_write(codec, rt286->index_cache[i].reg, + snd_soc_component_write(component, rt286->index_cache[i].reg, rt286->index_cache[i].def); } } @@ -220,10 +220,10 @@ static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic) *hp = false; *mic = false; - if (!rt286->codec) + if (!rt286->component) return -EINVAL; - dapm = snd_soc_codec_get_dapm(rt286->codec); + dapm = snd_soc_component_get_dapm(rt286->component); if (rt286->pdata.cbj_en) { regmap_read(rt286->regmap, RT286_GET_HP_SENSE, &buf); @@ -275,9 +275,10 @@ static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic) regmap_read(rt286->regmap, RT286_GET_MIC1_SENSE, &buf); *mic = buf & 0x80000000; } - - snd_soc_dapm_disable_pin(dapm, "HV"); - snd_soc_dapm_disable_pin(dapm, "VREF"); + if (!*mic) { + snd_soc_dapm_disable_pin(dapm, "HV"); + snd_soc_dapm_disable_pin(dapm, "VREF"); + } if (!*hp) snd_soc_dapm_disable_pin(dapm, "LDO1"); snd_soc_dapm_sync(dapm); @@ -305,10 +306,10 @@ static void rt286_jack_detect_work(struct work_struct *work) SND_JACK_MICROPHONE | SND_JACK_HEADPHONE); } -int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +int rt286_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); rt286->jack = jack; @@ -334,8 +335,8 @@ EXPORT_SYMBOL_GPL(rt286_mic_detect); static int is_mclk_mode(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); if (rt286->clk_id == RT286_SCLK_S_MCLK) return 1; @@ -434,15 +435,15 @@ SOC_DAPM_ENUM("SPO source", rt286_spo_enum); static int rt286_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, + snd_soc_component_write(component, RT286_SPK_EAPD, RT286_SET_EAPD_HIGH); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, + snd_soc_component_write(component, RT286_SPK_EAPD, RT286_SET_EAPD_LOW); break; @@ -456,14 +457,14 @@ static int rt286_spk_event(struct snd_soc_dapm_widget *w, static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0x20); + snd_soc_component_write(component, RT286_SET_PIN_DMIC1, 0x20); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0); + snd_soc_component_write(component, RT286_SET_PIN_DMIC1, 0); break; default: return 0; @@ -475,14 +476,14 @@ static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w, static int rt286_ldo2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT286_POWER_CTRL2, 0x38, 0x08); + snd_soc_component_update_bits(component, RT286_POWER_CTRL2, 0x38, 0x08); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT286_POWER_CTRL2, 0x38, 0x30); + snd_soc_component_update_bits(component, RT286_POWER_CTRL2, 0x38, 0x30); break; default: return 0; @@ -494,19 +495,19 @@ static int rt286_ldo2_event(struct snd_soc_dapm_widget *w, static int rt286_mic1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_A_BIAS_CTRL3, 0xc000, 0x8000); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_A_BIAS_CTRL2, 0xc000, 0x8000); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_A_BIAS_CTRL3, 0xc000, 0x0000); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_A_BIAS_CTRL2, 0xc000, 0x0000); break; default: @@ -674,8 +675,8 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); unsigned int val = 0; int d_len_code; @@ -687,7 +688,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, case 48000: break; default: - dev_err(codec->dev, "Unsupported sample rate %d\n", + dev_err(component->dev, "Unsupported sample rate %d\n", params_rate(params)); return -EINVAL; } @@ -695,7 +696,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, case 12288000: case 24576000: if (params_rate(params) != 48000) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt286->sys_clk); return -EINVAL; } @@ -703,7 +704,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, case 11289600: case 22579200: if (params_rate(params) != 44100) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt286->sys_clk); return -EINVAL; } @@ -714,7 +715,7 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, /* bit 3:0 Number of Channel */ val |= (params_channels(params) - 1); } else { - dev_err(codec->dev, "Unsupported channels %d\n", + dev_err(component->dev, "Unsupported channels %d\n", params_channels(params)); return -EINVAL; } @@ -745,27 +746,27 @@ static int rt286_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x0018, d_len_code << 3); - dev_dbg(codec->dev, "format val = 0x%x\n", val); + dev_dbg(component->dev, "format val = 0x%x\n", val); - snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val); - snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT286_DAC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT286_ADC_FORMAT, 0x407f, val); return 0; } static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x800, 0x800); break; case SND_SOC_DAIFMT_CBS_CFS: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x800, 0x0); break; default: @@ -774,27 +775,27 @@ static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x300, 0x0); break; case SND_SOC_DAIFMT_LEFT_J: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x300, 0x1 << 8); break; case SND_SOC_DAIFMT_DSP_A: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x300, 0x2 << 8); break; case SND_SOC_DAIFMT_DSP_B: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x300, 0x3 << 8); break; default: return -EINVAL; } /* bit 15 Stream Type 0:PCM 1:Non-PCM */ - snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x8000, 0); - snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT286_DAC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT286_ADC_FORMAT, 0x8000, 0); return 0; } @@ -802,58 +803,58 @@ static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt286_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s freq=%d\n", __func__, freq); + dev_dbg(component->dev, "%s freq=%d\n", __func__, freq); if (RT286_SCLK_S_MCLK == clk_id) { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x0100, 0x0); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_PLL_CTRL1, 0x20, 0x20); } else { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x0100, 0x0100); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_PLL_CTRL, 0x4, 0x4); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_PLL_CTRL1, 0x20, 0x0); } switch (freq) { case 19200000: if (RT286_SCLK_S_MCLK == clk_id) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x40, 0x40); break; case 24000000: if (RT286_SCLK_S_MCLK == clk_id) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x40, 0x0); break; case 12288000: case 11289600: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x8, 0x0); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_CLK_DIV, 0xfc1e, 0x0004); break; case 24576000: case 22579200: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL2, 0x8, 0x8); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_CLK_DIV, 0xfc1e, 0x5406); break; default: - dev_err(codec->dev, "Unsupported system clock\n"); + dev_err(component->dev, "Unsupported system clock\n"); return -EINVAL; } @@ -865,42 +866,42 @@ static int rt286_set_dai_sysclk(struct snd_soc_dai *dai, static int rt286_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); if (50 == ratio) - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x1000, 0x1000); else - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_I2S_CTRL1, 0x1000, 0x0); return 0; } -static int rt286_set_bias_level(struct snd_soc_codec *codec, +static int rt286_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_PREPARE: - if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) { - snd_soc_write(codec, + if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) { + snd_soc_component_write(component, RT286_SET_AUDIO_POWER, AC_PWRST_D0); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_DC_GAIN, 0x200, 0x200); } break; case SND_SOC_BIAS_ON: mdelay(10); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT286_DC_GAIN, 0x200, 0x0); break; case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, + snd_soc_component_write(component, RT286_SET_AUDIO_POWER, AC_PWRST_D3); break; @@ -937,11 +938,11 @@ static irqreturn_t rt286_irq(int irq, void *data) return IRQ_HANDLED; } -static int rt286_probe(struct snd_soc_codec *codec) +static int rt286_probe(struct snd_soc_component *component) { - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); - rt286->codec = codec; + rt286->component = component; if (rt286->i2c->irq) { regmap_update_bits(rt286->regmap, @@ -956,19 +957,17 @@ static int rt286_probe(struct snd_soc_codec *codec) return 0; } -static int rt286_remove(struct snd_soc_codec *codec) +static void rt286_remove(struct snd_soc_component *component) { - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); cancel_delayed_work_sync(&rt286->jack_detect_work); - - return 0; } #ifdef CONFIG_PM -static int rt286_suspend(struct snd_soc_codec *codec) +static int rt286_suspend(struct snd_soc_component *component) { - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt286->regmap, true); regcache_mark_dirty(rt286->regmap); @@ -976,12 +975,12 @@ static int rt286_suspend(struct snd_soc_codec *codec) return 0; } -static int rt286_resume(struct snd_soc_codec *codec) +static int rt286_resume(struct snd_soc_component *component) { - struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec); + struct rt286_priv *rt286 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt286->regmap, false); - rt286_index_sync(codec); + rt286_index_sync(component); regcache_sync(rt286->regmap); return 0; @@ -1046,21 +1045,21 @@ static struct snd_soc_dai_driver rt286_dai[] = { }; -static const struct snd_soc_codec_driver soc_codec_dev_rt286 = { - .probe = rt286_probe, - .remove = rt286_remove, - .suspend = rt286_suspend, - .resume = rt286_resume, - .set_bias_level = rt286_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt286_snd_controls, - .num_controls = ARRAY_SIZE(rt286_snd_controls), - .dapm_widgets = rt286_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt286_dapm_widgets), - .dapm_routes = rt286_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt286_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt286 = { + .probe = rt286_probe, + .remove = rt286_remove, + .suspend = rt286_suspend, + .resume = rt286_resume, + .set_bias_level = rt286_set_bias_level, + .controls = rt286_snd_controls, + .num_controls = ARRAY_SIZE(rt286_snd_controls), + .dapm_widgets = rt286_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt286_dapm_widgets), + .dapm_routes = rt286_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt286_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt286_regmap = { @@ -1243,7 +1242,8 @@ static int rt286_i2c_probe(struct i2c_client *i2c, } } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt286, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt286, rt286_dai, ARRAY_SIZE(rt286_dai)); return ret; @@ -1255,7 +1255,6 @@ static int rt286_i2c_remove(struct i2c_client *i2c) if (i2c->irq) free_irq(i2c->irq, rt286); - snd_soc_unregister_codec(&i2c->dev); return 0; } diff --git a/sound/soc/codecs/rt286.h b/sound/soc/codecs/rt286.h index 7130edb152ef..c63d0e79ba86 100644 --- a/sound/soc/codecs/rt286.h +++ b/sound/soc/codecs/rt286.h @@ -199,7 +199,7 @@ enum { RT286_AIFS, }; -int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +int rt286_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif /* __RT286_H__ */ diff --git a/sound/soc/codecs/rt298.c b/sound/soc/codecs/rt298.c index ce963768449f..06cdba4edfe2 100644 --- a/sound/soc/codecs/rt298.c +++ b/sound/soc/codecs/rt298.c @@ -39,7 +39,7 @@ struct rt298_priv { struct reg_default *index_cache; int index_cache_size; struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt298_platform_data pdata; struct i2c_client *i2c; struct snd_soc_jack *jack; @@ -194,13 +194,13 @@ static bool rt298_readable_register(struct device *dev, unsigned int reg) } #ifdef CONFIG_PM -static void rt298_index_sync(struct snd_soc_codec *codec) +static void rt298_index_sync(struct snd_soc_component *component) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < INDEX_CACHE_SIZE; i++) { - snd_soc_write(codec, rt298->index_cache[i].reg, + snd_soc_component_write(component, rt298->index_cache[i].reg, rt298->index_cache[i].def); } } @@ -227,10 +227,10 @@ static int rt298_jack_detect(struct rt298_priv *rt298, bool *hp, bool *mic) *hp = false; *mic = false; - if (!rt298->codec) + if (!rt298->component) return -EINVAL; - dapm = snd_soc_codec_get_dapm(rt298->codec); + dapm = snd_soc_component_get_dapm(rt298->component); if (rt298->pdata.cbj_en) { regmap_read(rt298->regmap, RT298_GET_HP_SENSE, &buf); @@ -290,9 +290,10 @@ static int rt298_jack_detect(struct rt298_priv *rt298, bool *hp, bool *mic) regmap_read(rt298->regmap, RT298_GET_MIC1_SENSE, &buf); *mic = buf & 0x80000000; } - - snd_soc_dapm_disable_pin(dapm, "HV"); - snd_soc_dapm_disable_pin(dapm, "VREF"); + if (!*mic) { + snd_soc_dapm_disable_pin(dapm, "HV"); + snd_soc_dapm_disable_pin(dapm, "VREF"); + } if (!*hp) snd_soc_dapm_disable_pin(dapm, "LDO1"); snd_soc_dapm_sync(dapm); @@ -323,9 +324,9 @@ static void rt298_jack_detect_work(struct work_struct *work) SND_JACK_MICROPHONE | SND_JACK_HEADPHONE); } -int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) +int rt298_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); struct snd_soc_dapm_context *dapm; bool hp = false; bool mic = false; @@ -334,7 +335,7 @@ int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) /* If jack in NULL, disable HS jack */ if (!jack) { regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x0); - dapm = snd_soc_codec_get_dapm(codec); + dapm = snd_soc_component_get_dapm(component); snd_soc_dapm_disable_pin(dapm, "LDO1"); snd_soc_dapm_sync(dapm); return 0; @@ -360,8 +361,8 @@ EXPORT_SYMBOL_GPL(rt298_mic_detect); static int is_mclk_mode(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); if (rt298->clk_id == RT298_SCLK_S_MCLK) return 1; @@ -458,15 +459,15 @@ SOC_DAPM_ENUM("SPO source", rt298_spo_enum); static int rt298_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, + snd_soc_component_write(component, RT298_SPK_EAPD, RT298_SET_EAPD_HIGH); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, + snd_soc_component_write(component, RT298_SPK_EAPD, RT298_SET_EAPD_LOW); break; @@ -480,14 +481,14 @@ static int rt298_spk_event(struct snd_soc_dapm_widget *w, static int rt298_set_dmic1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, RT298_SET_PIN_DMIC1, 0x20); + snd_soc_component_write(component, RT298_SET_PIN_DMIC1, 0x20); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, RT298_SET_PIN_DMIC1, 0); + snd_soc_component_write(component, RT298_SET_PIN_DMIC1, 0); break; default: return 0; @@ -499,39 +500,39 @@ static int rt298_set_dmic1_event(struct snd_soc_dapm_widget *w, static int rt298_adc_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int nid; nid = (w->reg >> 20) & 0xff; switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0), 0x7080, 0x7000); /* If MCLK doesn't exist, reset AD filter */ - if (!(snd_soc_read(codec, RT298_VAD_CTRL) & 0x200)) { + if (!(snd_soc_component_read32(component, RT298_VAD_CTRL) & 0x200)) { pr_info("NO MCLK\n"); switch (nid) { case RT298_ADC_IN1: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_D_FILTER_CTRL, 0x2, 0x2); mdelay(10); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_D_FILTER_CTRL, 0x2, 0x0); break; case RT298_ADC_IN2: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_D_FILTER_CTRL, 0x4, 0x4); mdelay(10); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_D_FILTER_CTRL, 0x4, 0x0); break; } } break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0), 0x7080, 0x7080); break; @@ -545,19 +546,19 @@ static int rt298_adc_event(struct snd_soc_dapm_widget *w, static int rt298_mic1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_A_BIAS_CTRL3, 0xc000, 0x8000); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_A_BIAS_CTRL2, 0xc000, 0x8000); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_A_BIAS_CTRL3, 0xc000, 0x0000); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_A_BIAS_CTRL2, 0xc000, 0x0000); break; default: @@ -745,8 +746,8 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); unsigned int val = 0; int d_len_code; @@ -756,7 +757,7 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, case 48000: break; default: - dev_err(codec->dev, "Unsupported sample rate %d\n", + dev_err(component->dev, "Unsupported sample rate %d\n", params_rate(params)); return -EINVAL; } @@ -764,7 +765,7 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, case 12288000: case 24576000: if (params_rate(params) != 48000) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt298->sys_clk); return -EINVAL; } @@ -772,7 +773,7 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, case 11289600: case 22579200: if (params_rate(params) != 44100) { - dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n", + dev_err(component->dev, "Sys_clk is not matched (%d %d)\n", params_rate(params), rt298->sys_clk); return -EINVAL; } @@ -783,7 +784,7 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, /* bit 3:0 Number of Channel */ val |= (params_channels(params) - 1); } else { - dev_err(codec->dev, "Unsupported channels %d\n", + dev_err(component->dev, "Unsupported channels %d\n", params_channels(params)); return -EINVAL; } @@ -814,27 +815,27 @@ static int rt298_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x0018, d_len_code << 3); - dev_dbg(codec->dev, "format val = 0x%x\n", val); + dev_dbg(component->dev, "format val = 0x%x\n", val); - snd_soc_update_bits(codec, RT298_DAC_FORMAT, 0x407f, val); - snd_soc_update_bits(codec, RT298_ADC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT298_DAC_FORMAT, 0x407f, val); + snd_soc_component_update_bits(component, RT298_ADC_FORMAT, 0x407f, val); return 0; } static int rt298_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x800, 0x800); break; case SND_SOC_DAIFMT_CBS_CFS: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x800, 0x0); break; default: @@ -843,27 +844,27 @@ static int rt298_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x300, 0x0); break; case SND_SOC_DAIFMT_LEFT_J: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x300, 0x1 << 8); break; case SND_SOC_DAIFMT_DSP_A: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x300, 0x2 << 8); break; case SND_SOC_DAIFMT_DSP_B: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x300, 0x3 << 8); break; default: return -EINVAL; } /* bit 15 Stream Type 0:PCM 1:Non-PCM */ - snd_soc_update_bits(codec, RT298_DAC_FORMAT, 0x8000, 0); - snd_soc_update_bits(codec, RT298_ADC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT298_DAC_FORMAT, 0x8000, 0); + snd_soc_component_update_bits(component, RT298_ADC_FORMAT, 0x8000, 0); return 0; } @@ -871,56 +872,56 @@ static int rt298_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt298_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s freq=%d\n", __func__, freq); + dev_dbg(component->dev, "%s freq=%d\n", __func__, freq); if (RT298_SCLK_S_MCLK == clk_id) { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x0100, 0x0); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_PLL_CTRL1, 0x20, 0x20); } else { - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x0100, 0x0100); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_PLL_CTRL1, 0x20, 0x0); } switch (freq) { case 19200000: if (RT298_SCLK_S_MCLK == clk_id) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x40, 0x40); break; case 24000000: if (RT298_SCLK_S_MCLK == clk_id) { - dev_err(codec->dev, "Should not use MCLK\n"); + dev_err(component->dev, "Should not use MCLK\n"); return -EINVAL; } - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x40, 0x0); break; case 12288000: case 11289600: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x8, 0x0); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_CLK_DIV, 0xfc1e, 0x0004); break; case 24576000: case 22579200: - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL2, 0x8, 0x8); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_CLK_DIV, 0xfc1e, 0x5406); break; default: - dev_err(codec->dev, "Unsupported system clock\n"); + dev_err(component->dev, "Unsupported system clock\n"); return -EINVAL; } @@ -932,39 +933,39 @@ static int rt298_set_dai_sysclk(struct snd_soc_dai *dai, static int rt298_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); if (50 == ratio) - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x1000, 0x1000); else - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT298_I2S_CTRL1, 0x1000, 0x0); return 0; } -static int rt298_set_bias_level(struct snd_soc_codec *codec, +static int rt298_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_PREPARE: if (SND_SOC_BIAS_STANDBY == - snd_soc_codec_get_bias_level(codec)) { - snd_soc_write(codec, + snd_soc_component_get_bias_level(component)) { + snd_soc_component_write(component, RT298_SET_AUDIO_POWER, AC_PWRST_D0); - snd_soc_update_bits(codec, 0x0d, 0x200, 0x200); - snd_soc_update_bits(codec, 0x52, 0x80, 0x0); + snd_soc_component_update_bits(component, 0x0d, 0x200, 0x200); + snd_soc_component_update_bits(component, 0x52, 0x80, 0x0); mdelay(20); - snd_soc_update_bits(codec, 0x0d, 0x200, 0x0); - snd_soc_update_bits(codec, 0x52, 0x80, 0x80); + snd_soc_component_update_bits(component, 0x0d, 0x200, 0x0); + snd_soc_component_update_bits(component, 0x52, 0x80, 0x80); } break; case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, + snd_soc_component_write(component, RT298_SET_AUDIO_POWER, AC_PWRST_D3); break; @@ -1003,11 +1004,11 @@ static irqreturn_t rt298_irq(int irq, void *data) return IRQ_HANDLED; } -static int rt298_probe(struct snd_soc_codec *codec) +static int rt298_probe(struct snd_soc_component *component) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); - rt298->codec = codec; + rt298->component = component; if (rt298->i2c->irq) { regmap_update_bits(rt298->regmap, @@ -1022,19 +1023,17 @@ static int rt298_probe(struct snd_soc_codec *codec) return 0; } -static int rt298_remove(struct snd_soc_codec *codec) +static void rt298_remove(struct snd_soc_component *component) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); cancel_delayed_work_sync(&rt298->jack_detect_work); - - return 0; } #ifdef CONFIG_PM -static int rt298_suspend(struct snd_soc_codec *codec) +static int rt298_suspend(struct snd_soc_component *component) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); rt298->is_hp_in = -1; regcache_cache_only(rt298->regmap, true); @@ -1043,12 +1042,12 @@ static int rt298_suspend(struct snd_soc_codec *codec) return 0; } -static int rt298_resume(struct snd_soc_codec *codec) +static int rt298_resume(struct snd_soc_component *component) { - struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); + struct rt298_priv *rt298 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt298->regmap, false); - rt298_index_sync(codec); + rt298_index_sync(component); regcache_sync(rt298->regmap); return 0; @@ -1113,21 +1112,21 @@ static struct snd_soc_dai_driver rt298_dai[] = { }; -static const struct snd_soc_codec_driver soc_codec_dev_rt298 = { - .probe = rt298_probe, - .remove = rt298_remove, - .suspend = rt298_suspend, - .resume = rt298_resume, - .set_bias_level = rt298_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt298_snd_controls, - .num_controls = ARRAY_SIZE(rt298_snd_controls), - .dapm_widgets = rt298_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt298_dapm_widgets), - .dapm_routes = rt298_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt298_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt298 = { + .probe = rt298_probe, + .remove = rt298_remove, + .suspend = rt298_suspend, + .resume = rt298_resume, + .set_bias_level = rt298_set_bias_level, + .controls = rt298_snd_controls, + .num_controls = ARRAY_SIZE(rt298_snd_controls), + .dapm_widgets = rt298_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt298_dapm_widgets), + .dapm_routes = rt298_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt298_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt298_regmap = { @@ -1288,7 +1287,8 @@ static int rt298_i2c_probe(struct i2c_client *i2c, } } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt298, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt298, rt298_dai, ARRAY_SIZE(rt298_dai)); return ret; @@ -1300,7 +1300,6 @@ static int rt298_i2c_remove(struct i2c_client *i2c) if (i2c->irq) free_irq(i2c->irq, rt298); - snd_soc_unregister_codec(&i2c->dev); return 0; } diff --git a/sound/soc/codecs/rt298.h b/sound/soc/codecs/rt298.h index 3638f3d61209..b4db935359fa 100644 --- a/sound/soc/codecs/rt298.h +++ b/sound/soc/codecs/rt298.h @@ -210,7 +210,7 @@ enum { RT298_AIFS, }; -int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack); +int rt298_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif /* __RT298_H__ */ diff --git a/sound/soc/codecs/rt5514-spi.c b/sound/soc/codecs/rt5514-spi.c index 2144edca97b0..18686ffb0cd5 100644 --- a/sound/soc/codecs/rt5514-spi.c +++ b/sound/soc/codecs/rt5514-spi.c @@ -35,6 +35,8 @@ #include "rt5514-spi.h" +#define DRV_NAME "rt5514-spi" + static struct spi_device *rt5514_spi; struct rt5514_dsp { @@ -211,8 +213,9 @@ static int rt5514_spi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct rt5514_dsp *rt5514_dsp = - snd_soc_platform_get_drvdata(rtd->platform); + snd_soc_component_get_drvdata(component); int ret; u8 buf[8]; @@ -235,8 +238,9 @@ static int rt5514_spi_hw_params(struct snd_pcm_substream *substream, static int rt5514_spi_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct rt5514_dsp *rt5514_dsp = - snd_soc_platform_get_drvdata(rtd->platform); + snd_soc_component_get_drvdata(component); mutex_lock(&rt5514_dsp->dma_lock); rt5514_dsp->substream = NULL; @@ -252,8 +256,9 @@ static snd_pcm_uframes_t rt5514_spi_pcm_pointer( { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct rt5514_dsp *rt5514_dsp = - snd_soc_platform_get_drvdata(rtd->platform); + snd_soc_component_get_drvdata(component); return bytes_to_frames(runtime, rt5514_dsp->dma_offset); } @@ -267,18 +272,18 @@ static const struct snd_pcm_ops rt5514_spi_pcm_ops = { .page = snd_pcm_lib_get_vmalloc_page, }; -static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform) +static int rt5514_spi_pcm_probe(struct snd_soc_component *component) { struct rt5514_dsp *rt5514_dsp; int ret; - rt5514_dsp = devm_kzalloc(platform->dev, sizeof(*rt5514_dsp), + rt5514_dsp = devm_kzalloc(component->dev, sizeof(*rt5514_dsp), GFP_KERNEL); rt5514_dsp->dev = &rt5514_spi->dev; mutex_init(&rt5514_dsp->dma_lock); INIT_DELAYED_WORK(&rt5514_dsp->copy_work, rt5514_spi_copy_work); - snd_soc_platform_set_drvdata(platform, rt5514_dsp); + snd_soc_component_set_drvdata(component, rt5514_dsp); if (rt5514_spi->irq) { ret = devm_request_threaded_irq(&rt5514_spi->dev, @@ -296,15 +301,12 @@ static int rt5514_spi_pcm_probe(struct snd_soc_platform *platform) return 0; } -static const struct snd_soc_platform_driver rt5514_spi_platform = { +static const struct snd_soc_component_driver rt5514_spi_component = { + .name = DRV_NAME, .probe = rt5514_spi_pcm_probe, .ops = &rt5514_spi_pcm_ops, }; -static const struct snd_soc_component_driver rt5514_spi_dai_component = { - .name = "rt5514-spi-dai", -}; - /** * rt5514_spi_burst_read - Read data from SPI by rt5514 address. * @addr: Start address. @@ -445,14 +447,8 @@ static int rt5514_spi_probe(struct spi_device *spi) rt5514_spi = spi; - ret = devm_snd_soc_register_platform(&spi->dev, &rt5514_spi_platform); - if (ret < 0) { - dev_err(&spi->dev, "Failed to register platform.\n"); - return ret; - } - ret = devm_snd_soc_register_component(&spi->dev, - &rt5514_spi_dai_component, + &rt5514_spi_component, &rt5514_spi_dai, 1); if (ret < 0) { dev_err(&spi->dev, "Failed to register component.\n"); @@ -474,9 +470,9 @@ static int __maybe_unused rt5514_suspend(struct device *dev) static int __maybe_unused rt5514_resume(struct device *dev) { - struct snd_soc_platform *platform = snd_soc_lookup_platform(dev); + struct snd_soc_component *component = snd_soc_lookup_component(dev, DRV_NAME); struct rt5514_dsp *rt5514_dsp = - snd_soc_platform_get_drvdata(platform); + snd_soc_component_get_drvdata(component); int irq = to_spi_device(dev)->irq; u8 buf[8]; diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c index 198df016802f..e8a66b03faab 100644 --- a/sound/soc/codecs/rt5514.c +++ b/sound/soc/codecs/rt5514.c @@ -327,14 +327,13 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); - struct snd_soc_codec *codec = rt5514->codec; const struct firmware *fw = NULL; u8 buf[8]; if (ucontrol->value.integer.value[0] == rt5514->dsp_enabled) return 0; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { rt5514->dsp_enabled = ucontrol->value.integer.value[0]; if (rt5514->dsp_enabled) { @@ -342,11 +341,11 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, !IS_ERR(rt5514->dsp_calib_clk)) { if (clk_set_rate(rt5514->dsp_calib_clk, rt5514->pdata.dsp_calib_clk_rate)) - dev_err(codec->dev, + dev_err(component->dev, "Can't set rate for mclk"); if (clk_prepare_enable(rt5514->dsp_calib_clk)) - dev_err(codec->dev, + dev_err(component->dev, "Can't enable dsp_calib_clk"); rt5514_calibration(rt5514, true); @@ -354,11 +353,11 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, msleep(20); #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) rt5514_spi_burst_read(RT5514_PLL3_CALIB_CTRL6 | - RT5514_DSP_MAPPING, - (u8 *)&buf, sizeof(buf)); + RT5514_DSP_MAPPING, buf, sizeof(buf)); #else - dev_err(codec->dev, "There is no SPI driver for" + dev_err(component->dev, "There is no SPI driver for" " loading the firmware\n"); + memset(buf, 0, sizeof(buf)); #endif rt5514->pll3_cal_value = buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24; @@ -369,26 +368,26 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, rt5514_enable_dsp_prepare(rt5514); - request_firmware(&fw, RT5514_FIRMWARE1, codec->dev); + request_firmware(&fw, RT5514_FIRMWARE1, component->dev); if (fw) { #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) rt5514_spi_burst_write(0x4ff60000, fw->data, ((fw->size/8)+1)*8); #else - dev_err(codec->dev, "There is no SPI driver for" + dev_err(component->dev, "There is no SPI driver for" " loading the firmware\n"); #endif release_firmware(fw); fw = NULL; } - request_firmware(&fw, RT5514_FIRMWARE2, codec->dev); + request_firmware(&fw, RT5514_FIRMWARE2, component->dev); if (fw) { #if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) rt5514_spi_burst_write(0x4ffc0000, fw->data, ((fw->size/8)+1)*8); #else - dev_err(codec->dev, "There is no SPI driver for" + dev_err(component->dev, "There is no SPI driver for" " loading the firmware\n"); #endif release_firmware(fw); @@ -492,7 +491,7 @@ static const struct snd_kcontrol_new rt5514_sto2_dmic_mux = * Choose divider parameter that gives the highest possible DMIC frequency in * 1MHz - 3MHz range. */ -static int rt5514_calc_dmic_clk(struct snd_soc_codec *codec, int rate) +static int rt5514_calc_dmic_clk(struct snd_soc_component *component, int rate) { int div[] = {2, 3, 4, 8, 12, 16, 24, 32}; int i; @@ -508,20 +507,20 @@ static int rt5514_calc_dmic_clk(struct snd_soc_codec *codec, int rate) return i; } - dev_warn(codec->dev, "Base clock rate %d is too high\n", rate); + dev_warn(component->dev, "Base clock rate %d is too high\n", rate); return -EINVAL; } static int rt5514_set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); int idx; - idx = rt5514_calc_dmic_clk(codec, rt5514->sysclk); + idx = rt5514_calc_dmic_clk(component, rt5514->sysclk); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL1, RT5514_CLK_DMIC_OUT_SEL_MASK, @@ -536,8 +535,8 @@ static int rt5514_set_dmic_clk(struct snd_soc_dapm_widget *w, static int rt5514_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); if (rt5514->sysclk_src == RT5514_SCLK_S_PLL1) return 1; @@ -548,8 +547,8 @@ static int rt5514_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, static int rt5514_i2s_use_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); return (rt5514->sysclk > rt5514->lrck * 384); } @@ -751,21 +750,21 @@ static const struct snd_soc_dapm_route rt5514_dapm_routes[] = { static int rt5514_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); int pre_div, bclk_ms, frame_size; unsigned int val_len = 0; rt5514->lrck = params_rate(params); pre_div = rl6231_get_clk_info(rt5514->sysclk, rt5514->lrck); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting\n"); + dev_err(component->dev, "Unsupported clock setting\n"); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } @@ -808,8 +807,8 @@ static int rt5514_hw_params(struct snd_pcm_substream *substream, static int rt5514_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_INV_MASK) { @@ -862,8 +861,8 @@ static int rt5514_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5514_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5514->sysclk && clk_id == rt5514->sysclk_src) @@ -879,7 +878,7 @@ static int rt5514_set_dai_sysclk(struct snd_soc_dai *dai, break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } @@ -897,13 +896,13 @@ static int rt5514_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5514_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5514->pll_in = 0; rt5514->pll_out = 0; @@ -930,17 +929,17 @@ static int rt5514_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); @@ -961,8 +960,8 @@ static int rt5514_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); unsigned int val = 0, val2 = 0; if (rx_mask || tx_mask) @@ -1047,10 +1046,10 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return 0; } -static int rt5514_set_bias_level(struct snd_soc_codec *codec, +static int rt5514_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1058,7 +1057,7 @@ static int rt5514_set_bias_level(struct snd_soc_codec *codec, if (IS_ERR(rt5514->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(rt5514->mclk); } else { ret = clk_prepare_enable(rt5514->mclk); @@ -1068,7 +1067,7 @@ static int rt5514_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { /* * If the DSP is enabled in start of recording, the DSP * should be disabled, and sync back to normal recording @@ -1092,13 +1091,13 @@ static int rt5514_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5514_probe(struct snd_soc_codec *codec) +static int rt5514_probe(struct snd_soc_component *component) { - struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); - struct platform_device *pdev = container_of(codec->dev, + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); + struct platform_device *pdev = container_of(component->dev, struct platform_device, dev); - rt5514->mclk = devm_clk_get(codec->dev, "mclk"); + rt5514->mclk = devm_clk_get(component->dev, "mclk"); if (PTR_ERR(rt5514->mclk) == -EPROBE_DEFER) return -EPROBE_DEFER; @@ -1109,7 +1108,7 @@ static int rt5514_probe(struct snd_soc_codec *codec) return -EPROBE_DEFER; } - rt5514->codec = codec; + rt5514->component = component; rt5514->pll3_cal_value = 0x0078b000; return 0; @@ -1162,18 +1161,18 @@ static struct snd_soc_dai_driver rt5514_dai[] = { } }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5514 = { - .probe = rt5514_probe, - .idle_bias_off = true, - .set_bias_level = rt5514_set_bias_level, - .component_driver = { - .controls = rt5514_snd_controls, - .num_controls = ARRAY_SIZE(rt5514_snd_controls), - .dapm_widgets = rt5514_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5514_dapm_widgets), - .dapm_routes = rt5514_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5514_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5514 = { + .probe = rt5514_probe, + .set_bias_level = rt5514_set_bias_level, + .controls = rt5514_snd_controls, + .num_controls = ARRAY_SIZE(rt5514_snd_controls), + .dapm_widgets = rt5514_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5514_dapm_widgets), + .dapm_routes = rt5514_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5514_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5514_i2c_regmap = { @@ -1313,17 +1312,11 @@ static int rt5514_i2c_probe(struct i2c_client *i2c, if (ret != 0) dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5514, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5514, rt5514_dai, ARRAY_SIZE(rt5514_dai)); } -static int rt5514_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static const struct dev_pm_ops rt5514_i2_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(NULL, rt5514_i2c_resume) }; @@ -1336,7 +1329,6 @@ static struct i2c_driver rt5514_i2c_driver = { .pm = &rt5514_i2_pm_ops, }, .probe = rt5514_i2c_probe, - .remove = rt5514_i2c_remove, .id_table = rt5514_i2c_id, }; module_i2c_driver(rt5514_i2c_driver); diff --git a/sound/soc/codecs/rt5514.h b/sound/soc/codecs/rt5514.h index f0f3400ce6b1..d1ef0b3f566f 100644 --- a/sound/soc/codecs/rt5514.h +++ b/sound/soc/codecs/rt5514.h @@ -272,7 +272,7 @@ enum { struct rt5514_priv { struct rt5514_platform_data pdata; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regmap *i2c_regmap, *regmap; struct clk *mclk, *dsp_calib_clk; int sysclk; diff --git a/sound/soc/codecs/rt5616.c b/sound/soc/codecs/rt5616.c index 0e5f54a9bc7e..3dc795f444ce 100644 --- a/sound/soc/codecs/rt5616.c +++ b/sound/soc/codecs/rt5616.c @@ -142,7 +142,7 @@ static const struct reg_default rt5616_reg[] = { }; struct rt5616_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct delayed_work patch_work; struct regmap *regmap; struct clk *mclk; @@ -351,7 +351,7 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, { unsigned int val; - val = snd_soc_read(snd_soc_dapm_to_codec(source->dapm), RT5616_GLB_CLK); + val = snd_soc_component_read32(snd_soc_dapm_to_component(source->dapm), RT5616_GLB_CLK); val &= RT5616_SCLK_SRC_MASK; if (val == RT5616_SCLK_SRC_PLL1) return 1; @@ -466,16 +466,16 @@ static const struct snd_kcontrol_new rt5616_lout_mix[] = { static int rt5616_adc_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL, + snd_soc_component_update_bits(component, RT5616_ADC_DIG_VOL, RT5616_L_MUTE | RT5616_R_MUTE, 0); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, RT5616_ADC_DIG_VOL, + snd_soc_component_update_bits(component, RT5616_ADC_DIG_VOL, RT5616_L_MUTE | RT5616_R_MUTE, RT5616_L_MUTE | RT5616_R_MUTE); break; @@ -490,51 +490,51 @@ static int rt5616_adc_event(struct snd_soc_dapm_widget *w, static int rt5616_charge_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: /* depop parameters */ - snd_soc_update_bits(codec, RT5616_DEPOP_M2, + snd_soc_component_update_bits(component, RT5616_DEPOP_M2, RT5616_DEPOP_MASK, RT5616_DEPOP_MAN); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_HP_CP_MASK | RT5616_HP_SG_MASK | RT5616_HP_CB_MASK, RT5616_HP_CP_PU | RT5616_HP_SG_DIS | RT5616_HP_CB_PU); - snd_soc_write(codec, RT5616_PR_BASE + + snd_soc_component_write(component, RT5616_PR_BASE + RT5616_HP_DCC_INT1, 0x9f00); /* headphone amp power on */ - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_FV1 | RT5616_PWR_FV2, 0); - snd_soc_update_bits(codec, RT5616_PWR_VOL, + snd_soc_component_update_bits(component, RT5616_PWR_VOL, RT5616_PWR_HV_L | RT5616_PWR_HV_R, RT5616_PWR_HV_L | RT5616_PWR_HV_R); - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_HP_L | RT5616_PWR_HP_R | RT5616_PWR_HA, RT5616_PWR_HP_L | RT5616_PWR_HP_R | RT5616_PWR_HA); msleep(50); - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_FV1 | RT5616_PWR_FV2, RT5616_PWR_FV1 | RT5616_PWR_FV2); - snd_soc_update_bits(codec, RT5616_CHARGE_PUMP, + snd_soc_component_update_bits(component, RT5616_CHARGE_PUMP, RT5616_PM_HP_MASK, RT5616_PM_HP_HV); - snd_soc_update_bits(codec, RT5616_PR_BASE + + snd_soc_component_update_bits(component, RT5616_PR_BASE + RT5616_CHOP_DAC_ADC, 0x0200, 0x0200); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_HP_CO_MASK | RT5616_HP_SG_MASK, RT5616_HP_CO_EN | RT5616_HP_SG_EN); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5616_PR_BASE + + snd_soc_component_update_bits(component, RT5616_PR_BASE + RT5616_CHOP_DAC_ADC, 0x0200, 0x0); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK | RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS | RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS); /* headphone amp power down */ - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_SMT_TRIG_MASK | RT5616_HP_CD_PD_MASK | RT5616_HP_CO_MASK | RT5616_HP_CP_MASK | RT5616_HP_SG_MASK | @@ -542,7 +542,7 @@ static int rt5616_charge_pump_event(struct snd_soc_dapm_widget *w, RT5616_SMT_TRIG_DIS | RT5616_HP_CD_PD_EN | RT5616_HP_CO_DIS | RT5616_HP_CP_PD | RT5616_HP_SG_EN | RT5616_HP_CB_PD); - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_HP_L | RT5616_PWR_HP_R | RT5616_PWR_HA, 0); break; @@ -556,61 +556,61 @@ static int rt5616_charge_pump_event(struct snd_soc_dapm_widget *w, static int rt5616_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: /* headphone unmute sequence */ - snd_soc_update_bits(codec, RT5616_DEPOP_M3, + snd_soc_component_update_bits(component, RT5616_DEPOP_M3, RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK | RT5616_CP_FQ3_MASK, RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ1_SFT | RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT | RT5616_CP_FQ_192_KHZ << RT5616_CP_FQ3_SFT); - snd_soc_write(codec, RT5616_PR_BASE + + snd_soc_component_write(component, RT5616_PR_BASE + RT5616_MAMP_INT_REG2, 0xfc00); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_SMT_TRIG_MASK, RT5616_SMT_TRIG_EN); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_RSTN_MASK, RT5616_RSTN_EN); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_RSTN_MASK | RT5616_HP_L_SMT_MASK | RT5616_HP_R_SMT_MASK, RT5616_RSTN_DIS | RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN); - snd_soc_update_bits(codec, RT5616_HP_VOL, + snd_soc_component_update_bits(component, RT5616_HP_VOL, RT5616_L_MUTE | RT5616_R_MUTE, 0); msleep(100); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_HP_SG_MASK | RT5616_HP_L_SMT_MASK | RT5616_HP_R_SMT_MASK, RT5616_HP_SG_DIS | RT5616_HP_L_SMT_DIS | RT5616_HP_R_SMT_DIS); msleep(20); - snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET, + snd_soc_component_update_bits(component, RT5616_HP_CALIB_AMP_DET, RT5616_HPD_PS_MASK, RT5616_HPD_PS_EN); break; case SND_SOC_DAPM_PRE_PMD: /* headphone mute sequence */ - snd_soc_update_bits(codec, RT5616_DEPOP_M3, + snd_soc_component_update_bits(component, RT5616_DEPOP_M3, RT5616_CP_FQ1_MASK | RT5616_CP_FQ2_MASK | RT5616_CP_FQ3_MASK, RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ1_SFT | RT5616_CP_FQ_12_KHZ << RT5616_CP_FQ2_SFT | RT5616_CP_FQ_96_KHZ << RT5616_CP_FQ3_SFT); - snd_soc_write(codec, RT5616_PR_BASE + + snd_soc_component_write(component, RT5616_PR_BASE + RT5616_MAMP_INT_REG2, 0xfc00); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_HP_SG_MASK, RT5616_HP_SG_EN); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_RSTP_MASK, RT5616_RSTP_EN); - snd_soc_update_bits(codec, RT5616_DEPOP_M1, + snd_soc_component_update_bits(component, RT5616_DEPOP_M1, RT5616_RSTP_MASK | RT5616_HP_L_SMT_MASK | RT5616_HP_R_SMT_MASK, RT5616_RSTP_DIS | RT5616_HP_L_SMT_EN | RT5616_HP_R_SMT_EN); - snd_soc_update_bits(codec, RT5616_HP_CALIB_AMP_DET, + snd_soc_component_update_bits(component, RT5616_HP_CALIB_AMP_DET, RT5616_HPD_PS_MASK, RT5616_HPD_PS_DIS); msleep(90); - snd_soc_update_bits(codec, RT5616_HP_VOL, + snd_soc_component_update_bits(component, RT5616_HP_VOL, RT5616_L_MUTE | RT5616_R_MUTE, RT5616_L_MUTE | RT5616_R_MUTE); msleep(30); @@ -626,21 +626,21 @@ static int rt5616_hp_event(struct snd_soc_dapm_widget *w, static int rt5616_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_LM, RT5616_PWR_LM); - snd_soc_update_bits(codec, RT5616_LOUT_CTRL1, + snd_soc_component_update_bits(component, RT5616_LOUT_CTRL1, RT5616_L_MUTE | RT5616_R_MUTE, 0); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5616_LOUT_CTRL1, + snd_soc_component_update_bits(component, RT5616_LOUT_CTRL1, RT5616_L_MUTE | RT5616_R_MUTE, RT5616_L_MUTE | RT5616_R_MUTE); - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_LM, 0); break; @@ -654,16 +654,16 @@ static int rt5616_lout_event(struct snd_soc_dapm_widget *w, static int rt5616_bst1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5616_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG2, RT5616_PWR_BST1_OP2, RT5616_PWR_BST1_OP2); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5616_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG2, RT5616_PWR_BST1_OP2, 0); break; @@ -677,16 +677,16 @@ static int rt5616_bst1_event(struct snd_soc_dapm_widget *w, static int rt5616_bst2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5616_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG2, RT5616_PWR_BST2_OP2, RT5616_PWR_BST2_OP2); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5616_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG2, RT5616_PWR_BST2_OP2, 0); break; @@ -960,8 +960,8 @@ static int rt5616_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, bclk_ms, frame_size; @@ -970,12 +970,12 @@ static int rt5616_hw_params(struct snd_pcm_substream *substream, pre_div = rl6231_get_clk_info(rt5616->sysclk, rt5616->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting\n"); + dev_err(component->dev, "Unsupported clock setting\n"); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } bclk_ms = frame_size > 32 ? 1 : 0; @@ -1004,17 +1004,17 @@ static int rt5616_hw_params(struct snd_pcm_substream *substream, mask_clk = RT5616_I2S_PD1_MASK; val_clk = pre_div << RT5616_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5616_I2S1_SDP, + snd_soc_component_update_bits(component, RT5616_I2S1_SDP, RT5616_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5616_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5616_ADDA_CLK1, mask_clk, val_clk); return 0; } static int rt5616_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1055,7 +1055,7 @@ static int rt5616_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, RT5616_I2S1_SDP, + snd_soc_component_update_bits(component, RT5616_I2S1_SDP, RT5616_I2S_MS_MASK | RT5616_I2S_BP_MASK | RT5616_I2S_DF_MASK, reg_val); @@ -1065,8 +1065,8 @@ static int rt5616_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5616_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5616->sysclk && clk_id == rt5616->sysclk_src) @@ -1080,11 +1080,11 @@ static int rt5616_set_dai_sysclk(struct snd_soc_dai *dai, reg_val |= RT5616_SCLK_SRC_PLL1; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5616_GLB_CLK, + snd_soc_component_update_bits(component, RT5616_GLB_CLK, RT5616_SCLK_SRC_MASK, reg_val); rt5616->sysclk = freq; rt5616->sysclk_src = clk_id; @@ -1097,8 +1097,8 @@ static int rt5616_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -1107,11 +1107,11 @@ static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5616->pll_in = 0; rt5616->pll_out = 0; - snd_soc_update_bits(codec, RT5616_GLB_CLK, + snd_soc_component_update_bits(component, RT5616_GLB_CLK, RT5616_SCLK_SRC_MASK, RT5616_SCLK_SRC_MCLK); return 0; @@ -1119,34 +1119,34 @@ static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, switch (source) { case RT5616_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5616_GLB_CLK, + snd_soc_component_update_bits(component, RT5616_GLB_CLK, RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_MCLK); break; case RT5616_PLL1_S_BCLK1: case RT5616_PLL1_S_BCLK2: - snd_soc_update_bits(codec, RT5616_GLB_CLK, + snd_soc_component_update_bits(component, RT5616_GLB_CLK, RT5616_PLL1_SRC_MASK, RT5616_PLL1_SRC_BCLK1); break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5616_PLL_CTRL1, + snd_soc_component_write(component, RT5616_PLL_CTRL1, pll_code.n_code << RT5616_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5616_PLL_CTRL2, + snd_soc_component_write(component, RT5616_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5616_PLL_M_SFT | pll_code.m_bp << RT5616_PLL_M_BP_SFT); @@ -1158,10 +1158,10 @@ static int rt5616_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; } -static int rt5616_set_bias_level(struct snd_soc_codec *codec, +static int rt5616_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1180,7 +1180,7 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, if (IS_ERR(rt5616->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(rt5616->mclk); } else { ret = clk_prepare_enable(rt5616->mclk); @@ -1190,30 +1190,30 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_VREF1 | RT5616_PWR_MB | RT5616_PWR_BG | RT5616_PWR_VREF2, RT5616_PWR_VREF1 | RT5616_PWR_MB | RT5616_PWR_BG | RT5616_PWR_VREF2); mdelay(10); - snd_soc_update_bits(codec, RT5616_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5616_PWR_ANLG1, RT5616_PWR_FV1 | RT5616_PWR_FV2, RT5616_PWR_FV1 | RT5616_PWR_FV2); - snd_soc_update_bits(codec, RT5616_D_MISC, + snd_soc_component_update_bits(component, RT5616_D_MISC, RT5616_D_GATE_EN, RT5616_D_GATE_EN); } break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, RT5616_D_MISC, RT5616_D_GATE_EN, 0); - snd_soc_write(codec, RT5616_PWR_DIG1, 0x0000); - snd_soc_write(codec, RT5616_PWR_DIG2, 0x0000); - snd_soc_write(codec, RT5616_PWR_VOL, 0x0000); - snd_soc_write(codec, RT5616_PWR_MIXER, 0x0000); - snd_soc_write(codec, RT5616_PWR_ANLG1, 0x0000); - snd_soc_write(codec, RT5616_PWR_ANLG2, 0x0000); + snd_soc_component_update_bits(component, RT5616_D_MISC, RT5616_D_GATE_EN, 0); + snd_soc_component_write(component, RT5616_PWR_DIG1, 0x0000); + snd_soc_component_write(component, RT5616_PWR_DIG2, 0x0000); + snd_soc_component_write(component, RT5616_PWR_VOL, 0x0000); + snd_soc_component_write(component, RT5616_PWR_MIXER, 0x0000); + snd_soc_component_write(component, RT5616_PWR_ANLG1, 0x0000); + snd_soc_component_write(component, RT5616_PWR_ANLG2, 0x0000); break; default: @@ -1223,24 +1223,24 @@ static int rt5616_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5616_probe(struct snd_soc_codec *codec) +static int rt5616_probe(struct snd_soc_component *component) { - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); /* Check if MCLK provided */ - rt5616->mclk = devm_clk_get(codec->dev, "mclk"); + rt5616->mclk = devm_clk_get(component->dev, "mclk"); if (PTR_ERR(rt5616->mclk) == -EPROBE_DEFER) return -EPROBE_DEFER; - rt5616->codec = codec; + rt5616->component = component; return 0; } #ifdef CONFIG_PM -static int rt5616_suspend(struct snd_soc_codec *codec) +static int rt5616_suspend(struct snd_soc_component *component) { - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5616->regmap, true); regcache_mark_dirty(rt5616->regmap); @@ -1248,9 +1248,9 @@ static int rt5616_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5616_resume(struct snd_soc_codec *codec) +static int rt5616_resume(struct snd_soc_component *component) { - struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); + struct rt5616_priv *rt5616 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5616->regmap, false); regcache_sync(rt5616->regmap); @@ -1294,20 +1294,20 @@ static struct snd_soc_dai_driver rt5616_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5616 = { - .probe = rt5616_probe, - .suspend = rt5616_suspend, - .resume = rt5616_resume, - .set_bias_level = rt5616_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5616_snd_controls, - .num_controls = ARRAY_SIZE(rt5616_snd_controls), - .dapm_widgets = rt5616_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5616_dapm_widgets), - .dapm_routes = rt5616_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5616_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5616 = { + .probe = rt5616_probe, + .suspend = rt5616_suspend, + .resume = rt5616_resume, + .set_bias_level = rt5616_set_bias_level, + .controls = rt5616_snd_controls, + .num_controls = ARRAY_SIZE(rt5616_snd_controls), + .dapm_widgets = rt5616_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5616_dapm_widgets), + .dapm_routes = rt5616_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5616_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5616_regmap = { @@ -1387,14 +1387,13 @@ static int rt5616_i2c_probe(struct i2c_client *i2c, regmap_update_bits(rt5616->regmap, RT5616_PWR_ANLG1, RT5616_PWR_LDO_DVO_MASK, RT5616_PWR_LDO_DVO_1_2V); - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5616, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5616, rt5616_dai, ARRAY_SIZE(rt5616_dai)); } static int rt5616_i2c_remove(struct i2c_client *i2c) { - snd_soc_unregister_codec(&i2c->dev); - return 0; } diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c index 55b04c55fb4b..cf6dce69eb2a 100644 --- a/sound/soc/codecs/rt5631.c +++ b/sound/soc/codecs/rt5631.c @@ -71,30 +71,30 @@ static const struct reg_default rt5631_reg[] = { /** * rt5631_write_index - write index register of 2nd layer */ -static void rt5631_write_index(struct snd_soc_codec *codec, +static void rt5631_write_index(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - snd_soc_write(codec, RT5631_INDEX_ADD, reg); - snd_soc_write(codec, RT5631_INDEX_DATA, value); + snd_soc_component_write(component, RT5631_INDEX_ADD, reg); + snd_soc_component_write(component, RT5631_INDEX_DATA, value); } /** * rt5631_read_index - read index register of 2nd layer */ -static unsigned int rt5631_read_index(struct snd_soc_codec *codec, +static unsigned int rt5631_read_index(struct snd_soc_component *component, unsigned int reg) { unsigned int value; - snd_soc_write(codec, RT5631_INDEX_ADD, reg); - value = snd_soc_read(codec, RT5631_INDEX_DATA); + snd_soc_component_write(component, RT5631_INDEX_ADD, reg); + value = snd_soc_component_read32(component, RT5631_INDEX_DATA); return value; } -static int rt5631_reset(struct snd_soc_codec *codec) +static int rt5631_reset(struct snd_soc_component *component) { - return snd_soc_write(codec, RT5631_RESET, 0); + return snd_soc_component_write(component, RT5631_RESET, 0); } static bool rt5631_volatile_register(struct device *dev, unsigned int reg) @@ -187,8 +187,8 @@ static const DECLARE_TLV_DB_RANGE(mic_bst_tlv, static int rt5631_dmic_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = rt5631->dmic_used_flag; @@ -198,8 +198,8 @@ static int rt5631_dmic_get(struct snd_kcontrol *kcontrol, static int rt5631_dmic_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); rt5631->dmic_used_flag = ucontrol->value.integer.value[0]; return 0; @@ -286,78 +286,78 @@ static const struct snd_kcontrol_new rt5631_snd_controls[] = { static int check_sysclk1_source(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_GLOBAL_CLK_CTRL); + reg = snd_soc_component_read32(component, RT5631_GLOBAL_CLK_CTRL); return reg & RT5631_SYSCLK_SOUR_SEL_PLL; } static int check_dmic_used(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); return rt5631->dmic_used_flag; } static int check_dacl_to_outmixl(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_OUTMIXER_L_CTRL); + reg = snd_soc_component_read32(component, RT5631_OUTMIXER_L_CTRL); return !(reg & RT5631_M_DAC_L_TO_OUTMIXER_L); } static int check_dacr_to_outmixr(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_OUTMIXER_R_CTRL); + reg = snd_soc_component_read32(component, RT5631_OUTMIXER_R_CTRL); return !(reg & RT5631_M_DAC_R_TO_OUTMIXER_R); } static int check_dacl_to_spkmixl(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_SPK_MIXER_CTRL); + reg = snd_soc_component_read32(component, RT5631_SPK_MIXER_CTRL); return !(reg & RT5631_M_DAC_L_TO_SPKMIXER_L); } static int check_dacr_to_spkmixr(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_SPK_MIXER_CTRL); + reg = snd_soc_component_read32(component, RT5631_SPK_MIXER_CTRL); return !(reg & RT5631_M_DAC_R_TO_SPKMIXER_R); } static int check_adcl_select(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_ADC_REC_MIXER); + reg = snd_soc_component_read32(component, RT5631_ADC_REC_MIXER); return !(reg & RT5631_M_MIC1_TO_RECMIXER_L); } static int check_adcr_select(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg; - reg = snd_soc_read(codec, RT5631_ADC_REC_MIXER); + reg = snd_soc_component_read32(component, RT5631_ADC_REC_MIXER); return !(reg & RT5631_M_MIC2_TO_RECMIXER_R); } @@ -367,36 +367,36 @@ static int check_adcr_select(struct snd_soc_dapm_widget *source, * * When power on/off headphone, the depop sequence is done by hardware. */ -static void onebit_depop_power_stage(struct snd_soc_codec *codec, int enable) +static void onebit_depop_power_stage(struct snd_soc_component *component, int enable) { unsigned int soft_vol, hp_zc; /* enable one-bit depop function */ - snd_soc_update_bits(codec, RT5631_DEPOP_FUN_CTRL_2, + snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2, RT5631_EN_ONE_BIT_DEPOP, 0); /* keep soft volume and zero crossing setting */ - soft_vol = snd_soc_read(codec, RT5631_SOFT_VOL_CTRL); - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, 0); - hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + soft_vol = snd_soc_component_read32(component, RT5631_SOFT_VOL_CTRL); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0); + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); if (enable) { /* config one-bit depop parameter */ - rt5631_write_index(codec, RT5631_TEST_MODE_CTRL, 0x84c0); - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x309f); - rt5631_write_index(codec, RT5631_CP_INTL_REG2, 0x6530); + rt5631_write_index(component, RT5631_TEST_MODE_CTRL, 0x84c0); + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x309f); + rt5631_write_index(component, RT5631_CP_INTL_REG2, 0x6530); /* power on capless block */ - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_2, + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_2, RT5631_EN_CAP_FREE_DEPOP); } else { /* power off capless block */ - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_2, 0); + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_2, 0); msleep(100); } /* recover soft volume and zero crossing setting */ - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, soft_vol); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); } /** @@ -405,36 +405,36 @@ static void onebit_depop_power_stage(struct snd_soc_codec *codec, int enable) * * When mute/unmute headphone, the depop sequence is done by hardware. */ -static void onebit_depop_mute_stage(struct snd_soc_codec *codec, int enable) +static void onebit_depop_mute_stage(struct snd_soc_component *component, int enable) { unsigned int soft_vol, hp_zc; /* enable one-bit depop function */ - snd_soc_update_bits(codec, RT5631_DEPOP_FUN_CTRL_2, + snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2, RT5631_EN_ONE_BIT_DEPOP, 0); /* keep soft volume and zero crossing setting */ - soft_vol = snd_soc_read(codec, RT5631_SOFT_VOL_CTRL); - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, 0); - hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + soft_vol = snd_soc_component_read32(component, RT5631_SOFT_VOL_CTRL); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0); + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); if (enable) { schedule_timeout_uninterruptible(msecs_to_jiffies(10)); /* config one-bit depop parameter */ - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x307f); - snd_soc_update_bits(codec, RT5631_HP_OUT_VOL, + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x307f); + snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, RT5631_L_MUTE | RT5631_R_MUTE, 0); msleep(300); } else { - snd_soc_update_bits(codec, RT5631_HP_OUT_VOL, + snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, RT5631_L_MUTE | RT5631_R_MUTE, RT5631_L_MUTE | RT5631_R_MUTE); msleep(100); } /* recover soft volume and zero crossing setting */ - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, soft_vol); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); } /** @@ -443,70 +443,70 @@ static void onebit_depop_mute_stage(struct snd_soc_codec *codec, int enable) * * When power on/off headphone, the depop sequence is done in step by step. */ -static void depop_seq_power_stage(struct snd_soc_codec *codec, int enable) +static void depop_seq_power_stage(struct snd_soc_component *component, int enable) { unsigned int soft_vol, hp_zc; /* depop control by register */ - snd_soc_update_bits(codec, RT5631_DEPOP_FUN_CTRL_2, + snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2, RT5631_EN_ONE_BIT_DEPOP, RT5631_EN_ONE_BIT_DEPOP); /* keep soft volume and zero crossing setting */ - soft_vol = snd_soc_read(codec, RT5631_SOFT_VOL_CTRL); - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, 0); - hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + soft_vol = snd_soc_component_read32(component, RT5631_SOFT_VOL_CTRL); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0); + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); if (enable) { /* config depop sequence parameter */ - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x303e); + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x303e); /* power on headphone and charge pump */ - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP | RT5631_PWR_HP_R_AMP, RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP | RT5631_PWR_HP_R_AMP); /* power on soft generator and depop mode2 */ - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_EN_DEPOP2_FOR_HP); msleep(100); /* stop depop mode */ - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_HP_DEPOP_DIS, RT5631_PWR_HP_DEPOP_DIS); } else { /* config depop sequence parameter */ - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x303F); - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x303F); + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP | RT5631_PD_HPAMP_L_ST_UP | RT5631_PD_HPAMP_R_ST_UP); msleep(75); - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_PD_HPAMP_L_ST_UP | RT5631_PD_HPAMP_R_ST_UP); /* start depop mode */ - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_HP_DEPOP_DIS, 0); /* config depop sequence parameter */ - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_EN_DEPOP2_FOR_HP | RT5631_PD_HPAMP_L_ST_UP | RT5631_PD_HPAMP_R_ST_UP); msleep(80); - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN); /* power down headphone and charge pump */ - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_CHARGE_PUMP | RT5631_PWR_HP_L_AMP | RT5631_PWR_HP_R_AMP, 0); } /* recover soft volume and zero crossing setting */ - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, soft_vol); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); } /** @@ -515,75 +515,75 @@ static void depop_seq_power_stage(struct snd_soc_codec *codec, int enable) * * When mute/unmute headphone, the depop sequence is done in step by step. */ -static void depop_seq_mute_stage(struct snd_soc_codec *codec, int enable) +static void depop_seq_mute_stage(struct snd_soc_component *component, int enable) { unsigned int soft_vol, hp_zc; /* depop control by register */ - snd_soc_update_bits(codec, RT5631_DEPOP_FUN_CTRL_2, + snd_soc_component_update_bits(component, RT5631_DEPOP_FUN_CTRL_2, RT5631_EN_ONE_BIT_DEPOP, RT5631_EN_ONE_BIT_DEPOP); /* keep soft volume and zero crossing setting */ - soft_vol = snd_soc_read(codec, RT5631_SOFT_VOL_CTRL); - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, 0); - hp_zc = snd_soc_read(codec, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + soft_vol = snd_soc_component_read32(component, RT5631_SOFT_VOL_CTRL); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, 0); + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); if (enable) { schedule_timeout_uninterruptible(msecs_to_jiffies(10)); /* config depop sequence parameter */ - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x302f); - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f); + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP | RT5631_EN_HP_R_M_UN_MUTE_DEPOP | RT5631_EN_HP_L_M_UN_MUTE_DEPOP); - snd_soc_update_bits(codec, RT5631_HP_OUT_VOL, + snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, RT5631_L_MUTE | RT5631_R_MUTE, 0); msleep(160); } else { /* config depop sequence parameter */ - rt5631_write_index(codec, RT5631_SPK_INTL_CTRL, 0x302f); - snd_soc_write(codec, RT5631_DEPOP_FUN_CTRL_1, + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f); + snd_soc_component_write(component, RT5631_DEPOP_FUN_CTRL_1, RT5631_POW_ON_SOFT_GEN | RT5631_EN_MUTE_UNMUTE_DEPOP | RT5631_EN_HP_R_M_UN_MUTE_DEPOP | RT5631_EN_HP_L_M_UN_MUTE_DEPOP); - snd_soc_update_bits(codec, RT5631_HP_OUT_VOL, + snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, RT5631_L_MUTE | RT5631_R_MUTE, RT5631_L_MUTE | RT5631_R_MUTE); msleep(150); } /* recover soft volume and zero crossing setting */ - snd_soc_write(codec, RT5631_SOFT_VOL_CTRL, soft_vol); - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); + snd_soc_component_write(component, RT5631_SOFT_VOL_CTRL, soft_vol); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc); } static int hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMD: if (rt5631->codec_version) { - onebit_depop_mute_stage(codec, 0); - onebit_depop_power_stage(codec, 0); + onebit_depop_mute_stage(component, 0); + onebit_depop_power_stage(component, 0); } else { - depop_seq_mute_stage(codec, 0); - depop_seq_power_stage(codec, 0); + depop_seq_mute_stage(component, 0); + depop_seq_power_stage(component, 0); } break; case SND_SOC_DAPM_POST_PMU: if (rt5631->codec_version) { - onebit_depop_power_stage(codec, 1); - onebit_depop_mute_stage(codec, 1); + onebit_depop_power_stage(component, 1); + onebit_depop_mute_stage(component, 1); } else { - depop_seq_power_stage(codec, 1); - depop_seq_mute_stage(codec, 1); + depop_seq_power_stage(component, 1); + depop_seq_mute_stage(component, 1); } break; @@ -597,20 +597,20 @@ static int hp_event(struct snd_soc_dapm_widget *w, static int set_dmic_params(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); switch (rt5631->rx_rate) { case 44100: case 48000: - snd_soc_update_bits(codec, RT5631_DIG_MIC_CTRL, + snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL, RT5631_DMIC_CLK_CTRL_MASK, RT5631_DMIC_CLK_CTRL_TO_32FS); break; case 32000: case 22050: - snd_soc_update_bits(codec, RT5631_DIG_MIC_CTRL, + snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL, RT5631_DMIC_CLK_CTRL_MASK, RT5631_DMIC_CLK_CTRL_TO_64FS); break; @@ -618,7 +618,7 @@ static int set_dmic_params(struct snd_soc_dapm_widget *w, case 16000: case 11025: case 8000: - snd_soc_update_bits(codec, RT5631_DIG_MIC_CTRL, + snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL, RT5631_DMIC_CLK_CTRL_MASK, RT5631_DMIC_CLK_CTRL_TO_128FS); break; @@ -1352,16 +1352,16 @@ static int get_coeff(int mclk, int rate, int timesofbclk) static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); int timesofbclk = 32, coeff; unsigned int iface = 0; - dev_dbg(codec->dev, "enter %s\n", __func__); + dev_dbg(component->dev, "enter %s\n", __func__); rt5631->bclk_rate = snd_soc_params_to_bclk(params); if (rt5631->bclk_rate < 0) { - dev_err(codec->dev, "Fail to get BCLK rate\n"); + dev_err(component->dev, "Fail to get BCLK rate\n"); return rt5631->bclk_rate; } rt5631->rx_rate = params_rate(params); @@ -1373,7 +1373,7 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, coeff = get_coeff(rt5631->sysclk, rt5631->rx_rate, timesofbclk); if (coeff < 0) { - dev_err(codec->dev, "Fail to get coeff\n"); + dev_err(component->dev, "Fail to get coeff\n"); return coeff; } @@ -1393,9 +1393,9 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, RT5631_SDP_CTRL, + snd_soc_component_update_bits(component, RT5631_SDP_CTRL, RT5631_SDP_I2S_DL_MASK, iface); - snd_soc_write(codec, RT5631_STEREO_AD_DA_CLK_CTRL, + snd_soc_component_write(component, RT5631_STEREO_AD_DA_CLK_CTRL, coeff_div[coeff].reg_val); return 0; @@ -1404,11 +1404,11 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream, static int rt5631_hifi_codec_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); unsigned int iface = 0; - dev_dbg(codec->dev, "enter %s\n", __func__); + dev_dbg(component->dev, "enter %s\n", __func__); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -1448,7 +1448,7 @@ static int rt5631_hifi_codec_set_dai_fmt(struct snd_soc_dai *codec_dai, return -EINVAL; } - snd_soc_write(codec, RT5631_SDP_CTRL, iface); + snd_soc_component_write(component, RT5631_SDP_CTRL, iface); return 0; } @@ -1456,10 +1456,10 @@ static int rt5631_hifi_codec_set_dai_fmt(struct snd_soc_dai *codec_dai, static int rt5631_hifi_codec_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "enter %s, syclk=%d\n", __func__, freq); + dev_dbg(component->dev, "enter %s, syclk=%d\n", __func__, freq); if ((freq >= (256 * 8000)) && (freq <= (512 * 96000))) { rt5631->sysclk = freq; @@ -1472,16 +1472,16 @@ static int rt5631_hifi_codec_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = codec_dai->codec; - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); int i, ret = -EINVAL; - dev_dbg(codec->dev, "enter %s\n", __func__); + dev_dbg(component->dev, "enter %s\n", __func__); if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); - snd_soc_update_bits(codec, RT5631_GLOBAL_CLK_CTRL, + snd_soc_component_update_bits(component, RT5631_GLOBAL_CLK_CTRL, RT5631_SYSCLK_SOUR_SEL_MASK, RT5631_SYSCLK_SOUR_SEL_MCLK); @@ -1492,13 +1492,13 @@ static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, for (i = 0; i < ARRAY_SIZE(codec_master_pll_div); i++) if (freq_in == codec_master_pll_div[i].pll_in && freq_out == codec_master_pll_div[i].pll_out) { - dev_info(codec->dev, + dev_info(component->dev, "change PLL in master mode\n"); - snd_soc_write(codec, RT5631_PLL_CTRL, + snd_soc_component_write(component, RT5631_PLL_CTRL, codec_master_pll_div[i].reg_val); schedule_timeout_uninterruptible( msecs_to_jiffies(20)); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT5631_GLOBAL_CLK_CTRL, RT5631_SYSCLK_SOUR_SEL_MASK | RT5631_PLLCLK_SOUR_SEL_MASK, @@ -1511,13 +1511,13 @@ static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, for (i = 0; i < ARRAY_SIZE(codec_slave_pll_div); i++) if (freq_in == codec_slave_pll_div[i].pll_in && freq_out == codec_slave_pll_div[i].pll_out) { - dev_info(codec->dev, + dev_info(component->dev, "change PLL in slave mode\n"); - snd_soc_write(codec, RT5631_PLL_CTRL, + snd_soc_component_write(component, RT5631_PLL_CTRL, codec_slave_pll_div[i].reg_val); schedule_timeout_uninterruptible( msecs_to_jiffies(20)); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT5631_GLOBAL_CLK_CTRL, RT5631_SYSCLK_SOUR_SEL_MASK | RT5631_PLLCLK_SOUR_SEL_MASK, @@ -1531,26 +1531,26 @@ static int rt5631_codec_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, return ret; } -static int rt5631_set_bias_level(struct snd_soc_codec *codec, +static int rt5631_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD2, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD2, RT5631_PWR_MICBIAS1_VOL | RT5631_PWR_MICBIAS2_VOL, RT5631_PWR_MICBIAS1_VOL | RT5631_PWR_MICBIAS2_VOL); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS, RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS); msleep(80); - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_FAST_VREF_CTRL, RT5631_PWR_FAST_VREF_CTRL); regcache_cache_only(rt5631->regmap, false); @@ -1559,10 +1559,10 @@ static int rt5631_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: - snd_soc_write(codec, RT5631_PWR_MANAG_ADD1, 0x0000); - snd_soc_write(codec, RT5631_PWR_MANAG_ADD2, 0x0000); - snd_soc_write(codec, RT5631_PWR_MANAG_ADD3, 0x0000); - snd_soc_write(codec, RT5631_PWR_MANAG_ADD4, 0x0000); + snd_soc_component_write(component, RT5631_PWR_MANAG_ADD1, 0x0000); + snd_soc_component_write(component, RT5631_PWR_MANAG_ADD2, 0x0000); + snd_soc_component_write(component, RT5631_PWR_MANAG_ADD3, 0x0000); + snd_soc_component_write(component, RT5631_PWR_MANAG_ADD4, 0x0000); break; default: @@ -1572,48 +1572,48 @@ static int rt5631_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5631_probe(struct snd_soc_codec *codec) +static int rt5631_probe(struct snd_soc_component *component) { - struct rt5631_priv *rt5631 = snd_soc_codec_get_drvdata(codec); + struct rt5631_priv *rt5631 = snd_soc_component_get_drvdata(component); unsigned int val; - val = rt5631_read_index(codec, RT5631_ADDA_MIXER_INTL_REG3); + val = rt5631_read_index(component, RT5631_ADDA_MIXER_INTL_REG3); if (val & 0x0002) rt5631->codec_version = 1; else rt5631->codec_version = 0; - rt5631_reset(codec); - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + rt5631_reset(component); + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS, RT5631_PWR_VREF | RT5631_PWR_MAIN_BIAS); msleep(80); - snd_soc_update_bits(codec, RT5631_PWR_MANAG_ADD3, + snd_soc_component_update_bits(component, RT5631_PWR_MANAG_ADD3, RT5631_PWR_FAST_VREF_CTRL, RT5631_PWR_FAST_VREF_CTRL); /* enable HP zero cross */ - snd_soc_write(codec, RT5631_INT_ST_IRQ_CTRL_2, 0x0f18); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, 0x0f18); /* power off ClassD auto Recovery */ if (rt5631->codec_version) - snd_soc_update_bits(codec, RT5631_INT_ST_IRQ_CTRL_2, + snd_soc_component_update_bits(component, RT5631_INT_ST_IRQ_CTRL_2, 0x2000, 0x2000); else - snd_soc_update_bits(codec, RT5631_INT_ST_IRQ_CTRL_2, + snd_soc_component_update_bits(component, RT5631_INT_ST_IRQ_CTRL_2, 0x2000, 0); /* DMIC */ if (rt5631->dmic_used_flag) { - snd_soc_update_bits(codec, RT5631_GPIO_CTRL, + snd_soc_component_update_bits(component, RT5631_GPIO_CTRL, RT5631_GPIO_PIN_FUN_SEL_MASK | RT5631_GPIO_DMIC_FUN_SEL_MASK, RT5631_GPIO_PIN_FUN_SEL_GPIO_DIMC | RT5631_GPIO_DMIC_FUN_SEL_DIMC); - snd_soc_update_bits(codec, RT5631_DIG_MIC_CTRL, + snd_soc_component_update_bits(component, RT5631_DIG_MIC_CTRL, RT5631_DMIC_L_CH_LATCH_MASK | RT5631_DMIC_R_CH_LATCH_MASK, RT5631_DMIC_L_CH_LATCH_FALLING | RT5631_DMIC_R_CH_LATCH_RISING); } - snd_soc_codec_init_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_init_bias_level(component, SND_SOC_BIAS_STANDBY); return 0; } @@ -1653,18 +1653,20 @@ static struct snd_soc_dai_driver rt5631_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5631 = { - .probe = rt5631_probe, - .set_bias_level = rt5631_set_bias_level, - .suspend_bias_off = true, - .component_driver = { - .controls = rt5631_snd_controls, - .num_controls = ARRAY_SIZE(rt5631_snd_controls), - .dapm_widgets = rt5631_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5631_dapm_widgets), - .dapm_routes = rt5631_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5631_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5631 = { + .probe = rt5631_probe, + .set_bias_level = rt5631_set_bias_level, + .controls = rt5631_snd_controls, + .num_controls = ARRAY_SIZE(rt5631_snd_controls), + .dapm_widgets = rt5631_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5631_dapm_widgets), + .dapm_routes = rt5631_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5631_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct i2c_device_id rt5631_i2c_id[] = { @@ -1712,14 +1714,14 @@ static int rt5631_i2c_probe(struct i2c_client *i2c, if (IS_ERR(rt5631->regmap)) return PTR_ERR(rt5631->regmap); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5631, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5631, rt5631_dai, ARRAY_SIZE(rt5631_dai)); return ret; } static int rt5631_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index 438fe52a12df..05567426f211 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c @@ -166,9 +166,9 @@ static const struct reg_default rt5640_reg[] = { { 0xff, 0x6231 }, }; -static int rt5640_reset(struct snd_soc_codec *codec) +static int rt5640_reset(struct snd_soc_component *component) { - return snd_soc_write(codec, RT5640_RESET, 0); + return snd_soc_component_write(component, RT5640_RESET, 0); } static bool rt5640_volatile_register(struct device *dev, unsigned int reg) @@ -461,17 +461,17 @@ static const struct snd_kcontrol_new rt5640_specific_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5640->sysclk / rl6231_get_pre_div(rt5640->regmap, RT5640_ADDA_CLK1, RT5640_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else - snd_soc_update_bits(codec, RT5640_DMIC, RT5640_DMIC_CLK_MASK, + snd_soc_component_update_bits(component, RT5640_DMIC, RT5640_DMIC_CLK_MASK, idx << RT5640_DMIC_CLK_SFT); return idx; } @@ -479,10 +479,10 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int val; - val = snd_soc_read(codec, RT5640_GLB_CLK); + val = snd_soc_component_read32(component, RT5640_GLB_CLK); val &= RT5640_SCLK_SRC_MASK; if (val == RT5640_SCLK_SRC_PLL1) return 1; @@ -493,8 +493,8 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, static int is_using_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); if (!rt5640->asrc_en) return 0; @@ -930,9 +930,9 @@ static SOC_ENUM_SINGLE_DECL(rt5640_sdi_sel_enum, RT5640_I2S2_SDP, static const struct snd_kcontrol_new rt5640_sdi_mux = SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum); -static void hp_amp_power_on(struct snd_soc_codec *codec) +static void hp_amp_power_on(struct snd_soc_component *component) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); /* depop parameters */ regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + @@ -956,9 +956,9 @@ static void hp_amp_power_on(struct snd_soc_codec *codec) RT5640_PWR_FV1 | RT5640_PWR_FV2); } -static void rt5640_pmu_depop(struct snd_soc_codec *codec) +static void rt5640_pmu_depop(struct snd_soc_component *component) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2, RT5640_DEPOP_MASK | RT5640_DIG_DP_MASK, @@ -984,12 +984,12 @@ static void rt5640_pmu_depop(struct snd_soc_codec *codec) static int rt5640_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: - rt5640_pmu_depop(codec); + rt5640_pmu_depop(component); rt5640->hp_mute = 0; break; @@ -1008,22 +1008,22 @@ static int rt5640_hp_event(struct snd_soc_dapm_widget *w, static int rt5640_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - hp_amp_power_on(codec); - snd_soc_update_bits(codec, RT5640_PWR_ANLG1, + hp_amp_power_on(component); + snd_soc_component_update_bits(component, RT5640_PWR_ANLG1, RT5640_PWR_LM, RT5640_PWR_LM); - snd_soc_update_bits(codec, RT5640_OUTPUT, + snd_soc_component_update_bits(component, RT5640_OUTPUT, RT5640_L_MUTE | RT5640_R_MUTE, 0); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5640_OUTPUT, + snd_soc_component_update_bits(component, RT5640_OUTPUT, RT5640_L_MUTE | RT5640_R_MUTE, RT5640_L_MUTE | RT5640_R_MUTE); - snd_soc_update_bits(codec, RT5640_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5640_PWR_ANLG1, RT5640_PWR_LM, 0); break; @@ -1037,11 +1037,11 @@ static int rt5640_lout_event(struct snd_soc_dapm_widget *w, static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - hp_amp_power_on(codec); + hp_amp_power_on(component); break; default: return 0; @@ -1053,8 +1053,8 @@ static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w, static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -1671,14 +1671,14 @@ static const struct snd_soc_dapm_route rt5639_specific_dapm_routes[] = { {"IF2 DAC R", NULL, "DAC R2 Power"}, }; -static int get_sdp_info(struct snd_soc_codec *codec, int dai_id) +static int get_sdp_info(struct snd_soc_component *component, int dai_id) { int ret = 0, val; - if (codec == NULL) + if (component == NULL) return -EINVAL; - val = snd_soc_read(codec, RT5640_I2S1_SDP); + val = snd_soc_component_read32(component, RT5640_I2S1_SDP); val = (val & RT5640_I2S_IF_MASK) >> RT5640_I2S_IF_SFT; switch (dai_id) { case RT5640_AIF1: @@ -1722,21 +1722,21 @@ static int get_sdp_info(struct snd_soc_codec *codec, int dai_id) static int rt5640_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int dai_sel, pre_div, bclk_ms, frame_size; rt5640->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n", + dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", rt5640->lrck[dai->id], dai->id); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return frame_size; } if (frame_size > 32) @@ -1766,26 +1766,26 @@ static int rt5640_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - dai_sel = get_sdp_info(codec, dai->id); + dai_sel = get_sdp_info(component, dai->id); if (dai_sel < 0) { - dev_err(codec->dev, "Failed to get sdp info: %d\n", dai_sel); + dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel); return -EINVAL; } if (dai_sel & RT5640_U_IF1) { mask_clk = RT5640_I2S_BCLK_MS1_MASK | RT5640_I2S_PD1_MASK; val_clk = bclk_ms << RT5640_I2S_BCLK_MS1_SFT | pre_div << RT5640_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5640_I2S1_SDP, + snd_soc_component_update_bits(component, RT5640_I2S1_SDP, RT5640_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5640_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5640_ADDA_CLK1, mask_clk, val_clk); } if (dai_sel & RT5640_U_IF2) { mask_clk = RT5640_I2S_BCLK_MS2_MASK | RT5640_I2S_PD2_MASK; val_clk = bclk_ms << RT5640_I2S_BCLK_MS2_SFT | pre_div << RT5640_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5640_I2S2_SDP, + snd_soc_component_update_bits(component, RT5640_I2S2_SDP, RT5640_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5640_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5640_ADDA_CLK1, mask_clk, val_clk); } return 0; @@ -1793,8 +1793,8 @@ static int rt5640_hw_params(struct snd_pcm_substream *substream, static int rt5640_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; int dai_sel; @@ -1836,18 +1836,18 @@ static int rt5640_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) return -EINVAL; } - dai_sel = get_sdp_info(codec, dai->id); + dai_sel = get_sdp_info(component, dai->id); if (dai_sel < 0) { - dev_err(codec->dev, "Failed to get sdp info: %d\n", dai_sel); + dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel); return -EINVAL; } if (dai_sel & RT5640_U_IF1) { - snd_soc_update_bits(codec, RT5640_I2S1_SDP, + snd_soc_component_update_bits(component, RT5640_I2S1_SDP, RT5640_I2S_MS_MASK | RT5640_I2S_BP_MASK | RT5640_I2S_DF_MASK, reg_val); } if (dai_sel & RT5640_U_IF2) { - snd_soc_update_bits(codec, RT5640_I2S2_SDP, + snd_soc_component_update_bits(component, RT5640_I2S2_SDP, RT5640_I2S_MS_MASK | RT5640_I2S_BP_MASK | RT5640_I2S_DF_MASK, reg_val); } @@ -1858,8 +1858,8 @@ static int rt5640_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5640_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5640->sysclk && clk_id == rt5640->sysclk_src) @@ -1876,10 +1876,10 @@ static int rt5640_set_dai_sysclk(struct snd_soc_dai *dai, reg_val |= RT5640_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5640_GLB_CLK, + snd_soc_component_update_bits(component, RT5640_GLB_CLK, RT5640_SCLK_SRC_MASK, reg_val); rt5640->sysclk = freq; rt5640->sysclk_src = clk_id; @@ -1891,8 +1891,8 @@ static int rt5640_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -1901,46 +1901,46 @@ static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5640->pll_in = 0; rt5640->pll_out = 0; - snd_soc_update_bits(codec, RT5640_GLB_CLK, + snd_soc_component_update_bits(component, RT5640_GLB_CLK, RT5640_SCLK_SRC_MASK, RT5640_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5640_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5640_GLB_CLK, + snd_soc_component_update_bits(component, RT5640_GLB_CLK, RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_MCLK); break; case RT5640_PLL1_S_BCLK1: - snd_soc_update_bits(codec, RT5640_GLB_CLK, + snd_soc_component_update_bits(component, RT5640_GLB_CLK, RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_BCLK1); break; case RT5640_PLL1_S_BCLK2: - snd_soc_update_bits(codec, RT5640_GLB_CLK, + snd_soc_component_update_bits(component, RT5640_GLB_CLK, RT5640_PLL1_SRC_MASK, RT5640_PLL1_SRC_BCLK2); break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5640_PLL_CTRL1, + snd_soc_component_write(component, RT5640_PLL_CTRL1, pll_code.n_code << RT5640_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5640_PLL_CTRL2, + snd_soc_component_write(component, RT5640_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5640_PLL_M_SFT | pll_code.m_bp << RT5640_PLL_M_BP_SFT); @@ -1951,10 +1951,10 @@ static int rt5640_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; } -static int rt5640_set_bias_level(struct snd_soc_codec *codec, +static int rt5640_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1972,7 +1972,7 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec, if (IS_ERR(rt5640->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(rt5640->mclk); } else { ret = clk_prepare_enable(rt5640->mclk); @@ -1982,33 +1982,33 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (SND_SOC_BIAS_OFF == snd_soc_codec_get_bias_level(codec)) { - snd_soc_update_bits(codec, RT5640_PWR_ANLG1, + if (SND_SOC_BIAS_OFF == snd_soc_component_get_bias_level(component)) { + snd_soc_component_update_bits(component, RT5640_PWR_ANLG1, RT5640_PWR_VREF1 | RT5640_PWR_MB | RT5640_PWR_BG | RT5640_PWR_VREF2, RT5640_PWR_VREF1 | RT5640_PWR_MB | RT5640_PWR_BG | RT5640_PWR_VREF2); usleep_range(10000, 15000); - snd_soc_update_bits(codec, RT5640_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5640_PWR_ANLG1, RT5640_PWR_FV1 | RT5640_PWR_FV2, RT5640_PWR_FV1 | RT5640_PWR_FV2); - snd_soc_update_bits(codec, RT5640_DUMMY1, + snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x0301, 0x0301); - snd_soc_update_bits(codec, RT5640_MICBIAS, + snd_soc_component_update_bits(component, RT5640_MICBIAS, 0x0030, 0x0030); } break; case SND_SOC_BIAS_OFF: - snd_soc_write(codec, RT5640_DEPOP_M1, 0x0004); - snd_soc_write(codec, RT5640_DEPOP_M2, 0x1100); - snd_soc_update_bits(codec, RT5640_DUMMY1, 0x1, 0); - snd_soc_write(codec, RT5640_PWR_DIG1, 0x0000); - snd_soc_write(codec, RT5640_PWR_DIG2, 0x0000); - snd_soc_write(codec, RT5640_PWR_VOL, 0x0000); - snd_soc_write(codec, RT5640_PWR_MIXER, 0x0000); - snd_soc_write(codec, RT5640_PWR_ANLG1, 0x0000); - snd_soc_write(codec, RT5640_PWR_ANLG2, 0x0000); + snd_soc_component_write(component, RT5640_DEPOP_M1, 0x0004); + snd_soc_component_write(component, RT5640_DEPOP_M2, 0x1100); + snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x1, 0); + snd_soc_component_write(component, RT5640_PWR_DIG1, 0x0000); + snd_soc_component_write(component, RT5640_PWR_DIG2, 0x0000); + snd_soc_component_write(component, RT5640_PWR_VOL, 0x0000); + snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000); + snd_soc_component_write(component, RT5640_PWR_ANLG1, 0x0000); + snd_soc_component_write(component, RT5640_PWR_ANLG2, 0x0000); break; default: @@ -2018,10 +2018,10 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec, return 0; } -int rt5640_dmic_enable(struct snd_soc_codec *codec, +int rt5640_dmic_enable(struct snd_soc_component *component, bool dmic1_data_pin, bool dmic2_data_pin) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, RT5640_GP2_PIN_MASK, RT5640_GP2_PIN_DMIC1_SCL); @@ -2044,10 +2044,10 @@ int rt5640_dmic_enable(struct snd_soc_codec *codec, } EXPORT_SYMBOL_GPL(rt5640_dmic_enable); -int rt5640_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5640_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); unsigned int asrc2_mask = 0; unsigned int asrc2_value = 0; @@ -2099,43 +2099,43 @@ int rt5640_sel_asrc_clk_src(struct snd_soc_codec *codec, | (clk_src << RT5640_MAD_R_M_SFT); } - snd_soc_update_bits(codec, RT5640_ASRC_2, + snd_soc_component_update_bits(component, RT5640_ASRC_2, asrc2_mask, asrc2_value); - if (snd_soc_read(codec, RT5640_ASRC_2)) { + if (snd_soc_component_read32(component, RT5640_ASRC_2)) { rt5640->asrc_en = true; - snd_soc_update_bits(codec, RT5640_JD_CTRL, 0x3, 0x3); + snd_soc_component_update_bits(component, RT5640_JD_CTRL, 0x3, 0x3); } else { rt5640->asrc_en = false; - snd_soc_update_bits(codec, RT5640_JD_CTRL, 0x3, 0x0); + snd_soc_component_update_bits(component, RT5640_JD_CTRL, 0x3, 0x0); } return 0; } EXPORT_SYMBOL_GPL(rt5640_sel_asrc_clk_src); -static int rt5640_probe(struct snd_soc_codec *codec) +static int rt5640_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); /* Check if MCLK provided */ - rt5640->mclk = devm_clk_get(codec->dev, "mclk"); + rt5640->mclk = devm_clk_get(component->dev, "mclk"); if (PTR_ERR(rt5640->mclk) == -EPROBE_DEFER) return -EPROBE_DEFER; - rt5640->codec = codec; + rt5640->component = component; - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); - snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301); - snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030); - snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00); + snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x0301, 0x0301); + snd_soc_component_update_bits(component, RT5640_MICBIAS, 0x0030, 0x0030); + snd_soc_component_update_bits(component, RT5640_DSP_PATH2, 0xfc00, 0x0c00); - switch (snd_soc_read(codec, RT5640_RESET) & RT5640_ID_MASK) { + switch (snd_soc_component_read32(component, RT5640_RESET) & RT5640_ID_MASK) { case RT5640_ID_5640: case RT5640_ID_5642: - snd_soc_add_codec_controls(codec, + snd_soc_add_component_controls(component, rt5640_specific_snd_controls, ARRAY_SIZE(rt5640_specific_snd_controls)); snd_soc_dapm_new_controls(dapm, @@ -2154,32 +2154,30 @@ static int rt5640_probe(struct snd_soc_codec *codec) ARRAY_SIZE(rt5639_specific_dapm_routes)); break; default: - dev_err(codec->dev, + dev_err(component->dev, "The driver is for RT5639 RT5640 or RT5642 only\n"); return -ENODEV; } if (rt5640->pdata.dmic_en) - rt5640_dmic_enable(codec, rt5640->pdata.dmic1_data_pin, + rt5640_dmic_enable(component, rt5640->pdata.dmic1_data_pin, rt5640->pdata.dmic2_data_pin); return 0; } -static int rt5640_remove(struct snd_soc_codec *codec) +static void rt5640_remove(struct snd_soc_component *component) { - rt5640_reset(codec); - - return 0; + rt5640_reset(component); } #ifdef CONFIG_PM -static int rt5640_suspend(struct snd_soc_codec *codec) +static int rt5640_suspend(struct snd_soc_component *component) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); - rt5640_reset(codec); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); + rt5640_reset(component); regcache_cache_only(rt5640->regmap, true); regcache_mark_dirty(rt5640->regmap); if (gpio_is_valid(rt5640->pdata.ldo1_en)) @@ -2188,9 +2186,9 @@ static int rt5640_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5640_resume(struct snd_soc_codec *codec) +static int rt5640_resume(struct snd_soc_component *component) { - struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec); + struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); if (gpio_is_valid(rt5640->pdata.ldo1_en)) { gpio_set_value_cansleep(rt5640->pdata.ldo1_en, 1); @@ -2259,21 +2257,22 @@ static struct snd_soc_dai_driver rt5640_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5640 = { - .probe = rt5640_probe, - .remove = rt5640_remove, - .suspend = rt5640_suspend, - .resume = rt5640_resume, - .set_bias_level = rt5640_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5640_snd_controls, - .num_controls = ARRAY_SIZE(rt5640_snd_controls), - .dapm_widgets = rt5640_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5640_dapm_widgets), - .dapm_routes = rt5640_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5640_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5640 = { + .probe = rt5640_probe, + .remove = rt5640_remove, + .suspend = rt5640_suspend, + .resume = rt5640_resume, + .set_bias_level = rt5640_set_bias_level, + .controls = rt5640_snd_controls, + .num_controls = ARRAY_SIZE(rt5640_snd_controls), + .dapm_widgets = rt5640_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5640_dapm_widgets), + .dapm_routes = rt5640_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5640_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, + }; static const struct regmap_config rt5640_regmap = { @@ -2427,17 +2426,11 @@ static int rt5640_i2c_probe(struct i2c_client *i2c, rt5640->hp_mute = 1; - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5640, rt5640_dai, ARRAY_SIZE(rt5640_dai)); } -static int rt5640_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static struct i2c_driver rt5640_i2c_driver = { .driver = { .name = "rt5640", @@ -2445,7 +2438,6 @@ static struct i2c_driver rt5640_i2c_driver = { .of_match_table = of_match_ptr(rt5640_of_match), }, .probe = rt5640_i2c_probe, - .remove = rt5640_i2c_remove, .id_table = rt5640_i2c_id, }; module_i2c_driver(rt5640_i2c_driver); diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h index b8a811732a52..c473e8ae2eda 100644 --- a/sound/soc/codecs/rt5640.h +++ b/sound/soc/codecs/rt5640.h @@ -2102,7 +2102,7 @@ enum { }; struct rt5640_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5640_platform_data pdata; struct regmap *regmap; struct clk *mclk; @@ -2121,9 +2121,9 @@ struct rt5640_priv { bool asrc_en; }; -int rt5640_dmic_enable(struct snd_soc_codec *codec, +int rt5640_dmic_enable(struct snd_soc_component *component, bool dmic1_data_pin, bool dmic2_data_pin); -int rt5640_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5640_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); #endif diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c index 8f140c8b93ac..bc8d829ce45b 100644 --- a/sound/soc/codecs/rt5645.c +++ b/sound/soc/codecs/rt5645.c @@ -407,7 +407,7 @@ static const char *const rt5645_supply_names[] = { }; struct rt5645_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5645_platform_data pdata; struct regmap *regmap; struct i2c_client *i2c; @@ -437,9 +437,9 @@ struct rt5645_priv { int v_id; }; -static int rt5645_reset(struct snd_soc_codec *codec) +static int rt5645_reset(struct snd_soc_component *component) { - return snd_soc_write(codec, RT5645_RESET, 0); + return snd_soc_component_write(component, RT5645_RESET, 0); } static bool rt5645_volatile_register(struct device *dev, unsigned int reg) @@ -846,17 +846,17 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap, RT5645_ADDA_CLK1, RT5645_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else - snd_soc_update_bits(codec, RT5645_DMIC_CTRL1, + snd_soc_component_update_bits(component, RT5645_DMIC_CTRL1, RT5645_DMIC_CLK_MASK, idx << RT5645_DMIC_CLK_SFT); return idx; } @@ -864,10 +864,10 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int val; - val = snd_soc_read(codec, RT5645_GLB_CLK); + val = snd_soc_component_read32(component, RT5645_GLB_CLK); val &= RT5645_SCLK_SRC_MASK; if (val == RT5645_SCLK_SRC_PLL1) return 1; @@ -878,7 +878,7 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, static int is_using_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg, shift, val; switch (source->shift) { @@ -910,7 +910,7 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source, return 0; } - val = (snd_soc_read(codec, reg) >> shift) & 0xf; + val = (snd_soc_component_read32(component, reg) >> shift) & 0xf; switch (val) { case 1: case 2: @@ -923,9 +923,9 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source, } -static int rt5645_enable_hweq(struct snd_soc_codec *codec) +static int rt5645_enable_hweq(struct snd_soc_component *component) { - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < RT5645_HWEQ_NUM; i++) { @@ -941,7 +941,7 @@ static int rt5645_enable_hweq(struct snd_soc_codec *codec) /** * rt5645_sel_asrc_clk_src - select ASRC clock source for a set of filters - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @filter_mask: mask of filters. * @clk_src: clock source * @@ -953,7 +953,7 @@ static int rt5645_enable_hweq(struct snd_soc_codec *codec) * set of filters specified by the mask. And the codec driver will turn on ASRC * for these filters if ASRC is selected as their clock source. */ -int rt5645_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5645_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { unsigned int asrc2_mask = 0; @@ -1009,11 +1009,11 @@ int rt5645_sel_asrc_clk_src(struct snd_soc_codec *codec, } if (asrc2_mask) - snd_soc_update_bits(codec, RT5645_ASRC_2, + snd_soc_component_update_bits(component, RT5645_ASRC_2, asrc2_mask, asrc2_value); if (asrc3_mask) - snd_soc_update_bits(codec, RT5645_ASRC_3, + snd_soc_component_update_bits(component, RT5645_ASRC_3, asrc3_mask, asrc3_value); return 0; @@ -1678,56 +1678,56 @@ static const struct snd_kcontrol_new pdm1_r_vol_control = SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5645_PDM_OUT_CTRL, RT5645_M_PDM1_R, 1, 1); -static void hp_amp_power(struct snd_soc_codec *codec, int on) +static void hp_amp_power(struct snd_soc_component *component, int on) { static int hp_amp_power_count; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); if (on) { if (hp_amp_power_count <= 0) { if (rt5645->codec_type == CODEC_TYPE_RT5650) { - snd_soc_write(codec, RT5645_DEPOP_M2, 0x3100); - snd_soc_write(codec, RT5645_CHARGE_PUMP, + snd_soc_component_write(component, RT5645_DEPOP_M2, 0x3100); + snd_soc_component_write(component, RT5645_CHARGE_PUMP, 0x0e06); - snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d); + snd_soc_component_write(component, RT5645_DEPOP_M1, 0x000d); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_HP_DCC_INT1, 0x9f01); msleep(20); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_HP_CO_MASK, RT5645_HP_CO_EN); regmap_write(rt5645->regmap, RT5645_PR_BASE + 0x3e, 0x7400); - snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737); + snd_soc_component_write(component, RT5645_DEPOP_M3, 0x0737); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); - snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); + snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1140); msleep(90); rt5645->hp_on = true; } else { /* depop parameters */ - snd_soc_update_bits(codec, RT5645_DEPOP_M2, + snd_soc_component_update_bits(component, RT5645_DEPOP_M2, RT5645_DEPOP_MASK, RT5645_DEPOP_MAN); - snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d); + snd_soc_component_write(component, RT5645_DEPOP_M1, 0x000d); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_HP_DCC_INT1, 0x9f01); mdelay(150); /* headphone amp power on */ - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_FV1 | RT5645_PWR_FV2, 0); - snd_soc_update_bits(codec, RT5645_PWR_VOL, + snd_soc_component_update_bits(component, RT5645_PWR_VOL, RT5645_PWR_HV_L | RT5645_PWR_HV_R, RT5645_PWR_HV_L | RT5645_PWR_HV_R); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_HP_L | RT5645_PWR_HP_R | RT5645_PWR_HA, RT5645_PWR_HP_L | RT5645_PWR_HP_R | RT5645_PWR_HA); mdelay(5); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_FV1 | RT5645_PWR_FV2, RT5645_PWR_FV1 | RT5645_PWR_FV2); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_HP_CO_MASK | RT5645_HP_SG_MASK, RT5645_HP_CO_EN | RT5645_HP_SG_EN); regmap_write(rt5645->regmap, RT5645_PR_BASE + @@ -1743,15 +1743,15 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on) if (rt5645->codec_type == CODEC_TYPE_RT5650) { regmap_write(rt5645->regmap, RT5645_PR_BASE + 0x3e, 0x7400); - snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737); + snd_soc_component_write(component, RT5645_DEPOP_M3, 0x0737); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); - snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); + snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1140); msleep(100); - snd_soc_write(codec, RT5645_DEPOP_M1, 0x0001); + snd_soc_component_write(component, RT5645_DEPOP_M1, 0x0001); } else { - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_HP_SG_MASK | RT5645_HP_L_SMT_MASK | RT5645_HP_R_SMT_MASK, @@ -1759,11 +1759,11 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on) RT5645_HP_L_SMT_DIS | RT5645_HP_R_SMT_DIS); /* headphone amp power down */ - snd_soc_write(codec, RT5645_DEPOP_M1, 0x0000); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_write(component, RT5645_DEPOP_M1, 0x0000); + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_HP_L | RT5645_PWR_HP_R | RT5645_PWR_HA, 0); - snd_soc_update_bits(codec, RT5645_DEPOP_M2, + snd_soc_component_update_bits(component, RT5645_DEPOP_M2, RT5645_DEPOP_MASK, 0); } } @@ -1773,15 +1773,15 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on) static int rt5645_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: - hp_amp_power(codec, 1); + hp_amp_power(component, 1); /* headphone unmute sequence */ if (rt5645->codec_type == CODEC_TYPE_RT5645) { - snd_soc_update_bits(codec, RT5645_DEPOP_M3, + snd_soc_component_update_bits(component, RT5645_DEPOP_M3, RT5645_CP_FQ1_MASK | RT5645_CP_FQ2_MASK | RT5645_CP_FQ3_MASK, (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ1_SFT) | @@ -1789,16 +1789,16 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w, (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ3_SFT)); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_SMT_TRIG_MASK, RT5645_SMT_TRIG_EN); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_RSTN_MASK, RT5645_RSTN_EN); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_RSTN_MASK | RT5645_HP_L_SMT_MASK | RT5645_HP_R_SMT_MASK, RT5645_RSTN_DIS | RT5645_HP_L_SMT_EN | RT5645_HP_R_SMT_EN); msleep(40); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_HP_SG_MASK | RT5645_HP_L_SMT_MASK | RT5645_HP_R_SMT_MASK, RT5645_HP_SG_DIS | RT5645_HP_L_SMT_DIS | RT5645_HP_R_SMT_DIS); @@ -1808,7 +1808,7 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMD: /* headphone mute sequence */ if (rt5645->codec_type == CODEC_TYPE_RT5645) { - snd_soc_update_bits(codec, RT5645_DEPOP_M3, + snd_soc_component_update_bits(component, RT5645_DEPOP_M3, RT5645_CP_FQ1_MASK | RT5645_CP_FQ2_MASK | RT5645_CP_FQ3_MASK, (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ1_SFT) | @@ -1816,17 +1816,17 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w, (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ3_SFT)); regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_HP_SG_MASK, RT5645_HP_SG_EN); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_RSTP_MASK, RT5645_RSTP_EN); - snd_soc_update_bits(codec, RT5645_DEPOP_M1, + snd_soc_component_update_bits(component, RT5645_DEPOP_M1, RT5645_RSTP_MASK | RT5645_HP_L_SMT_MASK | RT5645_HP_R_SMT_MASK, RT5645_RSTP_DIS | RT5645_HP_L_SMT_EN | RT5645_HP_R_SMT_EN); msleep(30); } - hp_amp_power(codec, 0); + hp_amp_power(component, 0); break; default: @@ -1839,25 +1839,25 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w, static int rt5645_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - rt5645_enable_hweq(codec); - snd_soc_update_bits(codec, RT5645_PWR_DIG1, + rt5645_enable_hweq(component); + snd_soc_component_update_bits(component, RT5645_PWR_DIG1, RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R | RT5645_PWR_CLS_D_L, RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R | RT5645_PWR_CLS_D_L); - snd_soc_update_bits(codec, RT5645_GEN_CTRL3, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL3, RT5645_DET_CLK_MASK, RT5645_DET_CLK_MODE1); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5645_GEN_CTRL3, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL3, RT5645_DET_CLK_MASK, RT5645_DET_CLK_DIS); - snd_soc_write(codec, RT5645_EQ_CTRL2, 0); - snd_soc_update_bits(codec, RT5645_PWR_DIG1, + snd_soc_component_write(component, RT5645_EQ_CTRL2, 0); + snd_soc_component_update_bits(component, RT5645_PWR_DIG1, RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R | RT5645_PWR_CLS_D_L, 0); break; @@ -1872,24 +1872,24 @@ static int rt5645_spk_event(struct snd_soc_dapm_widget *w, static int rt5645_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - hp_amp_power(codec, 1); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + hp_amp_power(component, 1); + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_LM, RT5645_PWR_LM); - snd_soc_update_bits(codec, RT5645_LOUT1, + snd_soc_component_update_bits(component, RT5645_LOUT1, RT5645_L_MUTE | RT5645_R_MUTE, 0); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5645_LOUT1, + snd_soc_component_update_bits(component, RT5645_LOUT1, RT5645_L_MUTE | RT5645_R_MUTE, RT5645_L_MUTE | RT5645_R_MUTE); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_LM, 0); - hp_amp_power(codec, 0); + hp_amp_power(component, 0); break; default: @@ -1902,16 +1902,16 @@ static int rt5645_lout_event(struct snd_soc_dapm_widget *w, static int rt5645_bst2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5645_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG2, RT5645_PWR_BST2_P, RT5645_PWR_BST2_P); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5645_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG2, RT5645_PWR_BST2_P, 0); break; @@ -1925,8 +1925,8 @@ static int rt5645_bst2_event(struct snd_soc_dapm_widget *w, static int rt5650_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -1946,17 +1946,17 @@ static int rt5650_hp_event(struct snd_soc_dapm_widget *w, static int rt5645_set_micbias1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5645_GEN_CTRL2, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL2, RT5645_MICBIAS1_POW_CTRL_SEL_MASK, RT5645_MICBIAS1_POW_CTRL_SEL_M); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, RT5645_GEN_CTRL2, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL2, RT5645_MICBIAS1_POW_CTRL_SEL_MASK, RT5645_MICBIAS1_POW_CTRL_SEL_A); break; @@ -1971,17 +1971,17 @@ static int rt5645_set_micbias1_event(struct snd_soc_dapm_widget *w, static int rt5645_set_micbias2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5645_GEN_CTRL2, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL2, RT5645_MICBIAS2_POW_CTRL_SEL_MASK, RT5645_MICBIAS2_POW_CTRL_SEL_M); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, RT5645_GEN_CTRL2, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL2, RT5645_MICBIAS2_POW_CTRL_SEL_MASK, RT5645_MICBIAS2_POW_CTRL_SEL_A); break; @@ -2768,20 +2768,20 @@ static const struct snd_soc_dapm_route rt5645_old_dapm_routes[] = { static int rt5645_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk, dl_sft; int pre_div, bclk_ms, frame_size; rt5645->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting\n"); + dev_err(component->dev, "Unsupported clock setting\n"); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } @@ -2822,20 +2822,20 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream, case RT5645_AIF1: mask_clk = RT5645_I2S_PD1_MASK; val_clk = pre_div << RT5645_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5645_I2S1_SDP, + snd_soc_component_update_bits(component, RT5645_I2S1_SDP, (0x3 << dl_sft), (val_len << dl_sft)); - snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5645_ADDA_CLK1, mask_clk, val_clk); break; case RT5645_AIF2: mask_clk = RT5645_I2S_BCLK_MS2_MASK | RT5645_I2S_PD2_MASK; val_clk = bclk_ms << RT5645_I2S_BCLK_MS2_SFT | pre_div << RT5645_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5645_I2S2_SDP, + snd_soc_component_update_bits(component, RT5645_I2S2_SDP, (0x3 << dl_sft), (val_len << dl_sft)); - snd_soc_update_bits(codec, RT5645_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5645_ADDA_CLK1, mask_clk, val_clk); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } @@ -2844,8 +2844,8 @@ static int rt5645_hw_params(struct snd_pcm_substream *substream, static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0, pol_sft; switch (rt5645->codec_type) { @@ -2896,17 +2896,17 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) } switch (dai->id) { case RT5645_AIF1: - snd_soc_update_bits(codec, RT5645_I2S1_SDP, + snd_soc_component_update_bits(component, RT5645_I2S1_SDP, RT5645_I2S_MS_MASK | (1 << pol_sft) | RT5645_I2S_DF_MASK, reg_val); break; case RT5645_AIF2: - snd_soc_update_bits(codec, RT5645_I2S2_SDP, + snd_soc_component_update_bits(component, RT5645_I2S2_SDP, RT5645_I2S_MS_MASK | (1 << pol_sft) | RT5645_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } return 0; @@ -2915,8 +2915,8 @@ static int rt5645_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5645_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src) @@ -2933,10 +2933,10 @@ static int rt5645_set_dai_sysclk(struct snd_soc_dai *dai, reg_val |= RT5645_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5645_GLB_CLK, + snd_soc_component_update_bits(component, RT5645_GLB_CLK, RT5645_SCLK_SRC_MASK, reg_val); rt5645->sysclk = freq; rt5645->sysclk_src = clk_id; @@ -2949,8 +2949,8 @@ static int rt5645_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5645_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -2959,54 +2959,54 @@ static int rt5645_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5645->pll_in = 0; rt5645->pll_out = 0; - snd_soc_update_bits(codec, RT5645_GLB_CLK, + snd_soc_component_update_bits(component, RT5645_GLB_CLK, RT5645_SCLK_SRC_MASK, RT5645_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5645_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5645_GLB_CLK, + snd_soc_component_update_bits(component, RT5645_GLB_CLK, RT5645_PLL1_SRC_MASK, RT5645_PLL1_SRC_MCLK); break; case RT5645_PLL1_S_BCLK1: case RT5645_PLL1_S_BCLK2: switch (dai->id) { case RT5645_AIF1: - snd_soc_update_bits(codec, RT5645_GLB_CLK, + snd_soc_component_update_bits(component, RT5645_GLB_CLK, RT5645_PLL1_SRC_MASK, RT5645_PLL1_SRC_BCLK1); break; case RT5645_AIF2: - snd_soc_update_bits(codec, RT5645_GLB_CLK, + snd_soc_component_update_bits(component, RT5645_GLB_CLK, RT5645_PLL1_SRC_MASK, RT5645_PLL1_SRC_BCLK2); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5645_PLL_CTRL1, + snd_soc_component_write(component, RT5645_PLL_CTRL1, pll_code.n_code << RT5645_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5645_PLL_CTRL2, + snd_soc_component_write(component, RT5645_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5645_PLL_M_SFT | pll_code.m_bp << RT5645_PLL_M_BP_SFT); @@ -3020,8 +3020,8 @@ static int rt5645_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); unsigned int i_slot_sft, o_slot_sft, i_width_sht, o_width_sht, en_sft; unsigned int mask, val = 0; @@ -3044,7 +3044,7 @@ static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, if (rx_mask || tx_mask) { val |= (1 << en_sft); if (rt5645->codec_type == CODEC_TYPE_RT5645) - snd_soc_update_bits(codec, RT5645_BASS_BACK, + snd_soc_component_update_bits(component, RT5645_BASS_BACK, RT5645_G_BB_BST_MASK, RT5645_G_BB_BST_25DB); } @@ -3078,45 +3078,45 @@ static int rt5645_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, break; } - snd_soc_update_bits(codec, RT5645_TDM_CTRL_1, mask, val); + snd_soc_component_update_bits(component, RT5645_TDM_CTRL_1, mask, val); return 0; } -static int rt5645_set_bias_level(struct snd_soc_codec *codec, +static int rt5645_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_PREPARE: - if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) { - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) { + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_VREF1 | RT5645_PWR_MB | RT5645_PWR_BG | RT5645_PWR_VREF2, RT5645_PWR_VREF1 | RT5645_PWR_MB | RT5645_PWR_BG | RT5645_PWR_VREF2); mdelay(10); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_FV1 | RT5645_PWR_FV2, RT5645_PWR_FV1 | RT5645_PWR_FV2); - snd_soc_update_bits(codec, RT5645_GEN_CTRL1, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL1, RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL); } break; case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_VREF1 | RT5645_PWR_MB | RT5645_PWR_BG | RT5645_PWR_VREF2, RT5645_PWR_VREF1 | RT5645_PWR_MB | RT5645_PWR_BG | RT5645_PWR_VREF2); mdelay(10); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_FV1 | RT5645_PWR_FV2, RT5645_PWR_FV1 | RT5645_PWR_FV2); - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1140); msleep(40); if (rt5645->en_button_func) queue_delayed_work(system_power_efficient_wq, @@ -3126,11 +3126,11 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: - snd_soc_write(codec, RT5645_DEPOP_M2, 0x1100); + snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1100); if (!rt5645->en_button_func) - snd_soc_update_bits(codec, RT5645_GEN_CTRL1, + snd_soc_component_update_bits(component, RT5645_GEN_CTRL1, RT5645_DIG_GATE_CTRL, 0); - snd_soc_update_bits(codec, RT5645_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5645_PWR_ANLG1, RT5645_PWR_VREF1 | RT5645_PWR_MB | RT5645_PWR_BG | RT5645_PWR_VREF2 | RT5645_PWR_FV1 | RT5645_PWR_FV2, 0x0); @@ -3143,27 +3143,27 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec, return 0; } -static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec, +static void rt5645_enable_push_button_irq(struct snd_soc_component *component, bool enable) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (enable) { snd_soc_dapm_force_enable_pin(dapm, "ADC L power"); snd_soc_dapm_force_enable_pin(dapm, "ADC R power"); snd_soc_dapm_sync(dapm); - snd_soc_update_bits(codec, RT5650_4BTN_IL_CMD1, 0x3, 0x3); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD1, 0x3, 0x3); + snd_soc_component_update_bits(component, RT5645_INT_IRQ_ST, 0x8, 0x8); - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD2, 0x8000, 0x8000); - snd_soc_read(codec, RT5650_4BTN_IL_CMD1); + snd_soc_component_read32(component, RT5650_4BTN_IL_CMD1); pr_debug("%s read %x = %x\n", __func__, RT5650_4BTN_IL_CMD1, - snd_soc_read(codec, RT5650_4BTN_IL_CMD1)); + snd_soc_component_read32(component, RT5650_4BTN_IL_CMD1)); } else { - snd_soc_update_bits(codec, RT5650_4BTN_IL_CMD2, 0x8000, 0x0); - snd_soc_update_bits(codec, RT5645_INT_IRQ_ST, 0x8, 0x0); + snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD2, 0x8000, 0x0); + snd_soc_component_update_bits(component, RT5645_INT_IRQ_ST, 0x8, 0x0); snd_soc_dapm_disable_pin(dapm, "ADC L power"); snd_soc_dapm_disable_pin(dapm, "ADC R power"); @@ -3171,10 +3171,10 @@ static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec, } } -static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5645_jack_detect(struct snd_soc_component *component, int jack_insert) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); unsigned int val; if (jack_insert) { @@ -3208,12 +3208,12 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) msleep(600); regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val); val &= 0x7; - dev_dbg(codec->dev, "val = %d\n", val); + dev_dbg(component->dev, "val = %d\n", val); if (val == 1 || val == 2) { rt5645->jack_type = SND_JACK_HEADSET; if (rt5645->en_button_func) { - rt5645_enable_push_button_irq(codec, true); + rt5645_enable_push_button_irq(component, true); } } else { snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); @@ -3235,7 +3235,7 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) RT5645_CBJ_BST1_EN, 0); if (rt5645->en_button_func) - rt5645_enable_push_button_irq(codec, false); + rt5645_enable_push_button_irq(component, false); if (rt5645->pdata.jd_mode == 0) snd_soc_dapm_disable_pin(dapm, "LDO2"); @@ -3249,25 +3249,25 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert) return rt5645->jack_type; } -static int rt5645_button_detect(struct snd_soc_codec *codec) +static int rt5645_button_detect(struct snd_soc_component *component) { int btn_type, val; - val = snd_soc_read(codec, RT5650_4BTN_IL_CMD1); + val = snd_soc_component_read32(component, RT5650_4BTN_IL_CMD1); pr_debug("val=0x%x\n", val); btn_type = val & 0xfff0; - snd_soc_write(codec, RT5650_4BTN_IL_CMD1, val); + snd_soc_component_write(component, RT5650_4BTN_IL_CMD1, val); return btn_type; } static irqreturn_t rt5645_irq(int irq, void *data); -int rt5645_set_jack_detect(struct snd_soc_codec *codec, +int rt5645_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack, struct snd_soc_jack *btn_jack) { - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); rt5645->hp_jack = hp_jack; rt5645->mic_jack = mic_jack; @@ -3291,16 +3291,16 @@ static void rt5645_jack_detect_work(struct work_struct *work) container_of(work, struct rt5645_priv, jack_detect_work.work); int val, btn_type, gpio_state = 0, report = 0; - if (!rt5645->codec) + if (!rt5645->component) return; switch (rt5645->pdata.jd_mode) { case 0: /* Not using rt5645 JD */ if (rt5645->gpiod_hp_det) { gpio_state = gpiod_get_value(rt5645->gpiod_hp_det); - dev_dbg(rt5645->codec->dev, "gpio_state = %d\n", + dev_dbg(rt5645->component->dev, "gpio_state = %d\n", gpio_state); - report = rt5645_jack_detect(rt5645->codec, gpio_state); + report = rt5645_jack_detect(rt5645->component, gpio_state); } snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); @@ -3308,20 +3308,20 @@ static void rt5645_jack_detect_work(struct work_struct *work) report, SND_JACK_MICROPHONE); return; default: /* read rt5645 jd1_1 status */ - val = snd_soc_read(rt5645->codec, RT5645_INT_IRQ_ST) & 0x1000; + val = snd_soc_component_read32(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000; break; } if (!val && (rt5645->jack_type == 0)) { /* jack in */ - report = rt5645_jack_detect(rt5645->codec, 1); + report = rt5645_jack_detect(rt5645->component, 1); } else if (!val && rt5645->jack_type != 0) { /* for push button and jack out */ btn_type = 0; - if (snd_soc_read(rt5645->codec, RT5645_INT_IRQ_ST) & 0x4) { + if (snd_soc_component_read32(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) { /* button pressed */ report = SND_JACK_HEADSET; - btn_type = rt5645_button_detect(rt5645->codec); + btn_type = rt5645_button_detect(rt5645->component); /* rt5650 can report three kinds of button behavior, one click, double click and hold. However, currently we will report button pressed/released @@ -3351,7 +3351,7 @@ static void rt5645_jack_detect_work(struct work_struct *work) case 0x0000: /* unpressed */ break; default: - dev_err(rt5645->codec->dev, + dev_err(rt5645->component->dev, "Unexpected button code 0x%04x\n", btn_type); break; @@ -3366,9 +3366,9 @@ static void rt5645_jack_detect_work(struct work_struct *work) } else { /* jack out */ report = 0; - snd_soc_update_bits(rt5645->codec, + snd_soc_component_update_bits(rt5645->component, RT5645_INT_IRQ_ST, 0x1, 0x0); - rt5645_jack_detect(rt5645->codec, 0); + rt5645_jack_detect(rt5645->component, 0); } snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); @@ -3406,12 +3406,12 @@ static void rt5645_btn_check_callback(struct timer_list *t) &rt5645->jack_detect_work, msecs_to_jiffies(5)); } -static int rt5645_probe(struct snd_soc_codec *codec) +static int rt5645_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); - rt5645->codec = codec; + rt5645->component = component; switch (rt5645->codec_type) { case CODEC_TYPE_RT5645: @@ -3437,7 +3437,7 @@ static int rt5645_probe(struct snd_soc_codec *codec) break; } - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); /* for JD function */ if (rt5645->pdata.jd_mode) { @@ -3447,24 +3447,23 @@ static int rt5645_probe(struct snd_soc_codec *codec) } if (rt5645->pdata.long_name) - codec->component.card->long_name = rt5645->pdata.long_name; + component->card->long_name = rt5645->pdata.long_name; - rt5645->eq_param = devm_kzalloc(codec->dev, + rt5645->eq_param = devm_kzalloc(component->dev, RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s), GFP_KERNEL); return 0; } -static int rt5645_remove(struct snd_soc_codec *codec) +static void rt5645_remove(struct snd_soc_component *component) { - rt5645_reset(codec); - return 0; + rt5645_reset(component); } #ifdef CONFIG_PM -static int rt5645_suspend(struct snd_soc_codec *codec) +static int rt5645_suspend(struct snd_soc_component *component) { - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5645->regmap, true); regcache_mark_dirty(rt5645->regmap); @@ -3472,9 +3471,9 @@ static int rt5645_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5645_resume(struct snd_soc_codec *codec) +static int rt5645_resume(struct snd_soc_component *component) { - struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); + struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5645->regmap, false); regcache_sync(rt5645->regmap); @@ -3539,21 +3538,21 @@ static struct snd_soc_dai_driver rt5645_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5645 = { - .probe = rt5645_probe, - .remove = rt5645_remove, - .suspend = rt5645_suspend, - .resume = rt5645_resume, - .set_bias_level = rt5645_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5645_snd_controls, - .num_controls = ARRAY_SIZE(rt5645_snd_controls), - .dapm_widgets = rt5645_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5645_dapm_widgets), - .dapm_routes = rt5645_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5645_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5645 = { + .probe = rt5645_probe, + .remove = rt5645_remove, + .suspend = rt5645_suspend, + .resume = rt5645_resume, + .set_bias_level = rt5645_set_bias_level, + .controls = rt5645_snd_controls, + .num_controls = ARRAY_SIZE(rt5645_snd_controls), + .dapm_widgets = rt5645_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5645_dapm_widgets), + .dapm_routes = rt5645_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5645_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5645_regmap = { @@ -4028,7 +4027,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c, } } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5645, + ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_rt5645, rt5645_dai, ARRAY_SIZE(rt5645_dai)); if (ret) goto err_irq; @@ -4054,7 +4053,6 @@ static int rt5645_i2c_remove(struct i2c_client *i2c) cancel_delayed_work_sync(&rt5645->rcclock_work); del_timer_sync(&rt5645->btn_check_timer); - snd_soc_unregister_codec(&i2c->dev); regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); return 0; diff --git a/sound/soc/codecs/rt5645.h b/sound/soc/codecs/rt5645.h index 940325b28c29..cc2455768368 100644 --- a/sound/soc/codecs/rt5645.h +++ b/sound/soc/codecs/rt5645.h @@ -2200,10 +2200,10 @@ enum { RT5645_AD_MONO_R_FILTER = (0x1 << 5), }; -int rt5645_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5645_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); -int rt5645_set_jack_detect(struct snd_soc_codec *codec, +int rt5645_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack, struct snd_soc_jack *btn_jack); #endif /* __RT5645_H__ */ diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c index 831b297978a4..6b5669f3e85d 100644 --- a/sound/soc/codecs/rt5651.c +++ b/sound/soc/codecs/rt5651.c @@ -19,7 +19,6 @@ #include <linux/platform_device.h> #include <linux/spi/spi.h> #include <linux/acpi.h> -#include <linux/dmi.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> @@ -32,10 +31,6 @@ #include "rl6231.h" #include "rt5651.h" -#define RT5651_JD_MAP(quirk) ((quirk) & GENMASK(7, 0)) -#define RT5651_IN2_DIFF BIT(16) -#define RT5651_DMIC_EN BIT(17) - #define RT5651_DEVICE_ID_VALUE 0x6281 #define RT5651_PR_RANGE_BASE (0xff + 1) @@ -43,8 +38,6 @@ #define RT5651_PR_BASE (RT5651_PR_RANGE_BASE + (0 * RT5651_PR_SPACING)) -static unsigned long rt5651_quirk; - static const struct regmap_range_cfg rt5651_ranges[] = { { .name = "PR", .range_min = RT5651_PR_BASE, .range_max = RT5651_PR_BASE + 0xb4, @@ -384,36 +377,22 @@ static const struct snd_kcontrol_new rt5651_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5651->sysclk / rl6231_get_pre_div(rt5651->regmap, RT5651_ADDA_CLK1, RT5651_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else - snd_soc_update_bits(codec, RT5651_DMIC, RT5651_DMIC_CLK_MASK, + snd_soc_component_update_bits(component, RT5651_DMIC, RT5651_DMIC_CLK_MASK, idx << RT5651_DMIC_CLK_SFT); return idx; } -static int is_sysclk_from_pll(struct snd_soc_dapm_widget *source, - struct snd_soc_dapm_widget *sink) -{ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - unsigned int val; - - val = snd_soc_read(codec, RT5651_GLB_CLK); - val &= RT5651_SCLK_SRC_MASK; - if (val == RT5651_SCLK_SRC_PLL1) - return 1; - else - return 0; -} - /* Digital Mixer */ static const struct snd_kcontrol_new rt5651_sto1_adc_l_mix[] = { SOC_DAPM_SINGLE("ADC1 Switch", RT5651_STO1_ADC_MIXER, @@ -703,8 +682,8 @@ static const struct snd_kcontrol_new rt5651_pdm_r_mux = static int rt5651_amp_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -741,8 +720,8 @@ static int rt5651_amp_power_event(struct snd_soc_dapm_widget *w, static int rt5651_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -786,8 +765,8 @@ static int rt5651_hp_post_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -806,16 +785,16 @@ static int rt5651_hp_post_event(struct snd_soc_dapm_widget *w, static int rt5651_bst1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST1_OP2, RT5651_PWR_BST1_OP2); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST1_OP2, 0); break; @@ -829,16 +808,16 @@ static int rt5651_bst1_event(struct snd_soc_dapm_widget *w, static int rt5651_bst2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST2_OP2, RT5651_PWR_BST2_OP2); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST2_OP2, 0); break; @@ -852,16 +831,16 @@ static int rt5651_bst2_event(struct snd_soc_dapm_widget *w, static int rt5651_bst3_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST3_OP2, RT5651_PWR_BST3_OP2); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5651_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, RT5651_PWR_BST3_OP2, 0); break; @@ -885,12 +864,6 @@ static const struct snd_soc_dapm_widget rt5651_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY_S("ADC ASRC", 1, RT5651_PLL_MODE_2, 11, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("PLL1", RT5651_PWR_ANLG2, - RT5651_PWR_PLL_BIT, 0, NULL, 0), - /* Input Side */ - SND_SOC_DAPM_SUPPLY("JD Power", RT5651_PWR_ANLG2, - RT5651_PWM_JD_M_BIT, 0, NULL, 0), - /* micbias */ SND_SOC_DAPM_SUPPLY("LDO", RT5651_PWR_ANLG1, RT5651_PWR_LDO_BIT, 0, NULL, 0), @@ -1169,7 +1142,6 @@ static const struct snd_soc_dapm_route rt5651_dapm_routes[] = { {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"}, {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"}, {"Stereo1 ADC MIXL", NULL, "Stereo1 Filter"}, - {"Stereo1 Filter", NULL, "PLL1", is_sysclk_from_pll}, {"Stereo1 Filter", NULL, "ADC ASRC"}, {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"}, @@ -1179,7 +1151,6 @@ static const struct snd_soc_dapm_route rt5651_dapm_routes[] = { {"Stereo2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux"}, {"Stereo2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux"}, {"Stereo2 ADC MIXL", NULL, "Stereo2 Filter"}, - {"Stereo2 Filter", NULL, "PLL1", is_sysclk_from_pll}, {"Stereo2 Filter", NULL, "ADC ASRC"}, {"Stereo2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux"}, @@ -1246,10 +1217,8 @@ static const struct snd_soc_dapm_route rt5651_dapm_routes[] = { {"PDM R Mux", "DD MIX", "DAC MIXR"}, {"DAC L1", NULL, "Stereo DAC MIXL"}, - {"DAC L1", NULL, "PLL1", is_sysclk_from_pll}, {"DAC L1", NULL, "DAC L1 Power"}, {"DAC R1", NULL, "Stereo DAC MIXR"}, - {"DAC R1", NULL, "PLL1", is_sysclk_from_pll}, {"DAC R1", NULL, "DAC R1 Power"}, {"DD MIXL", "DAC L1 Switch", "DAC MIXL"}, @@ -1313,8 +1282,8 @@ static const struct snd_soc_dapm_route rt5651_dapm_routes[] = { static int rt5651_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, bclk_ms, frame_size; @@ -1322,12 +1291,12 @@ static int rt5651_hw_params(struct snd_pcm_substream *substream, pre_div = rl6231_get_clk_info(rt5651->sysclk, rt5651->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting\n"); + dev_err(component->dev, "Unsupported clock setting\n"); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } bclk_ms = frame_size > 32 ? 1 : 0; @@ -1358,19 +1327,19 @@ static int rt5651_hw_params(struct snd_pcm_substream *substream, case RT5651_AIF1: mask_clk = RT5651_I2S_PD1_MASK; val_clk = pre_div << RT5651_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5651_I2S1_SDP, + snd_soc_component_update_bits(component, RT5651_I2S1_SDP, RT5651_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5651_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5651_ADDA_CLK1, mask_clk, val_clk); break; case RT5651_AIF2: mask_clk = RT5651_I2S_BCLK_MS2_MASK | RT5651_I2S_PD2_MASK; val_clk = pre_div << RT5651_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5651_I2S2_SDP, + snd_soc_component_update_bits(component, RT5651_I2S2_SDP, RT5651_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5651_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5651_ADDA_CLK1, mask_clk, val_clk); break; default: - dev_err(codec->dev, "Wrong dai->id: %d\n", dai->id); + dev_err(component->dev, "Wrong dai->id: %d\n", dai->id); return -EINVAL; } @@ -1379,8 +1348,8 @@ static int rt5651_hw_params(struct snd_pcm_substream *substream, static int rt5651_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1423,17 +1392,17 @@ static int rt5651_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (dai->id) { case RT5651_AIF1: - snd_soc_update_bits(codec, RT5651_I2S1_SDP, + snd_soc_component_update_bits(component, RT5651_I2S1_SDP, RT5651_I2S_MS_MASK | RT5651_I2S_BP_MASK | RT5651_I2S_DF_MASK, reg_val); break; case RT5651_AIF2: - snd_soc_update_bits(codec, RT5651_I2S2_SDP, + snd_soc_component_update_bits(component, RT5651_I2S2_SDP, RT5651_I2S_MS_MASK | RT5651_I2S_BP_MASK | RT5651_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Wrong dai->id: %d\n", dai->id); + dev_err(component->dev, "Wrong dai->id: %d\n", dai->id); return -EINVAL; } return 0; @@ -1442,9 +1411,10 @@ static int rt5651_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5651_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; + unsigned int pll_bit = 0; if (freq == rt5651->sysclk && clk_id == rt5651->sysclk_src) return 0; @@ -1455,15 +1425,18 @@ static int rt5651_set_dai_sysclk(struct snd_soc_dai *dai, break; case RT5651_SCLK_S_PLL1: reg_val |= RT5651_SCLK_SRC_PLL1; + pll_bit |= RT5651_PWR_PLL; break; case RT5651_SCLK_S_RCCLK: reg_val |= RT5651_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5651_GLB_CLK, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, + RT5651_PWR_PLL, pll_bit); + snd_soc_component_update_bits(component, RT5651_GLB_CLK, RT5651_SCLK_SRC_MASK, reg_val); rt5651->sysclk = freq; rt5651->sysclk_src = clk_id; @@ -1476,8 +1449,8 @@ static int rt5651_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5651_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -1486,46 +1459,46 @@ static int rt5651_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5651->pll_in = 0; rt5651->pll_out = 0; - snd_soc_update_bits(codec, RT5651_GLB_CLK, + snd_soc_component_update_bits(component, RT5651_GLB_CLK, RT5651_SCLK_SRC_MASK, RT5651_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5651_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5651_GLB_CLK, + snd_soc_component_update_bits(component, RT5651_GLB_CLK, RT5651_PLL1_SRC_MASK, RT5651_PLL1_SRC_MCLK); break; case RT5651_PLL1_S_BCLK1: - snd_soc_update_bits(codec, RT5651_GLB_CLK, + snd_soc_component_update_bits(component, RT5651_GLB_CLK, RT5651_PLL1_SRC_MASK, RT5651_PLL1_SRC_BCLK1); break; case RT5651_PLL1_S_BCLK2: - snd_soc_update_bits(codec, RT5651_GLB_CLK, + snd_soc_component_update_bits(component, RT5651_GLB_CLK, RT5651_PLL1_SRC_MASK, RT5651_PLL1_SRC_BCLK2); break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5651_PLL_CTRL1, + snd_soc_component_write(component, RT5651_PLL_CTRL1, pll_code.n_code << RT5651_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5651_PLL_CTRL2, + snd_soc_component_write(component, RT5651_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5651_PLL_M_SFT | pll_code.m_bp << RT5651_PLL_M_BP_SFT); @@ -1536,46 +1509,44 @@ static int rt5651_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; } -static int rt5651_set_bias_level(struct snd_soc_codec *codec, +static int rt5651_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); - switch (level) { case SND_SOC_BIAS_PREPARE: - if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) { - snd_soc_update_bits(codec, RT5651_PWR_ANLG1, + if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) { + if (snd_soc_component_read32(component, RT5651_PLL_MODE_1) & 0x9200) + snd_soc_component_update_bits(component, RT5651_D_MISC, + 0xc00, 0xc00); + } + break; + case SND_SOC_BIAS_STANDBY: + if (SND_SOC_BIAS_OFF == snd_soc_component_get_bias_level(component)) { + snd_soc_component_update_bits(component, RT5651_PWR_ANLG1, RT5651_PWR_VREF1 | RT5651_PWR_MB | RT5651_PWR_BG | RT5651_PWR_VREF2, RT5651_PWR_VREF1 | RT5651_PWR_MB | RT5651_PWR_BG | RT5651_PWR_VREF2); usleep_range(10000, 15000); - snd_soc_update_bits(codec, RT5651_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5651_PWR_ANLG1, RT5651_PWR_FV1 | RT5651_PWR_FV2, RT5651_PWR_FV1 | RT5651_PWR_FV2); - snd_soc_update_bits(codec, RT5651_PWR_ANLG1, - RT5651_PWR_LDO_DVO_MASK, - RT5651_PWR_LDO_DVO_1_2V); - snd_soc_update_bits(codec, RT5651_D_MISC, 0x1, 0x1); - if (snd_soc_read(codec, RT5651_PLL_MODE_1) & 0x9200) - snd_soc_update_bits(codec, RT5651_D_MISC, - 0xc00, 0xc00); + snd_soc_component_update_bits(component, RT5651_D_MISC, 0x1, 0x1); } break; - case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, RT5651_D_MISC, 0x0010); - snd_soc_write(codec, RT5651_PWR_DIG1, 0x0000); - snd_soc_write(codec, RT5651_PWR_DIG2, 0x0000); - snd_soc_write(codec, RT5651_PWR_VOL, 0x0000); - snd_soc_write(codec, RT5651_PWR_MIXER, 0x0000); - if (rt5651->pdata.jd_src) { - snd_soc_write(codec, RT5651_PWR_ANLG2, 0x0204); - snd_soc_write(codec, RT5651_PWR_ANLG1, 0x0002); - } else { - snd_soc_write(codec, RT5651_PWR_ANLG1, 0x0000); - snd_soc_write(codec, RT5651_PWR_ANLG2, 0x0000); - } + case SND_SOC_BIAS_OFF: + snd_soc_component_write(component, RT5651_D_MISC, 0x0010); + snd_soc_component_write(component, RT5651_PWR_DIG1, 0x0000); + snd_soc_component_write(component, RT5651_PWR_DIG2, 0x0000); + snd_soc_component_write(component, RT5651_PWR_VOL, 0x0000); + snd_soc_component_write(component, RT5651_PWR_MIXER, 0x0000); + /* Do not touch the LDO voltage select bits on bias-off */ + snd_soc_component_update_bits(component, RT5651_PWR_ANLG1, + ~RT5651_PWR_LDO_DVO_MASK, 0); + /* Leave PLL1 and jack-detect power as is, all others off */ + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, + ~(RT5651_PWR_PLL | RT5651_PWR_JD_M), 0); break; default: @@ -1585,53 +1556,326 @@ static int rt5651_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5651_probe(struct snd_soc_codec *codec) +static void rt5651_enable_micbias1_for_ovcd(struct snd_soc_component *component) +{ + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + + snd_soc_dapm_mutex_lock(dapm); + snd_soc_dapm_force_enable_pin_unlocked(dapm, "LDO"); + snd_soc_dapm_force_enable_pin_unlocked(dapm, "micbias1"); + /* OVCD is unreliable when used with RCCLK as sysclk-source */ + snd_soc_dapm_force_enable_pin_unlocked(dapm, "Platform Clock"); + snd_soc_dapm_sync_unlocked(dapm); + snd_soc_dapm_mutex_unlock(dapm); +} + +static void rt5651_disable_micbias1_for_ovcd(struct snd_soc_component *component) +{ + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + + snd_soc_dapm_mutex_lock(dapm); + snd_soc_dapm_disable_pin_unlocked(dapm, "Platform Clock"); + snd_soc_dapm_disable_pin_unlocked(dapm, "micbias1"); + snd_soc_dapm_disable_pin_unlocked(dapm, "LDO"); + snd_soc_dapm_sync_unlocked(dapm); + snd_soc_dapm_mutex_unlock(dapm); +} + +static void rt5651_clear_micbias1_ovcd(struct snd_soc_component *component) +{ + snd_soc_component_update_bits(component, RT5651_IRQ_CTRL2, + RT5651_MB1_OC_CLR, 0); +} + +static bool rt5651_micbias1_ovcd(struct snd_soc_component *component) +{ + int val; + + val = snd_soc_component_read32(component, RT5651_IRQ_CTRL2); + dev_dbg(component->dev, "irq ctrl2 %#04x\n", val); + + return (val & RT5651_MB1_OC_CLR); +} + +static bool rt5651_jack_inserted(struct snd_soc_component *component) +{ + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); + int val; + + val = snd_soc_component_read32(component, RT5651_INT_IRQ_ST); + dev_dbg(component->dev, "irq status %#04x\n", val); + + switch (rt5651->jd_src) { + case RT5651_JD1_1: + val &= 0x1000; + break; + case RT5651_JD1_2: + val &= 0x2000; + break; + case RT5651_JD2: + val &= 0x4000; + break; + default: + break; + } + + return val == 0; +} + +/* Jack detect timings */ +#define JACK_SETTLE_TIME 100 /* milli seconds */ +#define JACK_DETECT_COUNT 5 +#define JACK_DETECT_MAXCOUNT 20 /* Aprox. 2 seconds worth of tries */ + +static int rt5651_detect_headset(struct snd_soc_component *component) +{ + int i, headset_count = 0, headphone_count = 0; + + /* + * We get the insertion event before the jack is fully inserted at which + * point the second ring on a TRRS connector may short the 2nd ring and + * sleeve contacts, also the overcurrent detection is not entirely + * reliable. So we try several times with a wait in between until we + * detect the same type JACK_DETECT_COUNT times in a row. + */ + for (i = 0; i < JACK_DETECT_MAXCOUNT; i++) { + /* Clear any previous over-current status flag */ + rt5651_clear_micbias1_ovcd(component); + + msleep(JACK_SETTLE_TIME); + + /* Check the jack is still connected before checking ovcd */ + if (!rt5651_jack_inserted(component)) + return 0; + + if (rt5651_micbias1_ovcd(component)) { + /* + * Over current detected, there is a short between the + * 2nd ring contact and the ground, so a TRS connector + * without a mic contact and thus plain headphones. + */ + dev_dbg(component->dev, "mic-gnd shorted\n"); + headset_count = 0; + headphone_count++; + if (headphone_count == JACK_DETECT_COUNT) + return SND_JACK_HEADPHONE; + } else { + dev_dbg(component->dev, "mic-gnd open\n"); + headphone_count = 0; + headset_count++; + if (headset_count == JACK_DETECT_COUNT) + return SND_JACK_HEADSET; + } + } + + dev_err(component->dev, "Error detecting headset vs headphones, bad contact?, assuming headphones\n"); + return SND_JACK_HEADPHONE; +} + +static void rt5651_jack_detect_work(struct work_struct *work) { - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - - rt5651->codec = codec; - - snd_soc_update_bits(codec, RT5651_PWR_ANLG1, - RT5651_PWR_VREF1 | RT5651_PWR_MB | - RT5651_PWR_BG | RT5651_PWR_VREF2, - RT5651_PWR_VREF1 | RT5651_PWR_MB | - RT5651_PWR_BG | RT5651_PWR_VREF2); - usleep_range(10000, 15000); - snd_soc_update_bits(codec, RT5651_PWR_ANLG1, - RT5651_PWR_FV1 | RT5651_PWR_FV2, - RT5651_PWR_FV1 | RT5651_PWR_FV2); - - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); - - if (rt5651->pdata.jd_src) { - snd_soc_dapm_force_enable_pin(dapm, "JD Power"); - snd_soc_dapm_force_enable_pin(dapm, "LDO"); - snd_soc_dapm_sync(dapm); - - regmap_update_bits(rt5651->regmap, RT5651_MICBIAS, - 0x38, 0x38); + struct rt5651_priv *rt5651 = + container_of(work, struct rt5651_priv, jack_detect_work); + int report = 0; + + if (rt5651_jack_inserted(rt5651->component)) { + rt5651_enable_micbias1_for_ovcd(rt5651->component); + report = rt5651_detect_headset(rt5651->component); + rt5651_disable_micbias1_for_ovcd(rt5651->component); + } + + snd_soc_jack_report(rt5651->hp_jack, report, SND_JACK_HEADSET); +} + +static irqreturn_t rt5651_irq(int irq, void *data) +{ + struct rt5651_priv *rt5651 = data; + + queue_work(system_power_efficient_wq, &rt5651->jack_detect_work); + + return IRQ_HANDLED; +} + +static int rt5651_set_jack(struct snd_soc_component *component, + struct snd_soc_jack *hp_jack, void *data) +{ + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); + int ret; + + if (!rt5651->irq) + return -EINVAL; + + /* IRQ output on GPIO1 */ + snd_soc_component_update_bits(component, RT5651_GPIO_CTRL1, + RT5651_GP1_PIN_MASK, RT5651_GP1_PIN_IRQ); + + /* Select jack detect source */ + switch (rt5651->jd_src) { + case RT5651_JD1_1: + snd_soc_component_update_bits(component, RT5651_JD_CTRL2, + RT5651_JD_TRG_SEL_MASK, RT5651_JD_TRG_SEL_JD1_1); + snd_soc_component_update_bits(component, RT5651_IRQ_CTRL1, + RT5651_JD1_1_IRQ_EN, RT5651_JD1_1_IRQ_EN); + break; + case RT5651_JD1_2: + snd_soc_component_update_bits(component, RT5651_JD_CTRL2, + RT5651_JD_TRG_SEL_MASK, RT5651_JD_TRG_SEL_JD1_2); + snd_soc_component_update_bits(component, RT5651_IRQ_CTRL1, + RT5651_JD1_2_IRQ_EN, RT5651_JD1_2_IRQ_EN); + break; + case RT5651_JD2: + snd_soc_component_update_bits(component, RT5651_JD_CTRL2, + RT5651_JD_TRG_SEL_MASK, RT5651_JD_TRG_SEL_JD2); + snd_soc_component_update_bits(component, RT5651_IRQ_CTRL1, + RT5651_JD2_IRQ_EN, RT5651_JD2_IRQ_EN); + break; + case RT5651_JD_NULL: + return 0; + default: + dev_err(component->dev, "Currently only JD1_1 / JD1_2 / JD2 are supported\n"); + return -EINVAL; } + /* Enable jack detect power */ + snd_soc_component_update_bits(component, RT5651_PWR_ANLG2, + RT5651_PWR_JD_M, RT5651_PWR_JD_M); + + /* Set OVCD threshold current and scale-factor */ + snd_soc_component_write(component, RT5651_PR_BASE + RT5651_BIAS_CUR4, + 0xa800 | rt5651->ovcd_sf); + + snd_soc_component_update_bits(component, RT5651_MICBIAS, + RT5651_MIC1_OVCD_MASK | + RT5651_MIC1_OVTH_MASK | + RT5651_PWR_CLK12M_MASK | + RT5651_PWR_MB_MASK, + RT5651_MIC1_OVCD_EN | + rt5651->ovcd_th | + RT5651_PWR_MB_PU | + RT5651_PWR_CLK12M_PU); + + /* + * The over-current-detect is only reliable in detecting the absence + * of over-current, when the mic-contact in the jack is short-circuited, + * the hardware periodically retries if it can apply the bias-current + * leading to the ovcd status flip-flopping 1-0-1 with it being 0 about + * 10% of the time, as we poll the ovcd status bit we might hit that + * 10%, so we enable sticky mode and when checking OVCD we clear the + * status, msleep() a bit and then check to get a reliable reading. + */ + snd_soc_component_update_bits(component, RT5651_IRQ_CTRL2, + RT5651_MB1_OC_STKY_MASK, RT5651_MB1_OC_STKY_EN); + + rt5651->hp_jack = hp_jack; + + ret = devm_request_threaded_irq(component->dev, rt5651->irq, NULL, + rt5651_irq, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, "rt5651", rt5651); + if (ret) { + dev_err(component->dev, "Failed to reguest IRQ: %d\n", ret); + return ret; + } + + /* sync initial jack state */ + queue_work(system_power_efficient_wq, &rt5651->jack_detect_work); + + return 0; +} + +/* + * Note on some platforms the platform code may need to add device-properties, + * rather then relying only on properties set by the firmware. Therefor the + * property parsing MUST be done from the component driver's probe function, + * rather then from the i2c driver's probe function, so that the platform-code + * can attach extra properties before calling snd_soc_register_card(). + */ +static void rt5651_apply_properties(struct snd_soc_component *component) +{ + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); + u32 val; + + if (device_property_read_bool(component->dev, "realtek,in2-differential")) + snd_soc_component_update_bits(component, RT5651_IN1_IN2, + RT5651_IN_DF2, RT5651_IN_DF2); + + if (device_property_read_bool(component->dev, "realtek,dmic-en")) + snd_soc_component_update_bits(component, RT5651_GPIO_CTRL1, + RT5651_GP2_PIN_MASK, RT5651_GP2_PIN_DMIC1_SCL); + + if (device_property_read_u32(component->dev, + "realtek,jack-detect-source", &val) == 0) + rt5651->jd_src = val; + + /* + * Testing on various boards has shown that good defaults for the OVCD + * threshold and scale-factor are 2000µA and 0.75. For an effective + * limit of 1500µA, this seems to be more reliable then 1500µA and 1.0. + */ + rt5651->ovcd_th = RT5651_MIC1_OVTH_2000UA; + rt5651->ovcd_sf = RT5651_MIC_OVCD_SF_0P75; + + if (device_property_read_u32(component->dev, + "realtek,over-current-threshold-microamp", &val) == 0) { + switch (val) { + case 600: + rt5651->ovcd_th = RT5651_MIC1_OVTH_600UA; + break; + case 1500: + rt5651->ovcd_th = RT5651_MIC1_OVTH_1500UA; + break; + case 2000: + rt5651->ovcd_th = RT5651_MIC1_OVTH_2000UA; + break; + default: + dev_warn(component->dev, "Warning: Invalid over-current-threshold-microamp value: %d, defaulting to 2000uA\n", + val); + } + } + + if (device_property_read_u32(component->dev, + "realtek,over-current-scale-factor", &val) == 0) { + if (val <= RT5651_OVCD_SF_1P5) + rt5651->ovcd_sf = val << RT5651_MIC_OVCD_SF_SFT; + else + dev_warn(component->dev, "Warning: Invalid over-current-scale-factor value: %d, defaulting to 0.75\n", + val); + } +} + +static int rt5651_probe(struct snd_soc_component *component) +{ + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); + + rt5651->component = component; + + snd_soc_component_update_bits(component, RT5651_PWR_ANLG1, + RT5651_PWR_LDO_DVO_MASK, RT5651_PWR_LDO_DVO_1_2V); + + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); + + rt5651_apply_properties(component); + return 0; } #ifdef CONFIG_PM -static int rt5651_suspend(struct snd_soc_codec *codec) +static int rt5651_suspend(struct snd_soc_component *component) { - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5651->regmap, true); regcache_mark_dirty(rt5651->regmap); return 0; } -static int rt5651_resume(struct snd_soc_codec *codec) +static int rt5651_resume(struct snd_soc_component *component) { - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); + struct rt5651_priv *rt5651 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5651->regmap, false); - snd_soc_cache_sync(codec); + snd_soc_component_cache_sync(component); return 0; } @@ -1692,20 +1936,21 @@ static struct snd_soc_dai_driver rt5651_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5651 = { - .probe = rt5651_probe, - .suspend = rt5651_suspend, - .resume = rt5651_resume, - .set_bias_level = rt5651_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5651_snd_controls, - .num_controls = ARRAY_SIZE(rt5651_snd_controls), - .dapm_widgets = rt5651_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5651_dapm_widgets), - .dapm_routes = rt5651_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5651_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5651 = { + .probe = rt5651_probe, + .suspend = rt5651_suspend, + .resume = rt5651_resume, + .set_bias_level = rt5651_set_bias_level, + .set_jack = rt5651_set_jack, + .controls = rt5651_snd_controls, + .num_controls = ARRAY_SIZE(rt5651_snd_controls), + .dapm_widgets = rt5651_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5651_dapm_widgets), + .dapm_routes = rt5651_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5651_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5651_regmap = { @@ -1722,6 +1967,7 @@ static const struct regmap_config rt5651_regmap = { .num_reg_defaults = ARRAY_SIZE(rt5651_reg), .ranges = rt5651_ranges, .num_ranges = ARRAY_SIZE(rt5651_ranges), + .use_single_rw = true, }; #if defined(CONFIG_OF) @@ -1746,135 +1992,13 @@ static const struct i2c_device_id rt5651_i2c_id[] = { }; MODULE_DEVICE_TABLE(i2c, rt5651_i2c_id); -static int rt5651_quirk_cb(const struct dmi_system_id *id) -{ - rt5651_quirk = (unsigned long) id->driver_data; - return 1; -} - -static const struct dmi_system_id rt5651_quirk_table[] = { - { - .callback = rt5651_quirk_cb, - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "KIANO"), - DMI_MATCH(DMI_PRODUCT_NAME, "KIANO SlimNote 14.2"), - }, - .driver_data = (unsigned long *) RT5651_JD1_1, - }, - {} -}; - -static int rt5651_parse_dt(struct rt5651_priv *rt5651, struct device_node *np) -{ - if (of_property_read_bool(np, "realtek,in2-differential")) - rt5651_quirk |= RT5651_IN2_DIFF; - if (of_property_read_bool(np, "realtek,dmic-en")) - rt5651_quirk |= RT5651_DMIC_EN; - - return 0; -} - -static void rt5651_set_pdata(struct rt5651_priv *rt5651) -{ - if (rt5651_quirk & RT5651_IN2_DIFF) - rt5651->pdata.in2_diff = true; - if (rt5651_quirk & RT5651_DMIC_EN) - rt5651->pdata.dmic_en = true; - if (RT5651_JD_MAP(rt5651_quirk)) - rt5651->pdata.jd_src = RT5651_JD_MAP(rt5651_quirk); -} - -static irqreturn_t rt5651_irq(int irq, void *data) -{ - struct rt5651_priv *rt5651 = data; - - queue_delayed_work(system_power_efficient_wq, - &rt5651->jack_detect_work, msecs_to_jiffies(250)); - - return IRQ_HANDLED; -} - -static int rt5651_jack_detect(struct snd_soc_codec *codec, int jack_insert) -{ - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - int jack_type; - - if (jack_insert) { - snd_soc_dapm_force_enable_pin(dapm, "LDO"); - snd_soc_dapm_sync(dapm); - - snd_soc_update_bits(codec, RT5651_MICBIAS, - RT5651_MIC1_OVCD_MASK | - RT5651_MIC1_OVTH_MASK | - RT5651_PWR_CLK12M_MASK | - RT5651_PWR_MB_MASK, - RT5651_MIC1_OVCD_EN | - RT5651_MIC1_OVTH_600UA | - RT5651_PWR_MB_PU | - RT5651_PWR_CLK12M_PU); - msleep(100); - if (snd_soc_read(codec, RT5651_IRQ_CTRL2) & RT5651_MB1_OC_CLR) - jack_type = SND_JACK_HEADPHONE; - else - jack_type = SND_JACK_HEADSET; - snd_soc_update_bits(codec, RT5651_IRQ_CTRL2, - RT5651_MB1_OC_CLR, 0); - } else { /* jack out */ - jack_type = 0; - - snd_soc_update_bits(codec, RT5651_MICBIAS, - RT5651_MIC1_OVCD_MASK, - RT5651_MIC1_OVCD_DIS); - } - - return jack_type; -} - -static void rt5651_jack_detect_work(struct work_struct *work) -{ - struct rt5651_priv *rt5651 = - container_of(work, struct rt5651_priv, jack_detect_work.work); - - int report, val = 0; - - if (!rt5651->codec) - return; - - switch (rt5651->pdata.jd_src) { - case RT5651_JD1_1: - val = snd_soc_read(rt5651->codec, RT5651_INT_IRQ_ST) & 0x1000; - break; - case RT5651_JD1_2: - val = snd_soc_read(rt5651->codec, RT5651_INT_IRQ_ST) & 0x2000; - break; - case RT5651_JD2: - val = snd_soc_read(rt5651->codec, RT5651_INT_IRQ_ST) & 0x4000; - break; - default: - break; - } - - report = rt5651_jack_detect(rt5651->codec, !val); - - snd_soc_jack_report(rt5651->hp_jack, report, SND_JACK_HEADSET); -} - -int rt5651_set_jack_detect(struct snd_soc_codec *codec, - struct snd_soc_jack *hp_jack) -{ - struct rt5651_priv *rt5651 = snd_soc_codec_get_drvdata(codec); - - rt5651->hp_jack = hp_jack; - rt5651_irq(0, rt5651); - - return 0; -} -EXPORT_SYMBOL_GPL(rt5651_set_jack_detect); - +/* + * Note this function MUST not look at device-properties, see the comment + * above rt5651_apply_properties(). + */ static int rt5651_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { - struct rt5651_platform_data *pdata = dev_get_platdata(&i2c->dev); struct rt5651_priv *rt5651; int ret; @@ -1885,15 +2009,6 @@ static int rt5651_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, rt5651); - if (pdata) - rt5651->pdata = *pdata; - else if (i2c->dev.of_node) - rt5651_parse_dt(rt5651, i2c->dev.of_node); - else - dmi_check_system(rt5651_quirk_table); - - rt5651_set_pdata(rt5651); - rt5651->regmap = devm_regmap_init_i2c(i2c, &rt5651_regmap); if (IS_ERR(rt5651->regmap)) { ret = PTR_ERR(rt5651->regmap); @@ -1916,70 +2031,13 @@ static int rt5651_i2c_probe(struct i2c_client *i2c, if (ret != 0) dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); - if (rt5651->pdata.in2_diff) - regmap_update_bits(rt5651->regmap, RT5651_IN1_IN2, - RT5651_IN_DF2, RT5651_IN_DF2); - - if (rt5651->pdata.dmic_en) - regmap_update_bits(rt5651->regmap, RT5651_GPIO_CTRL1, - RT5651_GP2_PIN_MASK, RT5651_GP2_PIN_DMIC1_SCL); - + rt5651->irq = i2c->irq; rt5651->hp_mute = 1; - if (rt5651->pdata.jd_src) { - - /* IRQ output on GPIO1 */ - regmap_update_bits(rt5651->regmap, RT5651_GPIO_CTRL1, - RT5651_GP1_PIN_MASK, RT5651_GP1_PIN_IRQ); - - switch (rt5651->pdata.jd_src) { - case RT5651_JD1_1: - regmap_update_bits(rt5651->regmap, RT5651_JD_CTRL2, - RT5651_JD_TRG_SEL_MASK, - RT5651_JD_TRG_SEL_JD1_1); - regmap_update_bits(rt5651->regmap, RT5651_IRQ_CTRL1, - RT5651_JD1_1_IRQ_EN, - RT5651_JD1_1_IRQ_EN); - break; - case RT5651_JD1_2: - regmap_update_bits(rt5651->regmap, RT5651_JD_CTRL2, - RT5651_JD_TRG_SEL_MASK, - RT5651_JD_TRG_SEL_JD1_2); - regmap_update_bits(rt5651->regmap, RT5651_IRQ_CTRL1, - RT5651_JD1_2_IRQ_EN, - RT5651_JD1_2_IRQ_EN); - break; - case RT5651_JD2: - regmap_update_bits(rt5651->regmap, RT5651_JD_CTRL2, - RT5651_JD_TRG_SEL_MASK, - RT5651_JD_TRG_SEL_JD2); - regmap_update_bits(rt5651->regmap, RT5651_IRQ_CTRL1, - RT5651_JD2_IRQ_EN, - RT5651_JD2_IRQ_EN); - break; - case RT5651_JD_NULL: - break; - default: - dev_warn(&i2c->dev, "Currently only JD1_1 / JD1_2 / JD2 are supported\n"); - break; - } - } - - INIT_DELAYED_WORK(&rt5651->jack_detect_work, rt5651_jack_detect_work); - - if (i2c->irq) { - ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, - rt5651_irq, - IRQF_TRIGGER_RISING | - IRQF_TRIGGER_FALLING | - IRQF_ONESHOT, "rt5651", rt5651); - if (ret) { - dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret); - return ret; - } - } + INIT_WORK(&rt5651->jack_detect_work, rt5651_jack_detect_work); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5651, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5651, rt5651_dai, ARRAY_SIZE(rt5651_dai)); return ret; @@ -1989,8 +2047,7 @@ static int rt5651_i2c_remove(struct i2c_client *i2c) { struct rt5651_priv *rt5651 = i2c_get_clientdata(i2c); - cancel_delayed_work_sync(&rt5651->jack_detect_work); - snd_soc_unregister_codec(&i2c->dev); + cancel_work_sync(&rt5651->jack_detect_work); return 0; } diff --git a/sound/soc/codecs/rt5651.h b/sound/soc/codecs/rt5651.h index 4f8b202121d7..3a0968c53fde 100644 --- a/sound/soc/codecs/rt5651.h +++ b/sound/soc/codecs/rt5651.h @@ -12,7 +12,7 @@ #ifndef __RT5651_H__ #define __RT5651_H__ -#include <sound/rt5651.h> +#include <dt-bindings/sound/rt5651.h> /* Info */ #define RT5651_RESET 0x00 @@ -138,6 +138,7 @@ /* Index of Codec Private Register definition */ #define RT5651_BIAS_CUR1 0x12 #define RT5651_BIAS_CUR3 0x14 +#define RT5651_BIAS_CUR4 0x15 #define RT5651_CLSD_INT_REG1 0x1c #define RT5651_CHPUMP_INT_REG1 0x24 #define RT5651_MAMP_INT_REG2 0x37 @@ -1966,6 +1967,15 @@ #define RT5651_D_GATE_EN_SFT 0 /* Codec Private Register definition */ + +/* MIC Over current threshold scale factor (0x15) */ +#define RT5651_MIC_OVCD_SF_MASK (0x3 << 8) +#define RT5651_MIC_OVCD_SF_SFT 8 +#define RT5651_MIC_OVCD_SF_0P5 (0x0 << 8) +#define RT5651_MIC_OVCD_SF_0P75 (0x1 << 8) +#define RT5651_MIC_OVCD_SF_1P0 (0x2 << 8) +#define RT5651_MIC_OVCD_SF_1P5 (0x3 << 8) + /* 3D Speaker Control (0x63) */ #define RT5651_3D_SPK_MASK (0x1 << 15) #define RT5651_3D_SPK_SFT 15 @@ -2059,12 +2069,15 @@ struct rt5651_pll_code { }; struct rt5651_priv { - struct snd_soc_codec *codec; - struct rt5651_platform_data pdata; + struct snd_soc_component *component; struct regmap *regmap; struct snd_soc_jack *hp_jack; - struct delayed_work jack_detect_work; + struct work_struct jack_detect_work; + unsigned int jd_src; + unsigned int ovcd_th; + unsigned int ovcd_sf; + int irq; int sysclk; int sysclk_src; int lrck[RT5651_AIFS]; @@ -2079,6 +2092,4 @@ struct rt5651_priv { bool hp_mute; }; -int rt5651_set_jack_detect(struct snd_soc_codec *codec, - struct snd_soc_jack *hp_jack); #endif /* __RT5651_H__ */ diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c index 07e7757417bc..1c1a521c73cb 100644 --- a/sound/soc/codecs/rt5659.c +++ b/sound/soc/codecs/rt5659.c @@ -1238,26 +1238,26 @@ static SOC_VALUE_ENUM_SINGLE_DECL( static int rt5659_hp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int ret = snd_soc_put_volsw(kcontrol, ucontrol); - if (snd_soc_read(codec, RT5659_STO_NG2_CTRL_1) & RT5659_NG2_EN) { - snd_soc_update_bits(codec, RT5659_STO_NG2_CTRL_1, + if (snd_soc_component_read32(component, RT5659_STO_NG2_CTRL_1) & RT5659_NG2_EN) { + snd_soc_component_update_bits(component, RT5659_STO_NG2_CTRL_1, RT5659_NG2_EN_MASK, RT5659_NG2_DIS); - snd_soc_update_bits(codec, RT5659_STO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5659_STO_NG2_CTRL_1, RT5659_NG2_EN_MASK, RT5659_NG2_EN); } return ret; } -static void rt5659_enable_push_button_irq(struct snd_soc_codec *codec, +static void rt5659_enable_push_button_irq(struct snd_soc_component *component, bool enable) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (enable) { - snd_soc_write(codec, RT5659_4BTN_IL_CMD_1, 0x000b); + snd_soc_component_write(component, RT5659_4BTN_IL_CMD_1, 0x000b); /* MICBIAS1 and Mic Det Power for button detect*/ snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); @@ -1265,19 +1265,19 @@ static void rt5659_enable_push_button_irq(struct snd_soc_codec *codec, "Mic Det Power"); snd_soc_dapm_sync(dapm); - snd_soc_update_bits(codec, RT5659_PWR_ANLG_2, + snd_soc_component_update_bits(component, RT5659_PWR_ANLG_2, RT5659_PWR_MB1, RT5659_PWR_MB1); - snd_soc_update_bits(codec, RT5659_PWR_VOL, + snd_soc_component_update_bits(component, RT5659_PWR_VOL, RT5659_PWR_MIC_DET, RT5659_PWR_MIC_DET); - snd_soc_update_bits(codec, RT5659_IRQ_CTRL_2, + snd_soc_component_update_bits(component, RT5659_IRQ_CTRL_2, RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_EN); - snd_soc_update_bits(codec, RT5659_4BTN_IL_CMD_2, + snd_soc_component_update_bits(component, RT5659_4BTN_IL_CMD_2, RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_EN); } else { - snd_soc_update_bits(codec, RT5659_4BTN_IL_CMD_2, + snd_soc_component_update_bits(component, RT5659_4BTN_IL_CMD_2, RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_DIS); - snd_soc_update_bits(codec, RT5659_IRQ_CTRL_2, + snd_soc_component_update_bits(component, RT5659_IRQ_CTRL_2, RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_DIS); /* MICBIAS1 and Mic Det Power for button detect*/ snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); @@ -1288,7 +1288,7 @@ static void rt5659_enable_push_button_irq(struct snd_soc_codec *codec, /** * rt5659_headset_detect - Detect headset. - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @jack_insert: Jack insert or not. * * Detect whether is headset or not when jack inserted. @@ -1296,37 +1296,37 @@ static void rt5659_enable_push_button_irq(struct snd_soc_codec *codec, * Returns detect status. */ -static int rt5659_headset_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5659_headset_detect(struct snd_soc_component *component, int jack_insert) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30}; int reg_63; - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); if (jack_insert) { snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); - reg_63 = snd_soc_read(codec, RT5659_PWR_ANLG_1); + reg_63 = snd_soc_component_read32(component, RT5659_PWR_ANLG_1); - snd_soc_update_bits(codec, RT5659_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5659_PWR_ANLG_1, RT5659_PWR_VREF2 | RT5659_PWR_MB, RT5659_PWR_VREF2 | RT5659_PWR_MB); msleep(20); - snd_soc_update_bits(codec, RT5659_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5659_PWR_ANLG_1, RT5659_PWR_FV2, RT5659_PWR_FV2); - snd_soc_write(codec, RT5659_EJD_CTRL_2, 0x4160); - snd_soc_update_bits(codec, RT5659_EJD_CTRL_1, + snd_soc_component_write(component, RT5659_EJD_CTRL_2, 0x4160); + snd_soc_component_update_bits(component, RT5659_EJD_CTRL_1, 0x20, 0x0); msleep(20); - snd_soc_update_bits(codec, RT5659_EJD_CTRL_1, + snd_soc_component_update_bits(component, RT5659_EJD_CTRL_1, 0x20, 0x20); while (i < 5) { msleep(sleep_time[i]); - val = snd_soc_read(codec, RT5659_EJD_CTRL_2) & 0x0003; + val = snd_soc_component_read32(component, RT5659_EJD_CTRL_2) & 0x0003; i++; if (val == 0x1 || val == 0x2 || val == 0x3) break; @@ -1335,10 +1335,10 @@ static int rt5659_headset_detect(struct snd_soc_codec *codec, int jack_insert) switch (val) { case 1: rt5659->jack_type = SND_JACK_HEADSET; - rt5659_enable_push_button_irq(codec, true); + rt5659_enable_push_button_irq(component, true); break; default: - snd_soc_write(codec, RT5659_PWR_ANLG_1, reg_63); + snd_soc_component_write(component, RT5659_PWR_ANLG_1, reg_63); rt5659->jack_type = SND_JACK_HEADPHONE; snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); @@ -1348,21 +1348,21 @@ static int rt5659_headset_detect(struct snd_soc_codec *codec, int jack_insert) snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); if (rt5659->jack_type == SND_JACK_HEADSET) - rt5659_enable_push_button_irq(codec, false); + rt5659_enable_push_button_irq(component, false); rt5659->jack_type = 0; } - dev_dbg(codec->dev, "jack_type = %d\n", rt5659->jack_type); + dev_dbg(component->dev, "jack_type = %d\n", rt5659->jack_type); return rt5659->jack_type; } -static int rt5659_button_detect(struct snd_soc_codec *codec) +static int rt5659_button_detect(struct snd_soc_component *component) { int btn_type, val; - val = snd_soc_read(codec, RT5659_4BTN_IL_CMD_1); + val = snd_soc_component_read32(component, RT5659_4BTN_IL_CMD_1); btn_type = val & 0xfff0; - snd_soc_write(codec, RT5659_4BTN_IL_CMD_1, val); + snd_soc_component_write(component, RT5659_4BTN_IL_CMD_1, val); return btn_type; } @@ -1377,10 +1377,10 @@ static irqreturn_t rt5659_irq(int irq, void *data) return IRQ_HANDLED; } -int rt5659_set_jack_detect(struct snd_soc_codec *codec, +int rt5659_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hs_jack) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); rt5659->hs_jack = hs_jack; @@ -1396,19 +1396,19 @@ static void rt5659_jack_detect_work(struct work_struct *work) container_of(work, struct rt5659_priv, jack_detect_work.work); int val, btn_type, report = 0; - if (!rt5659->codec) + if (!rt5659->component) return; - val = snd_soc_read(rt5659->codec, RT5659_INT_ST_1) & 0x0080; + val = snd_soc_component_read32(rt5659->component, RT5659_INT_ST_1) & 0x0080; if (!val) { /* jack in */ if (rt5659->jack_type == 0) { /* jack was out, report jack type */ - report = rt5659_headset_detect(rt5659->codec, 1); + report = rt5659_headset_detect(rt5659->component, 1); } else { /* jack is already in, report button event */ report = SND_JACK_HEADSET; - btn_type = rt5659_button_detect(rt5659->codec); + btn_type = rt5659_button_detect(rt5659->component); /** * rt5659 can report three kinds of button behavior, * one click, double click and hold. However, @@ -1441,7 +1441,7 @@ static void rt5659_jack_detect_work(struct work_struct *work) break; default: btn_type = 0; - dev_err(rt5659->codec->dev, + dev_err(rt5659->component->dev, "Unexpected button code 0x%04x\n", btn_type); break; @@ -1453,7 +1453,7 @@ static void rt5659_jack_detect_work(struct work_struct *work) } } else { /* jack out */ - report = rt5659_headset_detect(rt5659->codec, 0); + report = rt5659_headset_detect(rt5659->component, 0); } snd_soc_jack_report(rt5659->hs_jack, report, SND_JACK_HEADSET | @@ -1461,6 +1461,61 @@ static void rt5659_jack_detect_work(struct work_struct *work) SND_JACK_BTN_2 | SND_JACK_BTN_3); } +static void rt5659_jack_detect_intel_hd_header(struct work_struct *work) +{ + struct rt5659_priv *rt5659 = + container_of(work, struct rt5659_priv, jack_detect_work.work); + unsigned int value; + bool hp_flag, mic_flag; + + if (!rt5659->hs_jack) + return; + + /* headphone jack */ + regmap_read(rt5659->regmap, RT5659_GPIO_STA, &value); + hp_flag = (!(value & 0x8)) ? true : false; + + if (hp_flag != rt5659->hda_hp_plugged) { + rt5659->hda_hp_plugged = hp_flag; + + if (hp_flag) { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1, + 0x10, 0x0); + rt5659->jack_type |= SND_JACK_HEADPHONE; + } else { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1, + 0x10, 0x10); + rt5659->jack_type = rt5659->jack_type & + (~SND_JACK_HEADPHONE); + } + + snd_soc_jack_report(rt5659->hs_jack, rt5659->jack_type, + SND_JACK_HEADPHONE); + } + + /* mic jack */ + regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value); + regmap_write(rt5659->regmap, RT5659_4BTN_IL_CMD_1, value); + mic_flag = (value & 0x2000) ? true : false; + + if (mic_flag != rt5659->hda_mic_plugged) { + rt5659->hda_mic_plugged = mic_flag; + if (mic_flag) { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2, + 0x2, 0x2); + rt5659->jack_type |= SND_JACK_MICROPHONE; + } else { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2, + 0x2, 0x0); + rt5659->jack_type = rt5659->jack_type + & (~SND_JACK_MICROPHONE); + } + + snd_soc_jack_report(rt5659->hs_jack, rt5659->jack_type, + SND_JACK_MICROPHONE); + } +} + static const struct snd_kcontrol_new rt5659_snd_controls[] = { /* Speaker Output Volume */ SOC_DOUBLE_TLV("Speaker Playback Volume", RT5659_SPO_VOL, @@ -1550,8 +1605,8 @@ static const struct snd_kcontrol_new rt5659_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); int pd, idx = -EINVAL; pd = rl6231_get_pre_div(rt5659->regmap, @@ -1559,29 +1614,55 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, idx = rl6231_calc_dmic_clk(rt5659->sysclk / pd); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else { - snd_soc_update_bits(codec, RT5659_DMIC_CTRL_1, + snd_soc_component_update_bits(component, RT5659_DMIC_CTRL_1, RT5659_DMIC_CLK_MASK, idx << RT5659_DMIC_CLK_SFT); } return idx; } -static int set_adc_clk(struct snd_soc_dapm_widget *w, +static int set_adc1_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5659_CHOP_ADC, - RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK, - RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK); + snd_soc_component_update_bits(component, RT5659_CHOP_ADC, + RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK, + RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5659_CHOP_ADC, - RT5659_CKXEN_ADCC_MASK | RT5659_CKGEN_ADCC_MASK, 0); + snd_soc_component_update_bits(component, RT5659_CHOP_ADC, + RT5659_CKXEN_ADC1_MASK | RT5659_CKGEN_ADC1_MASK, 0); + break; + + default: + return 0; + } + + return 0; + +} + +static int set_adc2_clk(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_component *component = + snd_soc_dapm_to_component(w->dapm); + + switch (event) { + case SND_SOC_DAPM_POST_PMU: + snd_soc_component_update_bits(component, RT5659_CHOP_ADC, + RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK, + RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK); + break; + + case SND_SOC_DAPM_PRE_PMD: + snd_soc_component_update_bits(component, RT5659_CHOP_ADC, + RT5659_CKXEN_ADC2_MASK | RT5659_CKGEN_ADC2_MASK, 0); break; default: @@ -1595,15 +1676,15 @@ static int set_adc_clk(struct snd_soc_dapm_widget *w, static int rt5659_charge_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: /* Depop */ - snd_soc_write(codec, RT5659_DEPOP_1, 0x0009); + snd_soc_component_write(component, RT5659_DEPOP_1, 0x0009); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, RT5659_HP_CHARGE_PUMP_1, 0x0c16); + snd_soc_component_write(component, RT5659_HP_CHARGE_PUMP_1, 0x0c16); break; default: return 0; @@ -1616,9 +1697,9 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - val = snd_soc_read(codec, RT5659_GLB_CLK); + val = snd_soc_component_read32(component, RT5659_GLB_CLK); val &= RT5659_SCLK_SRC_MASK; if (val == RT5659_SCLK_SRC_PLL1) return 1; @@ -1630,7 +1711,7 @@ static int is_using_asrc(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int reg, shift, val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (w->shift) { case RT5659_ADC_MONO_R_ASRC_SFT: @@ -1661,13 +1742,13 @@ static int is_using_asrc(struct snd_soc_dapm_widget *w, return 0; } - val = (snd_soc_read(codec, reg) >> shift) & 0xf; + val = (snd_soc_component_read32(component, reg) >> shift) & 0xf; switch (val) { case 1: case 2: case 3: /* I2S_Pre_Div1 should be 1 in asrc mode */ - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_I2S_PD1_MASK, RT5659_I2S_PD1_2); return 1; default: @@ -2303,24 +2384,24 @@ static const struct snd_kcontrol_new pdm_r_switch = static int rt5659_spk_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5659_CLASSD_CTRL_1, + snd_soc_component_update_bits(component, RT5659_CLASSD_CTRL_1, RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_EN); - snd_soc_update_bits(codec, RT5659_CLASSD_2, + snd_soc_component_update_bits(component, RT5659_CLASSD_2, RT5659_M_RI_DIG, RT5659_M_RI_DIG); - snd_soc_write(codec, RT5659_CLASSD_1, 0x0803); - snd_soc_write(codec, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000); + snd_soc_component_write(component, RT5659_CLASSD_1, 0x0803); + snd_soc_component_write(component, RT5659_SPK_DC_CAILB_CTRL_3, 0x0000); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, RT5659_CLASSD_1, 0x0011); - snd_soc_update_bits(codec, RT5659_CLASSD_2, + snd_soc_component_write(component, RT5659_CLASSD_1, 0x0011); + snd_soc_component_update_bits(component, RT5659_CLASSD_2, RT5659_M_RI_DIG, 0x0); - snd_soc_write(codec, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003); - snd_soc_update_bits(codec, RT5659_CLASSD_CTRL_1, + snd_soc_component_write(component, RT5659_SPK_DC_CAILB_CTRL_3, 0x0003); + snd_soc_component_update_bits(component, RT5659_CLASSD_CTRL_1, RT5659_POW_CLSD_DB_MASK, RT5659_POW_CLSD_DB_DIS); break; @@ -2335,15 +2416,15 @@ static int rt5659_spk_event(struct snd_soc_dapm_widget *w, static int rt5659_mono_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_write(codec, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00); + snd_soc_component_write(component, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e00); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04); + snd_soc_component_write(component, RT5659_MONO_AMP_CALIB_CTRL_1, 0x1e04); break; default: @@ -2357,16 +2438,16 @@ static int rt5659_mono_event(struct snd_soc_dapm_widget *w, static int rt5659_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, RT5659_HP_CHARGE_PUMP_1, 0x0e1e); - snd_soc_update_bits(codec, RT5659_DEPOP_1, 0x0010, 0x0010); + snd_soc_component_write(component, RT5659_HP_CHARGE_PUMP_1, 0x0e1e); + snd_soc_component_update_bits(component, RT5659_DEPOP_1, 0x0010, 0x0010); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, RT5659_DEPOP_1, 0x0000); + snd_soc_component_write(component, RT5659_DEPOP_1, 0x0000); break; default: @@ -2500,13 +2581,13 @@ static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = { RT5659_PWR_ADC_L1_BIT, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5659_PWR_DIG_1, RT5659_PWR_ADC_R1_BIT, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5659_PWR_DIG_2, + SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5659_PWR_DIG_1, RT5659_PWR_ADC_L2_BIT, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5659_PWR_DIG_2, + SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5659_PWR_DIG_1, RT5659_PWR_ADC_R2_BIT, 0, NULL, 0), - SND_SOC_DAPM_SUPPLY("ADC1 clock", SND_SOC_NOPM, 0, 0, set_adc_clk, + SND_SOC_DAPM_SUPPLY("ADC1 clock", SND_SOC_NOPM, 0, 0, set_adc1_clk, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), - SND_SOC_DAPM_SUPPLY("ADC2 clock", SND_SOC_NOPM, 0, 0, set_adc_clk, + SND_SOC_DAPM_SUPPLY("ADC2 clock", SND_SOC_NOPM, 0, 0, set_adc2_clk, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), /* ADC Mux */ @@ -2818,11 +2899,6 @@ static const struct snd_soc_dapm_route rt5659_dapm_routes[] = { { "I2S2", NULL, "I2S2 ASRC" }, { "I2S3", NULL, "I2S3 ASRC" }, - { "IN1P", NULL, "LDO2" }, - { "IN2P", NULL, "LDO2" }, - { "IN3P", NULL, "LDO2" }, - { "IN4P", NULL, "LDO2" }, - { "DMIC1", NULL, "DMIC L1" }, { "DMIC1", NULL, "DMIC R1" }, { "DMIC2", NULL, "DMIC L2" }, @@ -3237,21 +3313,21 @@ static const struct snd_soc_dapm_route rt5659_dapm_routes[] = { static int rt5659_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, frame_size; rt5659->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5659->sysclk, rt5659->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n", + dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", rt5659->lrck[dai->id], dai->id); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } @@ -3278,39 +3354,39 @@ static int rt5659_hw_params(struct snd_pcm_substream *substream, case RT5659_AIF1: mask_clk = RT5659_I2S_PD1_MASK; val_clk = pre_div << RT5659_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5659_I2S1_SDP, + snd_soc_component_update_bits(component, RT5659_I2S1_SDP, RT5659_I2S_DL_MASK, val_len); break; case RT5659_AIF2: mask_clk = RT5659_I2S_PD2_MASK; val_clk = pre_div << RT5659_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5659_I2S2_SDP, + snd_soc_component_update_bits(component, RT5659_I2S2_SDP, RT5659_I2S_DL_MASK, val_len); break; case RT5659_AIF3: mask_clk = RT5659_I2S_PD3_MASK; val_clk = pre_div << RT5659_I2S_PD3_SFT; - snd_soc_update_bits(codec, RT5659_I2S3_SDP, + snd_soc_component_update_bits(component, RT5659_I2S3_SDP, RT5659_I2S_DL_MASK, val_len); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, mask_clk, val_clk); switch (rt5659->lrck[dai->id]) { case 192000: - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_32); break; case 96000: - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_64); break; default: - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_DAC_OSR_MASK, RT5659_DAC_OSR_128); break; } @@ -3320,8 +3396,8 @@ static int rt5659_hw_params(struct snd_pcm_substream *substream, static int rt5659_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -3364,31 +3440,31 @@ static int rt5659_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (dai->id) { case RT5659_AIF1: - snd_soc_update_bits(codec, RT5659_I2S1_SDP, + snd_soc_component_update_bits(component, RT5659_I2S1_SDP, RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK | RT5659_I2S_DF_MASK, reg_val); break; case RT5659_AIF2: - snd_soc_update_bits(codec, RT5659_I2S2_SDP, + snd_soc_component_update_bits(component, RT5659_I2S2_SDP, RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK | RT5659_I2S_DF_MASK, reg_val); break; case RT5659_AIF3: - snd_soc_update_bits(codec, RT5659_I2S3_SDP, + snd_soc_component_update_bits(component, RT5659_I2S3_SDP, RT5659_I2S_MS_MASK | RT5659_I2S_BP_MASK | RT5659_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } return 0; } -static int rt5659_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, +static int rt5659_set_component_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5659->sysclk && clk_id == rt5659->sysclk_src) @@ -3405,25 +3481,25 @@ static int rt5659_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, reg_val |= RT5659_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_SCLK_SRC_MASK, reg_val); rt5659->sysclk = freq; rt5659->sysclk_src = clk_id; - dev_dbg(codec->dev, "Sysclk is %dHz and clock id is %d\n", + dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); return 0; } -static int rt5659_set_codec_pll(struct snd_soc_codec *codec, int pll_id, +static int rt5659_set_component_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -3432,50 +3508,50 @@ static int rt5659_set_codec_pll(struct snd_soc_codec *codec, int pll_id, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5659->pll_in = 0; rt5659->pll_out = 0; - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_SCLK_SRC_MASK, RT5659_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5659_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_MCLK); break; case RT5659_PLL1_S_BCLK1: - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK1); break; case RT5659_PLL1_S_BCLK2: - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK2); break; case RT5659_PLL1_S_BCLK3: - snd_soc_update_bits(codec, RT5659_GLB_CLK, + snd_soc_component_update_bits(component, RT5659_GLB_CLK, RT5659_PLL1_SRC_MASK, RT5659_PLL1_SRC_BCLK3); break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5659_PLL_CTRL_1, + snd_soc_component_write(component, RT5659_PLL_CTRL_1, pll_code.n_code << RT5659_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5659_PLL_CTRL_2, + snd_soc_component_write(component, RT5659_PLL_CTRL_2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5659_PLL_M_SFT | pll_code.m_bp << RT5659_PLL_M_BP_SFT); @@ -3489,7 +3565,7 @@ static int rt5659_set_codec_pll(struct snd_soc_codec *codec, int pll_id, static int rt5659_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; if (rx_mask || tx_mask) @@ -3533,29 +3609,29 @@ static int rt5659_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return -EINVAL; } - snd_soc_update_bits(codec, RT5659_TDM_CTRL_1, 0x8ff0, val); + snd_soc_component_update_bits(component, RT5659_TDM_CTRL_1, 0x8ff0, val); return 0; } static int rt5659_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); rt5659->bclk[dai->id] = ratio; if (ratio == 64) { switch (dai->id) { case RT5659_AIF2: - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_I2S_BCLK_MS2_MASK, RT5659_I2S_BCLK_MS2_64); break; case RT5659_AIF3: - snd_soc_update_bits(codec, RT5659_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5659_ADDA_CLK_1, RT5659_I2S_BCLK_MS3_MASK, RT5659_I2S_BCLK_MS3_64); break; @@ -3565,11 +3641,11 @@ static int rt5659_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) return 0; } -static int rt5659_set_bias_level(struct snd_soc_codec *codec, +static int rt5659_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -3591,7 +3667,7 @@ static int rt5659_set_bias_level(struct snd_soc_codec *codec, if (dapm->bias_level == SND_SOC_BIAS_OFF) { ret = clk_prepare_enable(rt5659->mclk); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "failed to enable MCLK: %d\n", ret); return ret; } @@ -3617,37 +3693,35 @@ static int rt5659_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5659_probe(struct snd_soc_codec *codec) +static int rt5659_probe(struct snd_soc_component *component) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); - rt5659->codec = codec; + rt5659->component = component; return 0; } -static int rt5659_remove(struct snd_soc_codec *codec) +static void rt5659_remove(struct snd_soc_component *component) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); regmap_write(rt5659->regmap, RT5659_RESET, 0); - - return 0; } #ifdef CONFIG_PM -static int rt5659_suspend(struct snd_soc_codec *codec) +static int rt5659_suspend(struct snd_soc_component *component) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5659->regmap, true); regcache_mark_dirty(rt5659->regmap); return 0; } -static int rt5659_resume(struct snd_soc_codec *codec) +static int rt5659_resume(struct snd_soc_component *component) { - struct rt5659_priv *rt5659 = snd_soc_codec_get_drvdata(codec); + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5659->regmap, false); regcache_sync(rt5659->regmap); @@ -3730,23 +3804,23 @@ static struct snd_soc_dai_driver rt5659_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5659 = { - .probe = rt5659_probe, - .remove = rt5659_remove, - .suspend = rt5659_suspend, - .resume = rt5659_resume, - .set_bias_level = rt5659_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5659_snd_controls, - .num_controls = ARRAY_SIZE(rt5659_snd_controls), - .dapm_widgets = rt5659_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5659_dapm_widgets), - .dapm_routes = rt5659_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5659_dapm_routes), - }, - .set_sysclk = rt5659_set_codec_sysclk, - .set_pll = rt5659_set_codec_pll, +static const struct snd_soc_component_driver soc_component_dev_rt5659 = { + .probe = rt5659_probe, + .remove = rt5659_remove, + .suspend = rt5659_suspend, + .resume = rt5659_resume, + .set_bias_level = rt5659_set_bias_level, + .controls = rt5659_snd_controls, + .num_controls = ARRAY_SIZE(rt5659_snd_controls), + .dapm_widgets = rt5659_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5659_dapm_widgets), + .dapm_routes = rt5659_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5659_dapm_routes), + .set_sysclk = rt5659_set_component_sysclk, + .set_pll = rt5659_set_component_pll, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; @@ -3849,7 +3923,7 @@ static void rt5659_calibrate(struct rt5659_priv *rt5659) break; if (count > 30) { - dev_err(rt5659->codec->dev, + dev_err(rt5659->component->dev, "HP Calibration 1 Failure\n"); return; } @@ -3874,7 +3948,7 @@ static void rt5659_calibrate(struct rt5659_priv *rt5659) break; if (count > 85) { - dev_err(rt5659->codec->dev, + dev_err(rt5659->component->dev, "HP Calibration 2 Failure\n"); return; } @@ -3922,7 +3996,7 @@ static void rt5659_calibrate(struct rt5659_priv *rt5659) break; if (count > 10) { - dev_err(rt5659->codec->dev, + dev_err(rt5659->component->dev, "SPK Calibration Failure\n"); return; } @@ -3955,7 +4029,7 @@ static void rt5659_calibrate(struct rt5659_priv *rt5659) break; if (count > 35) { - dev_err(rt5659->codec->dev, + dev_err(rt5659->component->dev, "Mono Calibration Failure\n"); return; } @@ -3990,6 +4064,54 @@ static void rt5659_calibrate(struct rt5659_priv *rt5659) regmap_write(rt5659->regmap, RT5659_HP_CHARGE_PUMP_1, 0x0c16); } +static void rt5659_intel_hd_header_probe_setup(struct rt5659_priv *rt5659) +{ + int value; + + regmap_read(rt5659->regmap, RT5659_GPIO_STA, &value); + if (!(value & 0x8)) { + rt5659->hda_hp_plugged = true; + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1, + 0x10, 0x0); + } else { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_1, + 0x10, 0x10); + } + + regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1, + RT5659_PWR_VREF2 | RT5659_PWR_MB, + RT5659_PWR_VREF2 | RT5659_PWR_MB); + msleep(20); + regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_1, + RT5659_PWR_FV2, RT5659_PWR_FV2); + + regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_3, RT5659_PWR_LDO2, + RT5659_PWR_LDO2); + regmap_update_bits(rt5659->regmap, RT5659_PWR_ANLG_2, RT5659_PWR_MB1, + RT5659_PWR_MB1); + regmap_update_bits(rt5659->regmap, RT5659_PWR_VOL, RT5659_PWR_MIC_DET, + RT5659_PWR_MIC_DET); + msleep(20); + + regmap_update_bits(rt5659->regmap, RT5659_4BTN_IL_CMD_2, + RT5659_4BTN_IL_MASK, RT5659_4BTN_IL_EN); + regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value); + regmap_write(rt5659->regmap, RT5659_4BTN_IL_CMD_1, value); + regmap_read(rt5659->regmap, RT5659_4BTN_IL_CMD_1, &value); + + if (value & 0x2000) { + rt5659->hda_mic_plugged = true; + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2, + 0x2, 0x2); + } else { + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2, + 0x2, 0x0); + } + + regmap_update_bits(rt5659->regmap, RT5659_IRQ_CTRL_2, + RT5659_IL_IRQ_MASK, RT5659_IL_IRQ_EN); +} + static int rt5659_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { @@ -4174,16 +4296,23 @@ static int rt5659_i2c_probe(struct i2c_client *i2c, RT5659_PWR_MB, RT5659_PWR_MB); regmap_write(rt5659->regmap, RT5659_PWR_ANLG_2, 0x0001); regmap_write(rt5659->regmap, RT5659_IRQ_CTRL_2, 0x0040); + INIT_DELAYED_WORK(&rt5659->jack_detect_work, + rt5659_jack_detect_work); break; - case RT5659_JD_NULL: + case RT5659_JD_HDA_HEADER: + regmap_write(rt5659->regmap, RT5659_GPIO_CTRL_3, 0x8000); + regmap_write(rt5659->regmap, RT5659_RC_CLK_CTRL, 0x0900); + regmap_write(rt5659->regmap, RT5659_EJD_CTRL_1, 0x70c0); + regmap_write(rt5659->regmap, RT5659_JD_CTRL_1, 0x2000); + regmap_write(rt5659->regmap, RT5659_IRQ_CTRL_1, 0x0040); + INIT_DELAYED_WORK(&rt5659->jack_detect_work, + rt5659_jack_detect_intel_hd_header); + rt5659_intel_hd_header_probe_setup(rt5659); break; default: - dev_warn(&i2c->dev, "Currently, support JD3 only\n"); break; } - INIT_DELAYED_WORK(&rt5659->jack_detect_work, rt5659_jack_detect_work); - if (i2c->irq) { ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5659_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING @@ -4196,17 +4325,11 @@ static int rt5659_i2c_probe(struct i2c_client *i2c, RT5659_GP1_PIN_MASK, RT5659_GP1_PIN_IRQ); } - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5659, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5659, rt5659_dai, ARRAY_SIZE(rt5659_dai)); } -static int rt5659_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static void rt5659_i2c_shutdown(struct i2c_client *client) { struct rt5659_priv *rt5659 = i2c_get_clientdata(client); @@ -4239,7 +4362,6 @@ static struct i2c_driver rt5659_i2c_driver = { .acpi_match_table = ACPI_PTR(rt5659_acpi_match), }, .probe = rt5659_i2c_probe, - .remove = rt5659_i2c_remove, .shutdown = rt5659_i2c_shutdown, .id_table = rt5659_i2c_id, }; diff --git a/sound/soc/codecs/rt5659.h b/sound/soc/codecs/rt5659.h index 8f1aeef08489..8b576d768744 100644 --- a/sound/soc/codecs/rt5659.h +++ b/sound/soc/codecs/rt5659.h @@ -1008,7 +1008,7 @@ #define RT5659_PWR_ADC_R1 (0x1 << 3) #define RT5659_PWR_ADC_R1_BIT 3 #define RT5659_PWR_ADC_L2 (0x1 << 2) -#define RT5659_PWR_ADC_L2_BIT 4 +#define RT5659_PWR_ADC_L2_BIT 2 #define RT5659_PWR_ADC_R2 (0x1 << 1) #define RT5659_PWR_ADC_R2_BIT 1 #define RT5659_PWR_CLS_D (0x1) @@ -1743,10 +1743,14 @@ #define RT5659_CKGEN_DAC2_SFT 4 /* Chopper and Clock control for ADC (0x013b)*/ -#define RT5659_CKXEN_ADCC_MASK (0x1 << 13) -#define RT5659_CKXEN_ADCC_SFT 13 -#define RT5659_CKGEN_ADCC_MASK (0x1 << 12) -#define RT5659_CKGEN_ADCC_SFT 12 +#define RT5659_CKXEN_ADC1_MASK (0x1 << 13) +#define RT5659_CKXEN_ADC1_SFT 13 +#define RT5659_CKGEN_ADC1_MASK (0x1 << 12) +#define RT5659_CKGEN_ADC1_SFT 12 +#define RT5659_CKXEN_ADC2_MASK (0x1 << 5) +#define RT5659_CKXEN_ADC2_SFT 5 +#define RT5659_CKGEN_ADC2_MASK (0x1 << 4) +#define RT5659_CKGEN_ADC2_SFT 4 /* Test Mode Control 1 (0x0145) */ #define RT5659_AD2DA_LB_MASK (0x1 << 9) @@ -1789,7 +1793,7 @@ struct rt5659_pll_code { }; struct rt5659_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5659_platform_data pdata; struct regmap *regmap; struct gpio_desc *gpiod_ldo1_en; @@ -1810,10 +1814,11 @@ struct rt5659_priv { int pll_out; int jack_type; - + bool hda_hp_plugged; + bool hda_mic_plugged; }; -int rt5659_set_jack_detect(struct snd_soc_codec *codec, +int rt5659_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hs_jack); #endif /* __RT5659_H__ */ diff --git a/sound/soc/codecs/rt5660.c b/sound/soc/codecs/rt5660.c index d22ef00e0d96..20a755137e63 100644 --- a/sound/soc/codecs/rt5660.c +++ b/sound/soc/codecs/rt5660.c @@ -354,17 +354,17 @@ static const struct snd_kcontrol_new rt5660_snd_controls[] = { static int rt5660_set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5660->sysclk / rl6231_get_pre_div(rt5660->regmap, RT5660_ADDA_CLK1, RT5660_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else - snd_soc_update_bits(codec, RT5660_DMIC_CTRL1, + snd_soc_component_update_bits(component, RT5660_DMIC_CTRL1, RT5660_DMIC_CLK_MASK, idx << RT5660_DMIC_CLK_SFT); return idx; @@ -373,10 +373,10 @@ static int rt5660_set_dmic_clk(struct snd_soc_dapm_widget *w, static int rt5660_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int val; - val = snd_soc_read(codec, RT5660_GLB_CLK); + val = snd_soc_component_read32(component, RT5660_GLB_CLK); val &= RT5660_SCLK_SRC_MASK; if (val == RT5660_SCLK_SRC_PLL1) return 1; @@ -541,17 +541,17 @@ static const struct snd_kcontrol_new rt5660_if1_adc_swap_mux = static int rt5660_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5660_LOUT_AMP_CTRL, + snd_soc_component_update_bits(component, RT5660_LOUT_AMP_CTRL, RT5660_LOUT_CO_MASK | RT5660_LOUT_CB_MASK, RT5660_LOUT_CO_EN | RT5660_LOUT_CB_PU); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5660_LOUT_AMP_CTRL, + snd_soc_component_update_bits(component, RT5660_LOUT_AMP_CTRL, RT5660_LOUT_CO_MASK | RT5660_LOUT_CB_MASK, RT5660_LOUT_CO_DIS | RT5660_LOUT_CB_PD); break; @@ -838,22 +838,22 @@ static const struct snd_soc_dapm_route rt5660_dapm_routes[] = { static int rt5660_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, bclk_ms, frame_size; rt5660->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5660->sysclk, rt5660->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n", + dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", rt5660->lrck[dai->id], dai->id); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return frame_size; } @@ -890,13 +890,13 @@ static int rt5660_hw_params(struct snd_pcm_substream *substream, mask_clk = RT5660_I2S_BCLK_MS1_MASK | RT5660_I2S_PD1_MASK; val_clk = bclk_ms << RT5660_I2S_BCLK_MS1_SFT | pre_div << RT5660_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5660_I2S1_SDP, RT5660_I2S_DL_MASK, + snd_soc_component_update_bits(component, RT5660_I2S1_SDP, RT5660_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5660_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5660_ADDA_CLK1, mask_clk, val_clk); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } @@ -905,8 +905,8 @@ static int rt5660_hw_params(struct snd_pcm_substream *substream, static int rt5660_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -957,13 +957,13 @@ static int rt5660_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (dai->id) { case RT5660_AIF1: - snd_soc_update_bits(codec, RT5660_I2S1_SDP, + snd_soc_component_update_bits(component, RT5660_I2S1_SDP, RT5660_I2S_MS_MASK | RT5660_I2S_BP_MASK | RT5660_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } @@ -973,8 +973,8 @@ static int rt5660_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5660_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5660->sysclk && clk_id == rt5660->sysclk_src) @@ -994,11 +994,11 @@ static int rt5660_set_dai_sysclk(struct snd_soc_dai *dai, break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5660_GLB_CLK, RT5660_SCLK_SRC_MASK, + snd_soc_component_update_bits(component, RT5660_GLB_CLK, RT5660_SCLK_SRC_MASK, reg_val); rt5660->sysclk = freq; @@ -1012,8 +1012,8 @@ static int rt5660_set_dai_sysclk(struct snd_soc_dai *dai, static int rt5660_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -1022,44 +1022,44 @@ static int rt5660_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5660->pll_in = 0; rt5660->pll_out = 0; - snd_soc_update_bits(codec, RT5660_GLB_CLK, + snd_soc_component_update_bits(component, RT5660_GLB_CLK, RT5660_SCLK_SRC_MASK, RT5660_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5660_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5660_GLB_CLK, + snd_soc_component_update_bits(component, RT5660_GLB_CLK, RT5660_PLL1_SRC_MASK, RT5660_PLL1_SRC_MCLK); break; case RT5660_PLL1_S_BCLK: - snd_soc_update_bits(codec, RT5660_GLB_CLK, + snd_soc_component_update_bits(component, RT5660_GLB_CLK, RT5660_PLL1_SRC_MASK, RT5660_PLL1_SRC_BCLK1); break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5660_PLL_CTRL1, + snd_soc_component_write(component, RT5660_PLL_CTRL1, pll_code.n_code << RT5660_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5660_PLL_CTRL2, + snd_soc_component_write(component, RT5660_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5660_PLL_M_SFT | pll_code.m_bp << RT5660_PLL_M_BP_SFT); @@ -1070,10 +1070,10 @@ static int rt5660_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; } -static int rt5660_set_bias_level(struct snd_soc_codec *codec, +static int rt5660_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -1081,13 +1081,13 @@ static int rt5660_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, RT5660_GEN_CTRL1, + snd_soc_component_update_bits(component, RT5660_GEN_CTRL1, RT5660_DIG_GATE_CTRL, RT5660_DIG_GATE_CTRL); if (IS_ERR(rt5660->mclk)) break; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_ON) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_ON) { clk_disable_unprepare(rt5660->mclk); } else { ret = clk_prepare_enable(rt5660->mclk); @@ -1097,21 +1097,21 @@ static int rt5660_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - snd_soc_update_bits(codec, RT5660_PWR_ANLG1, + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + snd_soc_component_update_bits(component, RT5660_PWR_ANLG1, RT5660_PWR_VREF1 | RT5660_PWR_MB | RT5660_PWR_BG | RT5660_PWR_VREF2, RT5660_PWR_VREF1 | RT5660_PWR_MB | RT5660_PWR_BG | RT5660_PWR_VREF2); usleep_range(10000, 15000); - snd_soc_update_bits(codec, RT5660_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5660_PWR_ANLG1, RT5660_PWR_FV1 | RT5660_PWR_FV2, RT5660_PWR_FV1 | RT5660_PWR_FV2); } break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, RT5660_GEN_CTRL1, + snd_soc_component_update_bits(component, RT5660_GEN_CTRL1, RT5660_DIG_GATE_CTRL, 0); break; @@ -1122,24 +1122,24 @@ static int rt5660_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5660_probe(struct snd_soc_codec *codec) +static int rt5660_probe(struct snd_soc_component *component) { - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); - rt5660->codec = codec; + rt5660->component = component; return 0; } -static int rt5660_remove(struct snd_soc_codec *codec) +static void rt5660_remove(struct snd_soc_component *component) { - return snd_soc_write(codec, RT5660_RESET, 0); + snd_soc_component_write(component, RT5660_RESET, 0); } #ifdef CONFIG_PM -static int rt5660_suspend(struct snd_soc_codec *codec) +static int rt5660_suspend(struct snd_soc_component *component) { - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5660->regmap, true); regcache_mark_dirty(rt5660->regmap); @@ -1147,9 +1147,9 @@ static int rt5660_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5660_resume(struct snd_soc_codec *codec) +static int rt5660_resume(struct snd_soc_component *component) { - struct rt5660_priv *rt5660 = snd_soc_codec_get_drvdata(codec); + struct rt5660_priv *rt5660 = snd_soc_component_get_drvdata(component); if (rt5660->pdata.poweroff_codec_in_suspend) msleep(350); @@ -1197,21 +1197,21 @@ static struct snd_soc_dai_driver rt5660_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5660 = { - .probe = rt5660_probe, - .remove = rt5660_remove, - .suspend = rt5660_suspend, - .resume = rt5660_resume, - .set_bias_level = rt5660_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5660_snd_controls, - .num_controls = ARRAY_SIZE(rt5660_snd_controls), - .dapm_widgets = rt5660_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5660_dapm_widgets), - .dapm_routes = rt5660_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5660_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5660 = { + .probe = rt5660_probe, + .remove = rt5660_remove, + .suspend = rt5660_suspend, + .resume = rt5660_resume, + .set_bias_level = rt5660_set_bias_level, + .controls = rt5660_snd_controls, + .num_controls = ARRAY_SIZE(rt5660_snd_controls), + .dapm_widgets = rt5660_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5660_dapm_widgets), + .dapm_routes = rt5660_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5660_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5660_regmap = { @@ -1329,17 +1329,11 @@ static int rt5660_i2c_probe(struct i2c_client *i2c, RT5660_SEL_DMIC_DATA_IN1P); } - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5660, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5660, rt5660_dai, ARRAY_SIZE(rt5660_dai)); } -static int rt5660_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static struct i2c_driver rt5660_i2c_driver = { .driver = { .name = "rt5660", @@ -1347,7 +1341,6 @@ static struct i2c_driver rt5660_i2c_driver = { .of_match_table = of_match_ptr(rt5660_of_match), }, .probe = rt5660_i2c_probe, - .remove = rt5660_i2c_remove, .id_table = rt5660_i2c_id, }; module_i2c_driver(rt5660_i2c_driver); diff --git a/sound/soc/codecs/rt5660.h b/sound/soc/codecs/rt5660.h index bba18fb66b6f..c65de0a20a49 100644 --- a/sound/soc/codecs/rt5660.h +++ b/sound/soc/codecs/rt5660.h @@ -831,7 +831,7 @@ enum { }; struct rt5660_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5660_platform_data pdata; struct regmap *regmap; struct clk *mclk; diff --git a/sound/soc/codecs/rt5663.c b/sound/soc/codecs/rt5663.c index d329bf719d80..20c0aeea6ca3 100644 --- a/sound/soc/codecs/rt5663.c +++ b/sound/soc/codecs/rt5663.c @@ -49,7 +49,7 @@ struct impedance_mapping_table { }; struct rt5663_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5663_platform_data pdata; struct regmap *regmap; struct delayed_work jack_detect_work, jd_unplug_work; @@ -1384,57 +1384,57 @@ static const char * const rt5663_if1_adc_data_select[] = { static SOC_ENUM_SINGLE_DECL(rt5663_if1_adc_enum, RT5663_TDM_2, RT5663_DATA_SWAP_ADCDAT1_SHIFT, rt5663_if1_adc_data_select); -static void rt5663_enable_push_button_irq(struct snd_soc_codec *codec, +static void rt5663_enable_push_button_irq(struct snd_soc_component *component, bool enable) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); if (enable) { - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_EN); /* reset in-line command */ - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_RESET_4BTN_INL_MASK, RT5663_RESET_4BTN_INL_RESET); - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_RESET_4BTN_INL_MASK, RT5663_RESET_4BTN_INL_NOR); switch (rt5663->codec_ver) { case CODEC_VER_1: - snd_soc_update_bits(codec, RT5663_IRQ_3, + snd_soc_component_update_bits(component, RT5663_IRQ_3, RT5663_V2_EN_IRQ_INLINE_MASK, RT5663_V2_EN_IRQ_INLINE_NOR); break; case CODEC_VER_0: - snd_soc_update_bits(codec, RT5663_IRQ_2, + snd_soc_component_update_bits(component, RT5663_IRQ_2, RT5663_EN_IRQ_INLINE_MASK, RT5663_EN_IRQ_INLINE_NOR); break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } } else { switch (rt5663->codec_ver) { case CODEC_VER_1: - snd_soc_update_bits(codec, RT5663_IRQ_3, + snd_soc_component_update_bits(component, RT5663_IRQ_3, RT5663_V2_EN_IRQ_INLINE_MASK, RT5663_V2_EN_IRQ_INLINE_BYP); break; case CODEC_VER_0: - snd_soc_update_bits(codec, RT5663_IRQ_2, + snd_soc_component_update_bits(component, RT5663_IRQ_2, RT5663_EN_IRQ_INLINE_MASK, RT5663_EN_IRQ_INLINE_BYP); break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_DIS); /* reset in-line command */ - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_RESET_4BTN_INL_MASK, RT5663_RESET_4BTN_INL_RESET); - snd_soc_update_bits(codec, RT5663_IL_CMD_6, + snd_soc_component_update_bits(component, RT5663_IL_CMD_6, RT5663_RESET_4BTN_INL_MASK, RT5663_RESET_4BTN_INL_NOR); } @@ -1442,7 +1442,7 @@ static void rt5663_enable_push_button_irq(struct snd_soc_codec *codec, /** * rt5663_v2_jack_detect - Detect headset. - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @jack_insert: Jack insert or not. * * Detect whether is headset or not when jack inserted. @@ -1450,41 +1450,41 @@ static void rt5663_enable_push_button_irq(struct snd_soc_codec *codec, * Returns detect status. */ -static int rt5663_v2_jack_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5663_v2_jack_detect(struct snd_soc_component *component, int jack_insert) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30}; - dev_dbg(codec->dev, "%s jack_insert:%d\n", __func__, jack_insert); + dev_dbg(component->dev, "%s jack_insert:%d\n", __func__, jack_insert); if (jack_insert) { - snd_soc_write(codec, RT5663_CBJ_TYPE_2, 0x8040); - snd_soc_write(codec, RT5663_CBJ_TYPE_3, 0x1484); + snd_soc_component_write(component, RT5663_CBJ_TYPE_2, 0x8040); + snd_soc_component_write(component, RT5663_CBJ_TYPE_3, 0x1484); snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); snd_soc_dapm_force_enable_pin(dapm, "MICBIAS2"); snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power"); snd_soc_dapm_force_enable_pin(dapm, "CBJ Power"); snd_soc_dapm_sync(dapm); - snd_soc_update_bits(codec, RT5663_RC_CLK, + snd_soc_component_update_bits(component, RT5663_RC_CLK, RT5663_DIG_1M_CLK_MASK, RT5663_DIG_1M_CLK_EN); - snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x8); + snd_soc_component_update_bits(component, RT5663_RECMIX, 0x8, 0x8); while (i < 5) { msleep(sleep_time[i]); - val = snd_soc_read(codec, RT5663_CBJ_TYPE_2) & 0x0003; + val = snd_soc_component_read32(component, RT5663_CBJ_TYPE_2) & 0x0003; if (val == 0x1 || val == 0x2 || val == 0x3) break; - dev_dbg(codec->dev, "%s: MX-0011 val=%x sleep %d\n", + dev_dbg(component->dev, "%s: MX-0011 val=%x sleep %d\n", __func__, val, sleep_time[i]); i++; } - dev_dbg(codec->dev, "%s val = %d\n", __func__, val); + dev_dbg(component->dev, "%s val = %d\n", __func__, val); switch (val) { case 1: case 2: rt5663->jack_type = SND_JACK_HEADSET; - rt5663_enable_push_button_irq(codec, true); + rt5663_enable_push_button_irq(component, true); break; default: snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); @@ -1496,10 +1496,10 @@ static int rt5663_v2_jack_detect(struct snd_soc_codec *codec, int jack_insert) break; } } else { - snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x0); + snd_soc_component_update_bits(component, RT5663_RECMIX, 0x8, 0x0); if (rt5663->jack_type == SND_JACK_HEADSET) { - rt5663_enable_push_button_irq(codec, false); + rt5663_enable_push_button_irq(component, false); snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); snd_soc_dapm_disable_pin(dapm, "MICBIAS2"); snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); @@ -1509,60 +1509,60 @@ static int rt5663_v2_jack_detect(struct snd_soc_codec *codec, int jack_insert) rt5663->jack_type = 0; } - dev_dbg(codec->dev, "jack_type = %d\n", rt5663->jack_type); + dev_dbg(component->dev, "jack_type = %d\n", rt5663->jack_type); return rt5663->jack_type; } /** * rt5663_jack_detect - Detect headset. - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @jack_insert: Jack insert or not. * * Detect whether is headset or not when jack inserted. * * Returns detect status. */ -static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5663_jack_detect(struct snd_soc_component *component, int jack_insert) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); int val, i = 0; - dev_dbg(codec->dev, "%s jack_insert:%d\n", __func__, jack_insert); + dev_dbg(component->dev, "%s jack_insert:%d\n", __func__, jack_insert); if (jack_insert) { - snd_soc_update_bits(codec, RT5663_DIG_MISC, + snd_soc_component_update_bits(component, RT5663_DIG_MISC, RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN); - snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, RT5663_SI_HP_MASK | RT5663_OSW_HP_L_MASK | RT5663_OSW_HP_R_MASK, RT5663_SI_HP_EN | RT5663_OSW_HP_L_DIS | RT5663_OSW_HP_R_DIS); - snd_soc_update_bits(codec, RT5663_DUMMY_1, + snd_soc_component_update_bits(component, RT5663_DUMMY_1, RT5663_EMB_CLK_MASK | RT5663_HPA_CPL_BIAS_MASK | RT5663_HPA_CPR_BIAS_MASK, RT5663_EMB_CLK_EN | RT5663_HPA_CPL_BIAS_1 | RT5663_HPA_CPR_BIAS_1); - snd_soc_update_bits(codec, RT5663_CBJ_1, + snd_soc_component_update_bits(component, RT5663_CBJ_1, RT5663_INBUF_CBJ_BST1_MASK | RT5663_CBJ_SENSE_BST1_MASK, RT5663_INBUF_CBJ_BST1_ON | RT5663_CBJ_SENSE_BST1_L); - snd_soc_update_bits(codec, RT5663_IL_CMD_2, + snd_soc_component_update_bits(component, RT5663_IL_CMD_2, RT5663_PWR_MIC_DET_MASK, RT5663_PWR_MIC_DET_ON); /* BST1 power on for JD */ - snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, RT5663_PWR_BST1_MASK, RT5663_PWR_BST1_ON); - snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, + snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, RT5663_CBJ_DET_MASK | RT5663_EXT_JD_MASK | RT5663_POL_EXT_JD_MASK, RT5663_CBJ_DET_EN | RT5663_EXT_JD_EN | RT5663_POL_EXT_JD_EN); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_MB_MASK | RT5663_LDO1_DVO_MASK | RT5663_AMP_HP_MASK, RT5663_PWR_MB | RT5663_LDO1_DVO_0_9V | RT5663_AMP_HP_3X); - snd_soc_update_bits(codec, RT5663_AUTO_1MRC_CLK, + snd_soc_component_update_bits(component, RT5663_AUTO_1MRC_CLK, RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN); - snd_soc_update_bits(codec, RT5663_IRQ_1, + snd_soc_component_update_bits(component, RT5663_IRQ_1, RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); - snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, + snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, RT5663_EM_JD_MASK, RT5663_EM_JD_RST); - snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, + snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, RT5663_EM_JD_MASK, RT5663_EM_JD_NOR); while (true) { @@ -1577,10 +1577,10 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert) i++; } - val = snd_soc_read(codec, RT5663_EM_JACK_TYPE_2) & 0x0003; - dev_dbg(codec->dev, "%s val = %d\n", __func__, val); + val = snd_soc_component_read32(component, RT5663_EM_JACK_TYPE_2) & 0x0003; + dev_dbg(component->dev, "%s val = %d\n", __func__, val); - snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, RT5663_OSW_HP_L_MASK | RT5663_OSW_HP_R_MASK, RT5663_OSW_HP_L_EN | RT5663_OSW_HP_R_EN); @@ -1588,7 +1588,7 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert) case 1: case 2: rt5663->jack_type = SND_JACK_HEADSET; - rt5663_enable_push_button_irq(codec, true); + rt5663_enable_push_button_irq(component, true); if (rt5663->pdata.impedance_sensing_num) break; @@ -1636,17 +1636,17 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert) } } else { if (rt5663->jack_type == SND_JACK_HEADSET) - rt5663_enable_push_button_irq(codec, false); + rt5663_enable_push_button_irq(component, false); rt5663->jack_type = 0; } - dev_dbg(codec->dev, "jack_type = %d\n", rt5663->jack_type); + dev_dbg(component->dev, "jack_type = %d\n", rt5663->jack_type); return rt5663->jack_type; } -static int rt5663_impedance_sensing(struct snd_soc_codec *codec) +static int rt5663_impedance_sensing(struct snd_soc_component *component) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int value, i, reg84, reg26, reg2fa, reg91, reg10, reg80; for (i = 0; i < rt5663->pdata.impedance_sensing_num; i++) { @@ -1655,59 +1655,59 @@ static int rt5663_impedance_sensing(struct snd_soc_codec *codec) } if (rt5663->jack_type == SND_JACK_HEADSET) { - snd_soc_write(codec, RT5663_MIC_DECRO_2, + snd_soc_component_write(component, RT5663_MIC_DECRO_2, rt5663->imp_table[i].dc_offset_l_manual_mic >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_3, + snd_soc_component_write(component, RT5663_MIC_DECRO_3, rt5663->imp_table[i].dc_offset_l_manual_mic & 0xffff); - snd_soc_write(codec, RT5663_MIC_DECRO_5, + snd_soc_component_write(component, RT5663_MIC_DECRO_5, rt5663->imp_table[i].dc_offset_r_manual_mic >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_6, + snd_soc_component_write(component, RT5663_MIC_DECRO_6, rt5663->imp_table[i].dc_offset_r_manual_mic & 0xffff); } else { - snd_soc_write(codec, RT5663_MIC_DECRO_2, + snd_soc_component_write(component, RT5663_MIC_DECRO_2, rt5663->imp_table[i].dc_offset_l_manual >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_3, + snd_soc_component_write(component, RT5663_MIC_DECRO_3, rt5663->imp_table[i].dc_offset_l_manual & 0xffff); - snd_soc_write(codec, RT5663_MIC_DECRO_5, + snd_soc_component_write(component, RT5663_MIC_DECRO_5, rt5663->imp_table[i].dc_offset_r_manual >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_6, + snd_soc_component_write(component, RT5663_MIC_DECRO_6, rt5663->imp_table[i].dc_offset_r_manual & 0xffff); } - reg84 = snd_soc_read(codec, RT5663_ASRC_2); - reg26 = snd_soc_read(codec, RT5663_STO1_ADC_MIXER); - reg2fa = snd_soc_read(codec, RT5663_DUMMY_1); - reg91 = snd_soc_read(codec, RT5663_HP_CHARGE_PUMP_1); - reg10 = snd_soc_read(codec, RT5663_RECMIX); - reg80 = snd_soc_read(codec, RT5663_GLB_CLK); - - snd_soc_update_bits(codec, RT5663_STO_DRE_1, 0x8000, 0); - snd_soc_write(codec, RT5663_ASRC_2, 0); - snd_soc_write(codec, RT5663_STO1_ADC_MIXER, 0x4040); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + reg84 = snd_soc_component_read32(component, RT5663_ASRC_2); + reg26 = snd_soc_component_read32(component, RT5663_STO1_ADC_MIXER); + reg2fa = snd_soc_component_read32(component, RT5663_DUMMY_1); + reg91 = snd_soc_component_read32(component, RT5663_HP_CHARGE_PUMP_1); + reg10 = snd_soc_component_read32(component, RT5663_RECMIX); + reg80 = snd_soc_component_read32(component, RT5663_GLB_CLK); + + snd_soc_component_update_bits(component, RT5663_STO_DRE_1, 0x8000, 0); + snd_soc_component_write(component, RT5663_ASRC_2, 0); + snd_soc_component_write(component, RT5663_STO1_ADC_MIXER, 0x4040); + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, RT5663_PWR_VREF1 | RT5663_PWR_VREF2); usleep_range(10000, 10005); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, RT5663_PWR_FV1 | RT5663_PWR_FV2); - snd_soc_update_bits(codec, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, + snd_soc_component_update_bits(component, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, RT5663_SCLK_SRC_RCCLK); - snd_soc_update_bits(codec, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, + snd_soc_component_update_bits(component, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, RT5663_DIG_25M_CLK_EN); - snd_soc_update_bits(codec, RT5663_ADDA_CLK_1, RT5663_I2S_PD1_MASK, 0); - snd_soc_write(codec, RT5663_PRE_DIV_GATING_1, 0xff00); - snd_soc_write(codec, RT5663_PRE_DIV_GATING_2, 0xfffc); - snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_1, 0x1232); - snd_soc_write(codec, RT5663_HP_LOGIC_2, 0x0005); - snd_soc_write(codec, RT5663_DEPOP_2, 0x3003); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 0x0030); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0003, 0x0003); - snd_soc_update_bits(codec, RT5663_PWR_DIG_2, + snd_soc_component_update_bits(component, RT5663_ADDA_CLK_1, RT5663_I2S_PD1_MASK, 0); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0xff00); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0xfffc); + snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_1, 0x1232); + snd_soc_component_write(component, RT5663_HP_LOGIC_2, 0x0005); + snd_soc_component_write(component, RT5663_DEPOP_2, 0x3003); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0x0030); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0x0003); + snd_soc_component_update_bits(component, RT5663_PWR_DIG_2, RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F, RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F); - snd_soc_update_bits(codec, RT5663_PWR_DIG_1, + snd_soc_component_update_bits(component, RT5663_PWR_DIG_1, RT5663_PWR_DAC_L1 | RT5663_PWR_DAC_R1 | RT5663_PWR_LDO_DACREF_MASK | RT5663_PWR_ADC_L1 | RT5663_PWR_ADC_R1, @@ -1715,71 +1715,71 @@ static int rt5663_impedance_sensing(struct snd_soc_codec *codec) RT5663_PWR_LDO_DACREF_ON | RT5663_PWR_ADC_L1 | RT5663_PWR_ADC_R1); msleep(40); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2, RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2); msleep(30); - snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_2, 0x1371); - snd_soc_write(codec, RT5663_STO_DAC_MIXER, 0); - snd_soc_write(codec, RT5663_BYPASS_STO_DAC, 0x000c); - snd_soc_write(codec, RT5663_HP_BIAS, 0xafaa); - snd_soc_write(codec, RT5663_CHARGE_PUMP_1, 0x2224); - snd_soc_write(codec, RT5663_HP_OUT_EN, 0x8088); - snd_soc_write(codec, RT5663_CHOP_ADC, 0x3000); - snd_soc_write(codec, RT5663_ADDA_RST, 0xc000); - snd_soc_write(codec, RT5663_STO1_HPF_ADJ1, 0x3320); - snd_soc_write(codec, RT5663_HP_CALIB_2, 0x00c9); - snd_soc_write(codec, RT5663_DUMMY_1, 0x004c); - snd_soc_write(codec, RT5663_ANA_BIAS_CUR_1, 0x7733); - snd_soc_write(codec, RT5663_CHARGE_PUMP_2, 0x7777); - snd_soc_write(codec, RT5663_STO_DRE_9, 0x0007); - snd_soc_write(codec, RT5663_STO_DRE_10, 0x0007); - snd_soc_write(codec, RT5663_DUMMY_2, 0x02a4); - snd_soc_write(codec, RT5663_RECMIX, 0x0005); - snd_soc_write(codec, RT5663_HP_IMP_SEN_1, 0x4334); - snd_soc_update_bits(codec, RT5663_IRQ_3, 0x0004, 0x0004); - snd_soc_write(codec, RT5663_HP_LOGIC_1, 0x2200); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, 0x3000); - snd_soc_write(codec, RT5663_HP_LOGIC_1, 0x6200); + snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_2, 0x1371); + snd_soc_component_write(component, RT5663_STO_DAC_MIXER, 0); + snd_soc_component_write(component, RT5663_BYPASS_STO_DAC, 0x000c); + snd_soc_component_write(component, RT5663_HP_BIAS, 0xafaa); + snd_soc_component_write(component, RT5663_CHARGE_PUMP_1, 0x2224); + snd_soc_component_write(component, RT5663_HP_OUT_EN, 0x8088); + snd_soc_component_write(component, RT5663_CHOP_ADC, 0x3000); + snd_soc_component_write(component, RT5663_ADDA_RST, 0xc000); + snd_soc_component_write(component, RT5663_STO1_HPF_ADJ1, 0x3320); + snd_soc_component_write(component, RT5663_HP_CALIB_2, 0x00c9); + snd_soc_component_write(component, RT5663_DUMMY_1, 0x004c); + snd_soc_component_write(component, RT5663_ANA_BIAS_CUR_1, 0x7733); + snd_soc_component_write(component, RT5663_CHARGE_PUMP_2, 0x7777); + snd_soc_component_write(component, RT5663_STO_DRE_9, 0x0007); + snd_soc_component_write(component, RT5663_STO_DRE_10, 0x0007); + snd_soc_component_write(component, RT5663_DUMMY_2, 0x02a4); + snd_soc_component_write(component, RT5663_RECMIX, 0x0005); + snd_soc_component_write(component, RT5663_HP_IMP_SEN_1, 0x4334); + snd_soc_component_update_bits(component, RT5663_IRQ_3, 0x0004, 0x0004); + snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0x2200); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0x3000); + snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0x6200); for (i = 0; i < 100; i++) { msleep(20); - if (snd_soc_read(codec, RT5663_INT_ST_1) & 0x2) + if (snd_soc_component_read32(component, RT5663_INT_ST_1) & 0x2) break; } - value = snd_soc_read(codec, RT5663_HP_IMP_SEN_4); + value = snd_soc_component_read32(component, RT5663_HP_IMP_SEN_4); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, 0); - snd_soc_write(codec, RT5663_INT_ST_1, 0); - snd_soc_write(codec, RT5663_HP_LOGIC_1, 0); - snd_soc_update_bits(codec, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0); + snd_soc_component_write(component, RT5663_INT_ST_1, 0); + snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0); + snd_soc_component_update_bits(component, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, RT5663_DIG_25M_CLK_DIS); - snd_soc_write(codec, RT5663_GLB_CLK, reg80); - snd_soc_write(codec, RT5663_RECMIX, reg10); - snd_soc_write(codec, RT5663_DUMMY_2, 0x00a4); - snd_soc_write(codec, RT5663_DUMMY_1, reg2fa); - snd_soc_write(codec, RT5663_HP_CALIB_2, 0x00c8); - snd_soc_write(codec, RT5663_STO1_HPF_ADJ1, 0xb320); - snd_soc_write(codec, RT5663_ADDA_RST, 0xe400); - snd_soc_write(codec, RT5663_CHOP_ADC, 0x2000); - snd_soc_write(codec, RT5663_HP_OUT_EN, 0x0008); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, + snd_soc_component_write(component, RT5663_GLB_CLK, reg80); + snd_soc_component_write(component, RT5663_RECMIX, reg10); + snd_soc_component_write(component, RT5663_DUMMY_2, 0x00a4); + snd_soc_component_write(component, RT5663_DUMMY_1, reg2fa); + snd_soc_component_write(component, RT5663_HP_CALIB_2, 0x00c8); + snd_soc_component_write(component, RT5663_STO1_HPF_ADJ1, 0xb320); + snd_soc_component_write(component, RT5663_ADDA_RST, 0xe400); + snd_soc_component_write(component, RT5663_CHOP_ADC, 0x2000); + snd_soc_component_write(component, RT5663_HP_OUT_EN, 0x0008); + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2, 0); - snd_soc_update_bits(codec, RT5663_PWR_DIG_1, + snd_soc_component_update_bits(component, RT5663_PWR_DIG_1, RT5663_PWR_DAC_L1 | RT5663_PWR_DAC_R1 | RT5663_PWR_LDO_DACREF_MASK | RT5663_PWR_ADC_L1 | RT5663_PWR_ADC_R1, 0); - snd_soc_update_bits(codec, RT5663_PWR_DIG_2, + snd_soc_component_update_bits(component, RT5663_PWR_DIG_2, RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F, 0); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0003, 0); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 0); - snd_soc_write(codec, RT5663_HP_LOGIC_2, 0); - snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_1, reg91); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0); + snd_soc_component_write(component, RT5663_HP_LOGIC_2, 0); + snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_1, reg91); + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK, 0); - snd_soc_write(codec, RT5663_STO1_ADC_MIXER, reg26); - snd_soc_write(codec, RT5663_ASRC_2, reg84); + snd_soc_component_write(component, RT5663_STO1_ADC_MIXER, reg26); + snd_soc_component_write(component, RT5663_ASRC_2, reg84); for (i = 0; i < rt5663->pdata.impedance_sensing_num; i++) { if (value >= rt5663->imp_table[i].imp_min && @@ -1787,42 +1787,42 @@ static int rt5663_impedance_sensing(struct snd_soc_codec *codec) break; } - snd_soc_update_bits(codec, RT5663_STO_DRE_9, RT5663_DRE_GAIN_HP_MASK, + snd_soc_component_update_bits(component, RT5663_STO_DRE_9, RT5663_DRE_GAIN_HP_MASK, rt5663->imp_table[i].vol); - snd_soc_update_bits(codec, RT5663_STO_DRE_10, RT5663_DRE_GAIN_HP_MASK, + snd_soc_component_update_bits(component, RT5663_STO_DRE_10, RT5663_DRE_GAIN_HP_MASK, rt5663->imp_table[i].vol); if (rt5663->jack_type == SND_JACK_HEADSET) { - snd_soc_write(codec, RT5663_MIC_DECRO_2, + snd_soc_component_write(component, RT5663_MIC_DECRO_2, rt5663->imp_table[i].dc_offset_l_manual_mic >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_3, + snd_soc_component_write(component, RT5663_MIC_DECRO_3, rt5663->imp_table[i].dc_offset_l_manual_mic & 0xffff); - snd_soc_write(codec, RT5663_MIC_DECRO_5, + snd_soc_component_write(component, RT5663_MIC_DECRO_5, rt5663->imp_table[i].dc_offset_r_manual_mic >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_6, + snd_soc_component_write(component, RT5663_MIC_DECRO_6, rt5663->imp_table[i].dc_offset_r_manual_mic & 0xffff); } else { - snd_soc_write(codec, RT5663_MIC_DECRO_2, + snd_soc_component_write(component, RT5663_MIC_DECRO_2, rt5663->imp_table[i].dc_offset_l_manual >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_3, + snd_soc_component_write(component, RT5663_MIC_DECRO_3, rt5663->imp_table[i].dc_offset_l_manual & 0xffff); - snd_soc_write(codec, RT5663_MIC_DECRO_5, + snd_soc_component_write(component, RT5663_MIC_DECRO_5, rt5663->imp_table[i].dc_offset_r_manual >> 16); - snd_soc_write(codec, RT5663_MIC_DECRO_6, + snd_soc_component_write(component, RT5663_MIC_DECRO_6, rt5663->imp_table[i].dc_offset_r_manual & 0xffff); } return 0; } -static int rt5663_button_detect(struct snd_soc_codec *codec) +static int rt5663_button_detect(struct snd_soc_component *component) { int btn_type, val; - val = snd_soc_read(codec, RT5663_IL_CMD_5); - dev_dbg(codec->dev, "%s: val=0x%x\n", __func__, val); + val = snd_soc_component_read32(component, RT5663_IL_CMD_5); + dev_dbg(component->dev, "%s: val=0x%x\n", __func__, val); btn_type = val & 0xfff0; - snd_soc_write(codec, RT5663_IL_CMD_5, val); + snd_soc_component_write(component, RT5663_IL_CMD_5, val); return btn_type; } @@ -1840,10 +1840,10 @@ static irqreturn_t rt5663_irq(int irq, void *data) return IRQ_HANDLED; } -int rt5663_set_jack_detect(struct snd_soc_codec *codec, +int rt5663_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hs_jack) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); rt5663->hs_jack = hs_jack; @@ -1853,12 +1853,12 @@ int rt5663_set_jack_detect(struct snd_soc_codec *codec, } EXPORT_SYMBOL_GPL(rt5663_set_jack_detect); -static bool rt5663_check_jd_status(struct snd_soc_codec *codec) +static bool rt5663_check_jd_status(struct snd_soc_component *component) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); - int val = snd_soc_read(codec, RT5663_INT_ST_1); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); + int val = snd_soc_component_read32(component, RT5663_INT_ST_1); - dev_dbg(codec->dev, "%s val=%x\n", __func__, val); + dev_dbg(component->dev, "%s val=%x\n", __func__, val); /* JD1 */ switch (rt5663->codec_ver) { @@ -1867,7 +1867,7 @@ static bool rt5663_check_jd_status(struct snd_soc_codec *codec) case CODEC_VER_0: return !(val & 0x1000); default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } return false; @@ -1877,28 +1877,28 @@ static void rt5663_jack_detect_work(struct work_struct *work) { struct rt5663_priv *rt5663 = container_of(work, struct rt5663_priv, jack_detect_work.work); - struct snd_soc_codec *codec = rt5663->codec; + struct snd_soc_component *component = rt5663->component; int btn_type, report = 0; - if (!codec) + if (!component) return; - if (rt5663_check_jd_status(codec)) { + if (rt5663_check_jd_status(component)) { /* jack in */ if (rt5663->jack_type == 0) { /* jack was out, report jack type */ switch (rt5663->codec_ver) { case CODEC_VER_1: report = rt5663_v2_jack_detect( - rt5663->codec, 1); + rt5663->component, 1); break; case CODEC_VER_0: - report = rt5663_jack_detect(rt5663->codec, 1); + report = rt5663_jack_detect(rt5663->component, 1); if (rt5663->pdata.impedance_sensing_num) - rt5663_impedance_sensing(rt5663->codec); + rt5663_impedance_sensing(rt5663->component); break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } /* Delay the jack insert report to avoid pop noise */ @@ -1906,7 +1906,7 @@ static void rt5663_jack_detect_work(struct work_struct *work) } else { /* jack is already in, report button event */ report = SND_JACK_HEADSET; - btn_type = rt5663_button_detect(rt5663->codec); + btn_type = rt5663_button_detect(rt5663->component); /** * rt5663 can report three kinds of button behavior, * one click, double click and hold. However, @@ -1939,7 +1939,7 @@ static void rt5663_jack_detect_work(struct work_struct *work) break; default: btn_type = 0; - dev_err(rt5663->codec->dev, + dev_err(rt5663->component->dev, "Unexpected button code 0x%04x\n", btn_type); break; @@ -1959,16 +1959,16 @@ static void rt5663_jack_detect_work(struct work_struct *work) /* jack out */ switch (rt5663->codec_ver) { case CODEC_VER_1: - report = rt5663_v2_jack_detect(rt5663->codec, 0); + report = rt5663_v2_jack_detect(rt5663->component, 0); break; case CODEC_VER_0: - report = rt5663_jack_detect(rt5663->codec, 0); + report = rt5663_jack_detect(rt5663->component, 0); break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } } - dev_dbg(codec->dev, "%s jack report: 0x%04x\n", __func__, report); + dev_dbg(component->dev, "%s jack report: 0x%04x\n", __func__, report); snd_soc_jack_report(rt5663->hs_jack, report, SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3); @@ -1978,22 +1978,22 @@ static void rt5663_jd_unplug_work(struct work_struct *work) { struct rt5663_priv *rt5663 = container_of(work, struct rt5663_priv, jd_unplug_work.work); - struct snd_soc_codec *codec = rt5663->codec; + struct snd_soc_component *component = rt5663->component; - if (!codec) + if (!component) return; - if (!rt5663_check_jd_status(codec)) { + if (!rt5663_check_jd_status(component)) { /* jack out */ switch (rt5663->codec_ver) { case CODEC_VER_1: - rt5663_v2_jack_detect(rt5663->codec, 0); + rt5663_v2_jack_detect(rt5663->component, 0); break; case CODEC_VER_0: - rt5663_jack_detect(rt5663->codec, 0); + rt5663_jack_detect(rt5663->component, 0); break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } snd_soc_jack_report(rt5663->hs_jack, 0, SND_JACK_HEADSET | @@ -2047,9 +2047,9 @@ static int rt5663_is_sys_clk_from_pll(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - val = snd_soc_read(codec, RT5663_GLB_CLK); + val = snd_soc_component_read32(component, RT5663_GLB_CLK); val &= RT5663_SCLK_SRC_MASK; if (val == RT5663_SCLK_SRC_PLL1) return 1; @@ -2061,8 +2061,8 @@ static int rt5663_is_using_asrc(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int reg, shift, val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); if (rt5663->codec_ver == CODEC_VER_1) { switch (w->shift) { @@ -2092,7 +2092,7 @@ static int rt5663_is_using_asrc(struct snd_soc_dapm_widget *w, } } - val = (snd_soc_read(codec, reg) >> shift) & 0x7; + val = (snd_soc_component_read32(component, reg) >> shift) & 0x7; if (val) return 1; @@ -2103,23 +2103,23 @@ static int rt5663_is_using_asrc(struct snd_soc_dapm_widget *w, static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); int da_asrc_en, ad_asrc_en; - da_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) & + da_asrc_en = (snd_soc_component_read32(component, RT5663_ASRC_2) & RT5663_DA_STO1_TRACK_MASK) ? 1 : 0; switch (rt5663->codec_ver) { case CODEC_VER_1: - ad_asrc_en = (snd_soc_read(codec, RT5663_ASRC_3) & + ad_asrc_en = (snd_soc_component_read32(component, RT5663_ASRC_3) & RT5663_V2_AD_STO1_TRACK_MASK) ? 1 : 0; break; case CODEC_VER_0: - ad_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) & + ad_asrc_en = (snd_soc_component_read32(component, RT5663_ASRC_2) & RT5663_AD_STO1_TRACK_MASK) ? 1 : 0; break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); return 1; } @@ -2127,14 +2127,14 @@ static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source, if (rt5663->sysclk > rt5663->lrck * 384) return 1; - dev_err(codec->dev, "sysclk < 384 x fs, disable i2s asrc\n"); + dev_err(component->dev, "sysclk < 384 x fs, disable i2s asrc\n"); return 0; } /** * rt5663_sel_asrc_clk_src - select ASRC clock source for a set of filters - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @filter_mask: mask of filters. * @clk_src: clock source * @@ -2146,10 +2146,10 @@ static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source, * set of filters specified by the mask. And the codec driver will turn on ASRC * for these filters if ASRC is selected as their clock source. */ -int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5663_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int asrc2_mask = 0; unsigned int asrc2_value = 0; unsigned int asrc3_mask = 0; @@ -2180,16 +2180,16 @@ int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec, asrc2_value |= clk_src << RT5663_AD_STO1_TRACK_SHIFT; break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); } } if (asrc2_mask) - snd_soc_update_bits(codec, RT5663_ASRC_2, asrc2_mask, + snd_soc_component_update_bits(component, RT5663_ASRC_2, asrc2_mask, asrc2_value); if (asrc3_mask) - snd_soc_update_bits(codec, RT5663_ASRC_3, asrc3_mask, + snd_soc_component_update_bits(component, RT5663_ASRC_3, asrc3_mask, asrc3_value); return 0; @@ -2295,42 +2295,42 @@ static const struct snd_kcontrol_new rt5663_alg_dacr_mux = static int rt5663_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: if (rt5663->codec_ver == CODEC_VER_1) { - snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, RT5663_SEL_PM_HP_SHIFT, RT5663_SEL_PM_HP_HIGH); - snd_soc_update_bits(codec, RT5663_HP_LOGIC_2, + snd_soc_component_update_bits(component, RT5663_HP_LOGIC_2, RT5663_HP_SIG_SRC1_MASK, RT5663_HP_SIG_SRC1_SILENCE); } else { - snd_soc_write(codec, RT5663_DEPOP_2, 0x3003); - snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, + snd_soc_component_write(component, RT5663_DEPOP_2, 0x3003); + snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_DIS); - snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_2, 0x1371); - snd_soc_write(codec, RT5663_HP_BIAS, 0xabba); - snd_soc_write(codec, RT5663_CHARGE_PUMP_1, 0x2224); - snd_soc_write(codec, RT5663_ANA_BIAS_CUR_1, 0x7766); - snd_soc_write(codec, RT5663_HP_BIAS, 0xafaa); - snd_soc_write(codec, RT5663_CHARGE_PUMP_2, 0x7777); - snd_soc_update_bits(codec, RT5663_STO_DRE_1, 0x8000, + snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_2, 0x1371); + snd_soc_component_write(component, RT5663_HP_BIAS, 0xabba); + snd_soc_component_write(component, RT5663_CHARGE_PUMP_1, 0x2224); + snd_soc_component_write(component, RT5663_ANA_BIAS_CUR_1, 0x7766); + snd_soc_component_write(component, RT5663_HP_BIAS, 0xafaa); + snd_soc_component_write(component, RT5663_CHARGE_PUMP_2, 0x7777); + snd_soc_component_update_bits(component, RT5663_STO_DRE_1, 0x8000, 0x8000); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0x3000); } break; case SND_SOC_DAPM_PRE_PMD: if (rt5663->codec_ver == CODEC_VER_1) { - snd_soc_update_bits(codec, RT5663_HP_LOGIC_2, + snd_soc_component_update_bits(component, RT5663_HP_LOGIC_2, RT5663_HP_SIG_SRC1_MASK, RT5663_HP_SIG_SRC1_REG); } else { - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, 0x0); - snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0x0); + snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_EN); } break; @@ -2345,23 +2345,23 @@ static int rt5663_hp_event(struct snd_soc_dapm_widget *w, static int rt5663_charge_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: if (rt5663->codec_ver == CODEC_VER_0) { - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0x0030); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0003, + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0x0003); } break; case SND_SOC_DAPM_POST_PMD: if (rt5663->codec_ver == CODEC_VER_0) { - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0003, 0); - snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 0); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0); + snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0); } break; @@ -2375,17 +2375,17 @@ static int rt5663_charge_pump_event(struct snd_soc_dapm_widget *w, static int rt5663_bst2_power(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK, RT5663_PWR_BST2 | RT5663_PWR_BST2_OP); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK, 0); break; @@ -2399,17 +2399,17 @@ static int rt5663_bst2_power(struct snd_soc_dapm_widget *w, static int rt5663_pre_div_power(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, RT5663_PRE_DIV_GATING_1, 0xff00); - snd_soc_write(codec, RT5663_PRE_DIV_GATING_2, 0xfffc); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0xff00); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0xfffc); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_write(codec, RT5663_PRE_DIV_GATING_1, 0x0000); - snd_soc_write(codec, RT5663_PRE_DIV_GATING_2, 0x0000); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0x0000); + snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0x0000); break; default: @@ -2731,8 +2731,8 @@ static const struct snd_soc_dapm_route rt5663_specific_dapm_routes[] = { static int rt5663_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0; int pre_div; @@ -2743,7 +2743,7 @@ static int rt5663_hw_params(struct snd_pcm_substream *substream, pre_div = rl6231_get_clk_info(rt5663->sysclk, rt5663->lrck); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n", + dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", rt5663->lrck, dai->id); return -EINVAL; } @@ -2767,10 +2767,10 @@ static int rt5663_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, RT5663_I2S1_SDP, + snd_soc_component_update_bits(component, RT5663_I2S1_SDP, RT5663_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5663_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5663_ADDA_CLK_1, RT5663_I2S_PD1_MASK, pre_div << RT5663_I2S_PD1_SHIFT); return 0; @@ -2778,7 +2778,7 @@ static int rt5663_hw_params(struct snd_pcm_substream *substream, static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -2817,7 +2817,7 @@ static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, RT5663_I2S1_SDP, RT5663_I2S_MS_MASK | + snd_soc_component_update_bits(component, RT5663_I2S1_SDP, RT5663_I2S_MS_MASK | RT5663_I2S_BP_MASK | RT5663_I2S_DF_MASK, reg_val); return 0; @@ -2826,8 +2826,8 @@ static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5663_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5663->sysclk && clk_id == rt5663->sysclk_src) @@ -2844,15 +2844,15 @@ static int rt5663_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, reg_val |= RT5663_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, + snd_soc_component_update_bits(component, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, reg_val); rt5663->sysclk = freq; rt5663->sysclk_src = clk_id; - dev_dbg(codec->dev, "Sysclk is %dHz and clock id is %d\n", + dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); return 0; @@ -2861,8 +2861,8 @@ static int rt5663_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; int mask, shift, val; @@ -2872,11 +2872,11 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5663->pll_in = 0; rt5663->pll_out = 0; - snd_soc_update_bits(codec, RT5663_GLB_CLK, + snd_soc_component_update_bits(component, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, RT5663_SCLK_SRC_MCLK); return 0; } @@ -2891,7 +2891,7 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, shift = RT5663_PLL1_SRC_SHIFT; break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); return -EINVAL; } @@ -2903,24 +2903,24 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, val = 0x1; break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } - snd_soc_update_bits(codec, RT5663_GLB_CLK, mask, (val << shift)); + snd_soc_component_update_bits(component, RT5663_GLB_CLK, mask, (val << shift)); ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5663_PLL_1, + snd_soc_component_write(component, RT5663_PLL_1, pll_code.n_code << RT5663_PLL_N_SHIFT | pll_code.k_code); - snd_soc_write(codec, RT5663_PLL_2, + snd_soc_component_write(component, RT5663_PLL_2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5663_PLL_M_SHIFT | pll_code.m_bp << RT5663_PLL_M_BP_SHIFT); @@ -2934,8 +2934,8 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int val = 0, reg; if (rx_mask || tx_mask) @@ -2987,11 +2987,11 @@ static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, reg = RT5663_TDM_1; break; default: - dev_err(codec->dev, "Unknown CODEC Version\n"); + dev_err(component->dev, "Unknown CODEC Version\n"); return -EINVAL; } - snd_soc_update_bits(codec, reg, RT5663_TDM_MODE_MASK | + snd_soc_component_update_bits(component, reg, RT5663_TDM_MODE_MASK | RT5663_TDM_IN_CH_MASK | RT5663_TDM_OUT_CH_MASK | RT5663_TDM_IN_LEN_MASK | RT5663_TDM_OUT_LEN_MASK, val); @@ -3000,11 +3000,11 @@ static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int rt5663_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); unsigned int reg; - dev_dbg(codec->dev, "%s ratio = %d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio = %d\n", __func__, ratio); if (rt5663->codec_ver == CODEC_VER_1) reg = RT5663_TDM_9; @@ -3013,51 +3013,51 @@ static int rt5663_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) switch (ratio) { case 32: - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, RT5663_TDM_LENGTN_MASK, RT5663_TDM_LENGTN_16); break; case 40: - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, RT5663_TDM_LENGTN_MASK, RT5663_TDM_LENGTN_20); break; case 48: - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, RT5663_TDM_LENGTN_MASK, RT5663_TDM_LENGTN_24); break; case 64: - snd_soc_update_bits(codec, reg, + snd_soc_component_update_bits(component, reg, RT5663_TDM_LENGTN_MASK, RT5663_TDM_LENGTN_32); break; default: - dev_err(codec->dev, "Invalid ratio!\n"); + dev_err(component->dev, "Invalid ratio!\n"); return -EINVAL; } return 0; } -static int rt5663_set_bias_level(struct snd_soc_codec *codec, +static int rt5663_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, RT5663_PWR_FV1 | RT5663_PWR_FV2); break; case SND_SOC_BIAS_PREPARE: if (rt5663->codec_ver == CODEC_VER_1) { - snd_soc_update_bits(codec, RT5663_DIG_MISC, + snd_soc_component_update_bits(component, RT5663_DIG_MISC, RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN); - snd_soc_update_bits(codec, RT5663_SIG_CLK_DET, + snd_soc_component_update_bits(component, RT5663_SIG_CLK_DET, RT5663_EN_ANA_CLK_DET_MASK | RT5663_PWR_CLK_DET_MASK, RT5663_EN_ANA_CLK_DET_AUTO | @@ -3067,17 +3067,17 @@ static int rt5663_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_STANDBY: if (rt5663->codec_ver == CODEC_VER_1) - snd_soc_update_bits(codec, RT5663_DIG_MISC, + snd_soc_component_update_bits(component, RT5663_DIG_MISC, RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_DIS); - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK | RT5663_PWR_MB_MASK, RT5663_PWR_VREF1 | RT5663_PWR_VREF2 | RT5663_PWR_MB); usleep_range(10000, 10005); if (rt5663->codec_ver == CODEC_VER_1) { - snd_soc_update_bits(codec, RT5663_SIG_CLK_DET, + snd_soc_component_update_bits(component, RT5663_SIG_CLK_DET, RT5663_EN_ANA_CLK_DET_MASK | RT5663_PWR_CLK_DET_MASK, RT5663_EN_ANA_CLK_DET_DIS | @@ -3086,7 +3086,7 @@ static int rt5663_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | RT5663_PWR_FV1 | RT5663_PWR_FV2, 0x0); break; @@ -3098,12 +3098,12 @@ static int rt5663_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5663_probe(struct snd_soc_codec *codec) +static int rt5663_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); - rt5663->codec = codec; + rt5663->component = component; switch (rt5663->codec_ver) { case CODEC_VER_1: @@ -3113,7 +3113,7 @@ static int rt5663_probe(struct snd_soc_codec *codec) snd_soc_dapm_add_routes(dapm, rt5663_v2_specific_dapm_routes, ARRAY_SIZE(rt5663_v2_specific_dapm_routes)); - snd_soc_add_codec_controls(codec, rt5663_v2_specific_controls, + snd_soc_add_component_controls(component, rt5663_v2_specific_controls, ARRAY_SIZE(rt5663_v2_specific_controls)); break; case CODEC_VER_0: @@ -3123,11 +3123,11 @@ static int rt5663_probe(struct snd_soc_codec *codec) snd_soc_dapm_add_routes(dapm, rt5663_specific_dapm_routes, ARRAY_SIZE(rt5663_specific_dapm_routes)); - snd_soc_add_codec_controls(codec, rt5663_specific_controls, + snd_soc_add_component_controls(component, rt5663_specific_controls, ARRAY_SIZE(rt5663_specific_controls)); if (!rt5663->imp_table) - snd_soc_add_codec_controls(codec, rt5663_hpvol_controls, + snd_soc_add_component_controls(component, rt5663_hpvol_controls, ARRAY_SIZE(rt5663_hpvol_controls)); break; } @@ -3135,19 +3135,17 @@ static int rt5663_probe(struct snd_soc_codec *codec) return 0; } -static int rt5663_remove(struct snd_soc_codec *codec) +static void rt5663_remove(struct snd_soc_component *component) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); regmap_write(rt5663->regmap, RT5663_RESET, 0); - - return 0; } #ifdef CONFIG_PM -static int rt5663_suspend(struct snd_soc_codec *codec) +static int rt5663_suspend(struct snd_soc_component *component) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5663->regmap, true); regcache_mark_dirty(rt5663->regmap); @@ -3155,9 +3153,9 @@ static int rt5663_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5663_resume(struct snd_soc_codec *codec) +static int rt5663_resume(struct snd_soc_component *component) { - struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); + struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5663->regmap, false); regcache_sync(rt5663->regmap); @@ -3206,21 +3204,22 @@ static struct snd_soc_dai_driver rt5663_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5663 = { - .probe = rt5663_probe, - .remove = rt5663_remove, - .suspend = rt5663_suspend, - .resume = rt5663_resume, - .set_bias_level = rt5663_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5663_snd_controls, - .num_controls = ARRAY_SIZE(rt5663_snd_controls), - .dapm_widgets = rt5663_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5663_dapm_widgets), - .dapm_routes = rt5663_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5663_dapm_routes), - } +static const struct snd_soc_component_driver soc_component_dev_rt5663 = { + .probe = rt5663_probe, + .remove = rt5663_remove, + .suspend = rt5663_suspend, + .resume = rt5663_resume, + .set_bias_level = rt5663_set_bias_level, + .controls = rt5663_snd_controls, + .num_controls = ARRAY_SIZE(rt5663_snd_controls), + .dapm_widgets = rt5663_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5663_dapm_widgets), + .dapm_routes = rt5663_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5663_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, + }; static const struct regmap_config rt5663_v2_regmap = { @@ -3610,7 +3609,8 @@ static int rt5663_i2c_probe(struct i2c_client *i2c, __func__, ret); } - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5663, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5663, rt5663_dai, ARRAY_SIZE(rt5663_dai)); if (ret) { @@ -3628,8 +3628,6 @@ static int rt5663_i2c_remove(struct i2c_client *i2c) if (i2c->irq) free_irq(i2c->irq, rt5663); - snd_soc_unregister_codec(&i2c->dev); - return 0; } diff --git a/sound/soc/codecs/rt5663.h b/sound/soc/codecs/rt5663.h index 03adc8004ba9..865203cc2034 100644 --- a/sound/soc/codecs/rt5663.h +++ b/sound/soc/codecs/rt5663.h @@ -1125,9 +1125,9 @@ enum { RT5663_AD_STEREO_FILTER = 0x2, }; -int rt5663_set_jack_detect(struct snd_soc_codec *codec, +int rt5663_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hs_jack); -int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5663_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); #endif /* __RT5663_H__ */ diff --git a/sound/soc/codecs/rt5665.c b/sound/soc/codecs/rt5665.c index f05d362c4e23..6ba99f5ed3f4 100644 --- a/sound/soc/codecs/rt5665.c +++ b/sound/soc/codecs/rt5665.c @@ -44,7 +44,7 @@ static const char *rt5665_supply_names[RT5665_NUM_SUPPLIES] = { }; struct rt5665_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5665_platform_data pdata; struct regmap *regmap; struct gpio_desc *gpiod_ldo1_en; @@ -1000,13 +1000,13 @@ static const struct snd_kcontrol_new rt5665_if3_adc_swap_mux = static int rt5665_hp_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int ret = snd_soc_put_volsw(kcontrol, ucontrol); - if (snd_soc_read(codec, RT5665_STO_NG2_CTRL_1) & RT5665_NG2_EN) { - snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1, + if (snd_soc_component_read32(component, RT5665_STO_NG2_CTRL_1) & RT5665_NG2_EN) { + snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_DIS); - snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_EN); } @@ -1016,13 +1016,13 @@ static int rt5665_hp_vol_put(struct snd_kcontrol *kcontrol, static int rt5665_mono_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int ret = snd_soc_put_volsw(kcontrol, ucontrol); - if (snd_soc_read(codec, RT5665_MONO_NG2_CTRL_1) & RT5665_NG2_EN) { - snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1, + if (snd_soc_component_read32(component, RT5665_MONO_NG2_CTRL_1) & RT5665_NG2_EN) { + snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_DIS); - snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_EN); } @@ -1031,7 +1031,7 @@ static int rt5665_mono_vol_put(struct snd_kcontrol *kcontrol, /** * rt5665_sel_asrc_clk_src - select ASRC clock source for a set of filters - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @filter_mask: mask of filters. * @clk_src: clock source * @@ -1043,7 +1043,7 @@ static int rt5665_mono_vol_put(struct snd_kcontrol *kcontrol, * set of filters specified by the mask. And the codec driver will turn on ASRC * for these filters if ASRC is selected as their clock source. */ -int rt5665_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5665_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { unsigned int asrc2_mask = 0; @@ -1114,63 +1114,63 @@ int rt5665_sel_asrc_clk_src(struct snd_soc_codec *codec, } if (asrc2_mask) - snd_soc_update_bits(codec, RT5665_ASRC_2, + snd_soc_component_update_bits(component, RT5665_ASRC_2, asrc2_mask, asrc2_value); if (asrc3_mask) - snd_soc_update_bits(codec, RT5665_ASRC_3, + snd_soc_component_update_bits(component, RT5665_ASRC_3, asrc3_mask, asrc3_value); return 0; } EXPORT_SYMBOL_GPL(rt5665_sel_asrc_clk_src); -static int rt5665_button_detect(struct snd_soc_codec *codec) +static int rt5665_button_detect(struct snd_soc_component *component) { int btn_type, val; - val = snd_soc_read(codec, RT5665_4BTN_IL_CMD_1); + val = snd_soc_component_read32(component, RT5665_4BTN_IL_CMD_1); btn_type = val & 0xfff0; - snd_soc_write(codec, RT5665_4BTN_IL_CMD_1, val); + snd_soc_component_write(component, RT5665_4BTN_IL_CMD_1, val); return btn_type; } -static void rt5665_enable_push_button_irq(struct snd_soc_codec *codec, +static void rt5665_enable_push_button_irq(struct snd_soc_component *component, bool enable) { if (enable) { - snd_soc_write(codec, RT5665_4BTN_IL_CMD_1, 0x0003); - snd_soc_update_bits(codec, RT5665_SAR_IL_CMD_9, 0x1, 0x1); - snd_soc_write(codec, RT5665_IL_CMD_1, 0x0048); - snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2, + snd_soc_component_write(component, RT5665_4BTN_IL_CMD_1, 0x0003); + snd_soc_component_update_bits(component, RT5665_SAR_IL_CMD_9, 0x1, 0x1); + snd_soc_component_write(component, RT5665_IL_CMD_1, 0x0048); + snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2, RT5665_4BTN_IL_MASK | RT5665_4BTN_IL_RST_MASK, RT5665_4BTN_IL_EN | RT5665_4BTN_IL_NOR); - snd_soc_update_bits(codec, RT5665_IRQ_CTRL_3, + snd_soc_component_update_bits(component, RT5665_IRQ_CTRL_3, RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_EN); } else { - snd_soc_update_bits(codec, RT5665_IRQ_CTRL_3, + snd_soc_component_update_bits(component, RT5665_IRQ_CTRL_3, RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_DIS); - snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2, + snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2, RT5665_4BTN_IL_MASK, RT5665_4BTN_IL_DIS); - snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2, + snd_soc_component_update_bits(component, RT5665_4BTN_IL_CMD_2, RT5665_4BTN_IL_RST_MASK, RT5665_4BTN_IL_RST); } } /** * rt5665_headset_detect - Detect headset. - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @jack_insert: Jack insert or not. * * Detect whether is headset or not when jack inserted. * * Returns detect status. */ -static int rt5665_headset_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5665_headset_detect(struct snd_soc_component *component, int jack_insert) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); unsigned int sar_hs_type, val; if (jack_insert) { @@ -1201,7 +1201,7 @@ static int rt5665_headset_detect(struct snd_soc_codec *codec, int jack_insert) usleep_range(10000, 15000); - rt5665->sar_adc_value = snd_soc_read(rt5665->codec, + rt5665->sar_adc_value = snd_soc_component_read32(rt5665->component, RT5665_SAR_IL_CMD_4) & 0x7ff; sar_hs_type = rt5665->pdata.sar_hs_type ? @@ -1209,7 +1209,7 @@ static int rt5665_headset_detect(struct snd_soc_codec *codec, int jack_insert) if (rt5665->sar_adc_value > sar_hs_type) { rt5665->jack_type = SND_JACK_HEADSET; - rt5665_enable_push_button_irq(codec, true); + rt5665_enable_push_button_irq(component, true); } else { rt5665->jack_type = SND_JACK_HEADPHONE; regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1, @@ -1225,11 +1225,11 @@ static int rt5665_headset_detect(struct snd_soc_codec *codec, int jack_insert) snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); snd_soc_dapm_sync(dapm); if (rt5665->jack_type == SND_JACK_HEADSET) - rt5665_enable_push_button_irq(codec, false); + rt5665_enable_push_button_irq(component, false); rt5665->jack_type = 0; } - dev_dbg(codec->dev, "jack_type = %d\n", rt5665->jack_type); + dev_dbg(component->dev, "jack_type = %d\n", rt5665->jack_type); return rt5665->jack_type; } @@ -1248,9 +1248,9 @@ static void rt5665_jd_check_handler(struct work_struct *work) struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv, jd_check_work.work); - if (snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010) { + if (snd_soc_component_read32(rt5665->component, RT5665_AJD1_CTRL) & 0x0010) { /* jack out */ - rt5665->jack_type = rt5665_headset_detect(rt5665->codec, 0); + rt5665->jack_type = rt5665_headset_detect(rt5665->component, 0); snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type, SND_JACK_HEADSET | @@ -1261,10 +1261,10 @@ static void rt5665_jd_check_handler(struct work_struct *work) } } -static int rt5665_set_jack_detect(struct snd_soc_codec *codec, +static int rt5665_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *hs_jack, void *data) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); switch (rt5665->pdata.jd_src) { case RT5665_JD1: @@ -1281,7 +1281,7 @@ static int rt5665_set_jack_detect(struct snd_soc_codec *codec, break; default: - dev_warn(codec->dev, "Wrong JD source\n"); + dev_warn(component->dev, "Wrong JD source\n"); break; } @@ -1296,12 +1296,12 @@ static void rt5665_jack_detect_handler(struct work_struct *work) container_of(work, struct rt5665_priv, jack_detect_work.work); int val, btn_type; - while (!rt5665->codec) { + while (!rt5665->component) { pr_debug("%s codec = null\n", __func__); usleep_range(10000, 15000); } - while (!rt5665->codec->component.card->instantiated) { + while (!rt5665->component->card->instantiated) { pr_debug("%s\n", __func__); usleep_range(10000, 15000); } @@ -1313,17 +1313,17 @@ static void rt5665_jack_detect_handler(struct work_struct *work) mutex_lock(&rt5665->calibrate_mutex); - val = snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010; + val = snd_soc_component_read32(rt5665->component, RT5665_AJD1_CTRL) & 0x0010; if (!val) { /* jack in */ if (rt5665->jack_type == 0) { /* jack was out, report jack type */ rt5665->jack_type = - rt5665_headset_detect(rt5665->codec, 1); + rt5665_headset_detect(rt5665->component, 1); } else { /* jack is already in, report button event */ rt5665->jack_type = SND_JACK_HEADSET; - btn_type = rt5665_button_detect(rt5665->codec); + btn_type = rt5665_button_detect(rt5665->component); /** * rt5665 can report three kinds of button behavior, * one click, double click and hold. However, @@ -1356,7 +1356,7 @@ static void rt5665_jack_detect_handler(struct work_struct *work) break; default: btn_type = 0; - dev_err(rt5665->codec->dev, + dev_err(rt5665->component->dev, "Unexpected button code 0x%04x\n", btn_type); break; @@ -1364,7 +1364,7 @@ static void rt5665_jack_detect_handler(struct work_struct *work) } } else { /* jack out */ - rt5665->jack_type = rt5665_headset_detect(rt5665->codec, 0); + rt5665->jack_type = rt5665_headset_detect(rt5665->component, 0); } snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type, @@ -1479,8 +1479,8 @@ static const struct snd_kcontrol_new rt5665_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); int pd, idx = -EINVAL; pd = rl6231_get_pre_div(rt5665->regmap, @@ -1488,9 +1488,9 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, idx = rl6231_calc_dmic_clk(rt5665->sysclk / pd); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else { - snd_soc_update_bits(codec, RT5665_DMIC_CTRL_1, + snd_soc_component_update_bits(component, RT5665_DMIC_CTRL_1, RT5665_DMIC_CLK_MASK, idx << RT5665_DMIC_CLK_SFT); } return idx; @@ -1499,16 +1499,16 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, static int rt5665_charge_pump_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5665_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5665_HP_CHARGE_PUMP_1, RT5665_PM_HP_MASK | RT5665_OSW_L_MASK, RT5665_PM_HP_HV | RT5665_OSW_L_EN); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, RT5665_HP_CHARGE_PUMP_1, + snd_soc_component_update_bits(component, RT5665_HP_CHARGE_PUMP_1, RT5665_PM_HP_MASK | RT5665_OSW_L_MASK, RT5665_PM_HP_LV | RT5665_OSW_L_DIS); break; @@ -1523,9 +1523,9 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - val = snd_soc_read(codec, RT5665_GLB_CLK); + val = snd_soc_component_read32(component, RT5665_GLB_CLK); val &= RT5665_SCLK_SRC_MASK; if (val == RT5665_SCLK_SRC_PLL1) return 1; @@ -1537,7 +1537,7 @@ static int is_using_asrc(struct snd_soc_dapm_widget *w, struct snd_soc_dapm_widget *sink) { unsigned int reg, shift, val; - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (w->shift) { case RT5665_ADC_MONO_R_ASRC_SFT: @@ -1576,13 +1576,13 @@ static int is_using_asrc(struct snd_soc_dapm_widget *w, return 0; } - val = (snd_soc_read(codec, reg) >> shift) & 0xf; + val = (snd_soc_component_read32(component, reg) >> shift) & 0xf; switch (val) { case RT5665_CLK_SEL_I2S1_ASRC: case RT5665_CLK_SEL_I2S2_ASRC: case RT5665_CLK_SEL_I2S3_ASRC: /* I2S_Pre_Div1 should be 1 in asrc mode */ - snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1, RT5665_I2S_PD1_MASK, RT5665_I2S_PD1_2); return 1; default: @@ -2474,24 +2474,24 @@ static const struct snd_kcontrol_new pdm_r_switch = static int rt5665_mono_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_EN); - snd_soc_update_bits(codec, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40, + snd_soc_component_update_bits(component, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40, 0x0); - snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x10, 0x10); - snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x20, 0x20); + snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x10, 0x10); + snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x20, 0x20); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x20, 0); - snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x10, 0); - snd_soc_update_bits(codec, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40, + snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x20, 0); + snd_soc_component_update_bits(component, RT5665_MONO_OUT, 0x10, 0); + snd_soc_component_update_bits(component, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40, 0x40); - snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5665_MONO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_DIS); break; @@ -2506,18 +2506,18 @@ static int rt5665_mono_event(struct snd_soc_dapm_widget *w, static int rt5665_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1, + snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_EN); - snd_soc_write(codec, RT5665_HP_LOGIC_CTRL_2, 0x0003); + snd_soc_component_write(component, RT5665_HP_LOGIC_CTRL_2, 0x0003); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_write(codec, RT5665_HP_LOGIC_CTRL_2, 0x0002); - snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1, + snd_soc_component_write(component, RT5665_HP_LOGIC_CTRL_2, 0x0002); + snd_soc_component_update_bits(component, RT5665_STO_NG2_CTRL_1, RT5665_NG2_EN_MASK, RT5665_NG2_DIS); break; @@ -2532,16 +2532,16 @@ static int rt5665_hp_event(struct snd_soc_dapm_widget *w, static int rt5665_lout_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5665_DEPOP_1, + snd_soc_component_update_bits(component, RT5665_DEPOP_1, RT5665_PUMP_EN, RT5665_PUMP_EN); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5665_DEPOP_1, + snd_soc_component_update_bits(component, RT5665_DEPOP_1, RT5665_PUMP_EN, 0); break; @@ -2572,23 +2572,23 @@ static int set_dmic_power(struct snd_soc_dapm_widget *w, static int rt5655_set_verf(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: switch (w->shift) { case RT5665_PWR_VREF1_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV1, 0); break; case RT5665_PWR_VREF2_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV2, 0); break; case RT5665_PWR_VREF3_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV3, 0); break; @@ -2601,17 +2601,17 @@ static int rt5655_set_verf(struct snd_soc_dapm_widget *w, usleep_range(15000, 20000); switch (w->shift) { case RT5665_PWR_VREF1_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV1, RT5665_PWR_FV1); break; case RT5665_PWR_VREF2_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV2, RT5665_PWR_FV2); break; case RT5665_PWR_VREF3_BIT: - snd_soc_update_bits(codec, RT5665_PWR_ANLG_1, + snd_soc_component_update_bits(component, RT5665_PWR_ANLG_1, RT5665_PWR_FV3, RT5665_PWR_FV3); break; @@ -2630,7 +2630,7 @@ static int rt5655_set_verf(struct snd_soc_dapm_widget *w, static int rt5665_i2s_pin_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int val1, val2, mask1 = 0, mask2 = 0; switch (w->shift) { @@ -2660,18 +2660,18 @@ static int rt5665_i2s_pin_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: if (mask1) - snd_soc_update_bits(codec, RT5665_GPIO_CTRL_1, + snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_1, mask1, val1); if (mask2) - snd_soc_update_bits(codec, RT5665_GPIO_CTRL_2, + snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_2, mask2, val2); break; case SND_SOC_DAPM_POST_PMD: if (mask1) - snd_soc_update_bits(codec, RT5665_GPIO_CTRL_1, + snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_1, mask1, 0); if (mask2) - snd_soc_update_bits(codec, RT5665_GPIO_CTRL_2, + snd_soc_component_update_bits(component, RT5665_GPIO_CTRL_2, mask2, 0); break; default: @@ -4052,7 +4052,7 @@ static const struct snd_soc_dapm_route rt5665_dapm_routes[] = { static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; if (rx_mask || tx_mask) @@ -4096,7 +4096,7 @@ static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return -EINVAL; } - snd_soc_update_bits(codec, RT5665_TDM_CTRL_1, + snd_soc_component_update_bits(component, RT5665_TDM_CTRL_1, RT5665_I2S1_MODE_MASK | RT5665_TDM_IN_CH_MASK | RT5665_TDM_OUT_CH_MASK | RT5665_TDM_IN_LEN_MASK | RT5665_TDM_OUT_LEN_MASK, val); @@ -4108,24 +4108,24 @@ static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int rt5665_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, reg_clk, mask_clk, val_bits = 0x0100; int pre_div, frame_size; rt5665->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5665->sysclk, rt5665->lrck[dai->id]); if (pre_div < 0) { - dev_warn(codec->dev, "Force using PLL"); - snd_soc_codec_set_pll(codec, 0, RT5665_PLL1_S_MCLK, + dev_warn(component->dev, "Force using PLL"); + snd_soc_component_set_pll(component, 0, RT5665_PLL1_S_MCLK, rt5665->sysclk, rt5665->lrck[dai->id] * 512); - snd_soc_codec_set_sysclk(codec, RT5665_SCLK_S_PLL1, 0, + snd_soc_component_set_sysclk(component, RT5665_SCLK_S_PLL1, 0, rt5665->lrck[dai->id] * 512, 0); pre_div = 1; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } @@ -4160,7 +4160,7 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, reg_clk = RT5665_ADDA_CLK_1; mask_clk = RT5665_I2S_PD1_MASK; val_clk = pre_div << RT5665_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5665_I2S1_SDP, + snd_soc_component_update_bits(component, RT5665_I2S1_SDP, RT5665_I2S_DL_MASK, val_len); break; case RT5665_AIF2_1: @@ -4168,48 +4168,48 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, reg_clk = RT5665_ADDA_CLK_2; mask_clk = RT5665_I2S_PD2_MASK; val_clk = pre_div << RT5665_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5665_I2S2_SDP, + snd_soc_component_update_bits(component, RT5665_I2S2_SDP, RT5665_I2S_DL_MASK, val_len); break; case RT5665_AIF3: reg_clk = RT5665_ADDA_CLK_2; mask_clk = RT5665_I2S_PD3_MASK; val_clk = pre_div << RT5665_I2S_PD3_SFT; - snd_soc_update_bits(codec, RT5665_I2S3_SDP, + snd_soc_component_update_bits(component, RT5665_I2S3_SDP, RT5665_I2S_DL_MASK, val_len); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } - snd_soc_update_bits(codec, reg_clk, mask_clk, val_clk); - snd_soc_update_bits(codec, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits); + snd_soc_component_update_bits(component, reg_clk, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits); switch (rt5665->lrck[dai->id]) { case 192000: - snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1, RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK, RT5665_DAC_OSR_32 | RT5665_ADC_OSR_32); break; case 96000: - snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1, RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK, RT5665_DAC_OSR_64 | RT5665_ADC_OSR_64); break; default: - snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_1, RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK, RT5665_DAC_OSR_128 | RT5665_ADC_OSR_128); break; } if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) { - snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1, + snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1, RT5665_I2S2_M_PD_MASK, pre_div << RT5665_I2S2_M_PD_SFT); } if (rt5665->master[RT5665_AIF3]) { - snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1, + snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1, RT5665_I2S3_M_PD_MASK, pre_div << RT5665_I2S3_M_PD_SFT); } @@ -4218,8 +4218,8 @@ static int rt5665_hw_params(struct snd_pcm_substream *substream, static int rt5665_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -4263,32 +4263,32 @@ static int rt5665_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (dai->id) { case RT5665_AIF1_1: case RT5665_AIF1_2: - snd_soc_update_bits(codec, RT5665_I2S1_SDP, + snd_soc_component_update_bits(component, RT5665_I2S1_SDP, RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK | RT5665_I2S_DF_MASK, reg_val); break; case RT5665_AIF2_1: case RT5665_AIF2_2: - snd_soc_update_bits(codec, RT5665_I2S2_SDP, + snd_soc_component_update_bits(component, RT5665_I2S2_SDP, RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK | RT5665_I2S_DF_MASK, reg_val); break; case RT5665_AIF3: - snd_soc_update_bits(codec, RT5665_I2S3_SDP, + snd_soc_component_update_bits(component, RT5665_I2S3_SDP, RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK | RT5665_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } return 0; } -static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, +static int rt5665_set_component_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0, src = 0; if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src) @@ -4308,34 +4308,34 @@ static int rt5665_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, src = RT5665_CLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_SCLK_SRC_MASK, reg_val); if (rt5665->master[RT5665_AIF2_1] || rt5665->master[RT5665_AIF2_2]) { - snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1, + snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1, RT5665_I2S2_SRC_MASK, src << RT5665_I2S2_SRC_SFT); } if (rt5665->master[RT5665_AIF3]) { - snd_soc_update_bits(codec, RT5665_I2S_M_CLK_CTRL_1, + snd_soc_component_update_bits(component, RT5665_I2S_M_CLK_CTRL_1, RT5665_I2S3_SRC_MASK, src << RT5665_I2S3_SRC_SFT); } rt5665->sysclk = freq; rt5665->sysclk_src = clk_id; - dev_dbg(codec->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); + dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); return 0; } -static int rt5665_set_codec_pll(struct snd_soc_codec *codec, int pll_id, +static int rt5665_set_component_pll(struct snd_soc_component *component, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -4344,50 +4344,50 @@ static int rt5665_set_codec_pll(struct snd_soc_codec *codec, int pll_id, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5665->pll_in = 0; rt5665->pll_out = 0; - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_SCLK_SRC_MASK, RT5665_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5665_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_MCLK); break; case RT5665_PLL1_S_BCLK1: - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK1); break; case RT5665_PLL1_S_BCLK2: - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK2); break; case RT5665_PLL1_S_BCLK3: - snd_soc_update_bits(codec, RT5665_GLB_CLK, + snd_soc_component_update_bits(component, RT5665_GLB_CLK, RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK3); break; default: - dev_err(codec->dev, "Unknown PLL Source %d\n", source); + dev_err(component->dev, "Unknown PLL Source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5665_PLL_CTRL_1, + snd_soc_component_write(component, RT5665_PLL_CTRL_1, pll_code.n_code << RT5665_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5665_PLL_CTRL_2, + snd_soc_component_write(component, RT5665_PLL_CTRL_2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5665_PLL_M_SFT | pll_code.m_bp << RT5665_PLL_M_BP_SFT); @@ -4400,10 +4400,10 @@ static int rt5665_set_codec_pll(struct snd_soc_codec *codec, int pll_id, static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); rt5665->bclk[dai->id] = ratio; @@ -4411,12 +4411,12 @@ static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) switch (dai->id) { case RT5665_AIF2_1: case RT5665_AIF2_2: - snd_soc_update_bits(codec, RT5665_ADDA_CLK_2, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_2, RT5665_I2S_BCLK_MS2_MASK, RT5665_I2S_BCLK_MS2_64); break; case RT5665_AIF3: - snd_soc_update_bits(codec, RT5665_ADDA_CLK_2, + snd_soc_component_update_bits(component, RT5665_ADDA_CLK_2, RT5665_I2S_BCLK_MS3_MASK, RT5665_I2S_BCLK_MS3_64); break; @@ -4426,10 +4426,10 @@ static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) return 0; } -static int rt5665_set_bias_level(struct snd_soc_codec *codec, +static int rt5665_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_PREPARE: @@ -4459,39 +4459,37 @@ static int rt5665_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5665_probe(struct snd_soc_codec *codec) +static int rt5665_probe(struct snd_soc_component *component) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); - rt5665->codec = codec; + rt5665->component = component; schedule_delayed_work(&rt5665->calibrate_work, msecs_to_jiffies(100)); return 0; } -static int rt5665_remove(struct snd_soc_codec *codec) +static void rt5665_remove(struct snd_soc_component *component) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); regmap_write(rt5665->regmap, RT5665_RESET, 0); - - return 0; } #ifdef CONFIG_PM -static int rt5665_suspend(struct snd_soc_codec *codec) +static int rt5665_suspend(struct snd_soc_component *component) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5665->regmap, true); regcache_mark_dirty(rt5665->regmap); return 0; } -static int rt5665_resume(struct snd_soc_codec *codec) +static int rt5665_resume(struct snd_soc_component *component) { - struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec); + struct rt5665_priv *rt5665 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5665->regmap, false); regcache_sync(rt5665->regmap); @@ -4605,24 +4603,24 @@ static struct snd_soc_dai_driver rt5665_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5665 = { - .probe = rt5665_probe, - .remove = rt5665_remove, - .suspend = rt5665_suspend, - .resume = rt5665_resume, - .set_bias_level = rt5665_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5665_snd_controls, - .num_controls = ARRAY_SIZE(rt5665_snd_controls), - .dapm_widgets = rt5665_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5665_dapm_widgets), - .dapm_routes = rt5665_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5665_dapm_routes), - }, - .set_sysclk = rt5665_set_codec_sysclk, - .set_pll = rt5665_set_codec_pll, - .set_jack = rt5665_set_jack_detect, +static const struct snd_soc_component_driver soc_component_dev_rt5665 = { + .probe = rt5665_probe, + .remove = rt5665_remove, + .suspend = rt5665_suspend, + .resume = rt5665_resume, + .set_bias_level = rt5665_set_bias_level, + .controls = rt5665_snd_controls, + .num_controls = ARRAY_SIZE(rt5665_snd_controls), + .dapm_widgets = rt5665_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5665_dapm_widgets), + .dapm_routes = rt5665_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5665_dapm_routes), + .set_sysclk = rt5665_set_component_sysclk, + .set_pll = rt5665_set_component_pll, + .set_jack = rt5665_set_jack_detect, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; @@ -4753,7 +4751,7 @@ static void rt5665_calibrate_handler(struct work_struct *work) struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv, calibrate_work.work); - while (!rt5665->codec->component.card->instantiated) { + while (!rt5665->component->card->instantiated) { pr_debug("%s\n", __func__); usleep_range(10000, 15000); } @@ -4828,9 +4826,6 @@ static int rt5665_i2c_probe(struct i2c_client *i2c, case 0x0: rt5665->id = CODEC_5666; break; - case 0x6: - rt5665->id = CODEC_5668; - break; case 0x3: default: rt5665->id = CODEC_5665; @@ -4941,17 +4936,11 @@ static int rt5665_i2c_probe(struct i2c_client *i2c, } - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5665, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5665, rt5665_dai, ARRAY_SIZE(rt5665_dai)); } -static int rt5665_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static void rt5665_i2c_shutdown(struct i2c_client *client) { struct rt5665_priv *rt5665 = i2c_get_clientdata(client); @@ -4963,7 +4952,6 @@ static void rt5665_i2c_shutdown(struct i2c_client *client) static const struct of_device_id rt5665_of_match[] = { {.compatible = "realtek,rt5665"}, {.compatible = "realtek,rt5666"}, - {.compatible = "realtek,rt5668"}, {}, }; MODULE_DEVICE_TABLE(of, rt5665_of_match); @@ -4973,7 +4961,6 @@ MODULE_DEVICE_TABLE(of, rt5665_of_match); static const struct acpi_device_id rt5665_acpi_match[] = { {"10EC5665", 0,}, {"10EC5666", 0,}, - {"10EC5668", 0,}, {}, }; MODULE_DEVICE_TABLE(acpi, rt5665_acpi_match); @@ -4986,7 +4973,6 @@ static struct i2c_driver rt5665_i2c_driver = { .acpi_match_table = ACPI_PTR(rt5665_acpi_match), }, .probe = rt5665_i2c_probe, - .remove = rt5665_i2c_remove, .shutdown = rt5665_i2c_shutdown, .id_table = rt5665_i2c_id, }; diff --git a/sound/soc/codecs/rt5665.h b/sound/soc/codecs/rt5665.h index 5ddebd6a4a1b..b0a98ca39c5b 100644 --- a/sound/soc/codecs/rt5665.h +++ b/sound/soc/codecs/rt5665.h @@ -1978,7 +1978,6 @@ enum { enum { CODEC_5665, CODEC_5666, - CODEC_5668, }; /* filter mask */ @@ -2003,7 +2002,7 @@ enum { RT5665_CLK_SEL_SYS4, }; -int rt5665_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5665_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); #endif /* __RT5665_H__ */ diff --git a/sound/soc/codecs/rt5670.c b/sound/soc/codecs/rt5670.c index c5094b4399e2..dc7df337d5f8 100644 --- a/sound/soc/codecs/rt5670.c +++ b/sound/soc/codecs/rt5670.c @@ -423,7 +423,7 @@ static bool rt5670_readable_register(struct device *dev, unsigned int reg) /** * rt5670_headset_detect - Detect headset. - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @jack_insert: Jack insert or not. * * Detect whether is headset or not when jack inserted. @@ -431,46 +431,46 @@ static bool rt5670_readable_register(struct device *dev, unsigned int reg) * Returns detect status. */ -static int rt5670_headset_detect(struct snd_soc_codec *codec, int jack_insert) +static int rt5670_headset_detect(struct snd_soc_component *component, int jack_insert) { int val; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); if (jack_insert) { snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); - snd_soc_update_bits(codec, RT5670_GEN_CTRL3, 0x4, 0x0); - snd_soc_update_bits(codec, RT5670_CJ_CTRL2, + snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x0); + snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, RT5670_CBJ_DET_MODE | RT5670_CBJ_MN_JD, RT5670_CBJ_MN_JD); - snd_soc_write(codec, RT5670_GPIO_CTRL2, 0x0004); - snd_soc_update_bits(codec, RT5670_GPIO_CTRL1, + snd_soc_component_write(component, RT5670_GPIO_CTRL2, 0x0004); + snd_soc_component_update_bits(component, RT5670_GPIO_CTRL1, RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ); - snd_soc_update_bits(codec, RT5670_CJ_CTRL1, + snd_soc_component_update_bits(component, RT5670_CJ_CTRL1, RT5670_CBJ_BST1_EN, RT5670_CBJ_BST1_EN); - snd_soc_write(codec, RT5670_JD_CTRL3, 0x00f0); - snd_soc_update_bits(codec, RT5670_CJ_CTRL2, + snd_soc_component_write(component, RT5670_JD_CTRL3, 0x00f0); + snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, RT5670_CBJ_MN_JD, RT5670_CBJ_MN_JD); - snd_soc_update_bits(codec, RT5670_CJ_CTRL2, + snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, RT5670_CBJ_MN_JD, 0); msleep(300); - val = snd_soc_read(codec, RT5670_CJ_CTRL3) & 0x7; + val = snd_soc_component_read32(component, RT5670_CJ_CTRL3) & 0x7; if (val == 0x1 || val == 0x2) { rt5670->jack_type = SND_JACK_HEADSET; /* for push button */ - snd_soc_update_bits(codec, RT5670_INT_IRQ_ST, 0x8, 0x8); - snd_soc_update_bits(codec, RT5670_IL_CMD, 0x40, 0x40); - snd_soc_read(codec, RT5670_IL_CMD); + snd_soc_component_update_bits(component, RT5670_INT_IRQ_ST, 0x8, 0x8); + snd_soc_component_update_bits(component, RT5670_IL_CMD, 0x40, 0x40); + snd_soc_component_read32(component, RT5670_IL_CMD); } else { - snd_soc_update_bits(codec, RT5670_GEN_CTRL3, 0x4, 0x4); + snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x4); rt5670->jack_type = SND_JACK_HEADPHONE; snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); } } else { - snd_soc_update_bits(codec, RT5670_INT_IRQ_ST, 0x8, 0x0); - snd_soc_update_bits(codec, RT5670_GEN_CTRL3, 0x4, 0x4); + snd_soc_component_update_bits(component, RT5670_INT_IRQ_ST, 0x8, 0x0); + snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x4); rt5670->jack_type = 0; snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); @@ -479,35 +479,35 @@ static int rt5670_headset_detect(struct snd_soc_codec *codec, int jack_insert) return rt5670->jack_type; } -void rt5670_jack_suspend(struct snd_soc_codec *codec) +void rt5670_jack_suspend(struct snd_soc_component *component) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); rt5670->jack_type_saved = rt5670->jack_type; - rt5670_headset_detect(codec, 0); + rt5670_headset_detect(component, 0); } EXPORT_SYMBOL_GPL(rt5670_jack_suspend); -void rt5670_jack_resume(struct snd_soc_codec *codec) +void rt5670_jack_resume(struct snd_soc_component *component) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); if (rt5670->jack_type_saved) - rt5670_headset_detect(codec, 1); + rt5670_headset_detect(component, 1); } EXPORT_SYMBOL_GPL(rt5670_jack_resume); -static int rt5670_button_detect(struct snd_soc_codec *codec) +static int rt5670_button_detect(struct snd_soc_component *component) { int btn_type, val; - val = snd_soc_read(codec, RT5670_IL_CMD); + val = snd_soc_component_read32(component, RT5670_IL_CMD); btn_type = val & 0xff80; - snd_soc_write(codec, RT5670_IL_CMD, val); + snd_soc_component_write(component, RT5670_IL_CMD, val); if (btn_type != 0) { msleep(20); - val = snd_soc_read(codec, RT5670_IL_CMD); - snd_soc_write(codec, RT5670_IL_CMD, val); + val = snd_soc_component_read32(component, RT5670_IL_CMD); + snd_soc_component_write(component, RT5670_IL_CMD, val); } return btn_type; @@ -521,25 +521,25 @@ static int rt5670_irq_detection(void *data) int val, btn_type, report = jack->status; if (rt5670->pdata.jd_mode == 1) /* 2 port */ - val = snd_soc_read(rt5670->codec, RT5670_A_JD_CTRL1) & 0x0070; + val = snd_soc_component_read32(rt5670->component, RT5670_A_JD_CTRL1) & 0x0070; else - val = snd_soc_read(rt5670->codec, RT5670_A_JD_CTRL1) & 0x0020; + val = snd_soc_component_read32(rt5670->component, RT5670_A_JD_CTRL1) & 0x0020; switch (val) { /* jack in */ case 0x30: /* 2 port */ case 0x0: /* 1 port or 2 port */ if (rt5670->jack_type == 0) { - report = rt5670_headset_detect(rt5670->codec, 1); + report = rt5670_headset_detect(rt5670->component, 1); /* for push button and jack out */ gpio->debounce_time = 25; break; } btn_type = 0; - if (snd_soc_read(rt5670->codec, RT5670_INT_IRQ_ST) & 0x4) { + if (snd_soc_component_read32(rt5670->component, RT5670_INT_IRQ_ST) & 0x4) { /* button pressed */ report = SND_JACK_HEADSET; - btn_type = rt5670_button_detect(rt5670->codec); + btn_type = rt5670_button_detect(rt5670->component); switch (btn_type) { case 0x2000: /* up */ report |= SND_JACK_BTN_1; @@ -551,7 +551,7 @@ static int rt5670_irq_detection(void *data) report |= SND_JACK_BTN_2; break; default: - dev_err(rt5670->codec->dev, + dev_err(rt5670->component->dev, "Unexpected button code 0x%04x\n", btn_type); break; @@ -566,8 +566,8 @@ static int rt5670_irq_detection(void *data) case 0x10: /* 2 port */ case 0x20: /* 1 port */ report = 0; - snd_soc_update_bits(rt5670->codec, RT5670_INT_IRQ_ST, 0x1, 0x0); - rt5670_headset_detect(rt5670->codec, 0); + snd_soc_component_update_bits(rt5670->component, RT5670_INT_IRQ_ST, 0x1, 0x0); + rt5670_headset_detect(rt5670->component, 0); gpio->debounce_time = 150; /* for jack in */ break; default: @@ -577,14 +577,14 @@ static int rt5670_irq_detection(void *data) return report; } -int rt5670_set_jack_detect(struct snd_soc_codec *codec, +int rt5670_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); int ret; rt5670->jack = jack; - rt5670->hp_gpio.gpiod_dev = codec->dev; + rt5670->hp_gpio.gpiod_dev = component->dev; rt5670->hp_gpio.name = "headset"; rt5670->hp_gpio.report = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2; @@ -596,7 +596,7 @@ int rt5670_set_jack_detect(struct snd_soc_codec *codec, ret = snd_soc_jack_add_gpios(rt5670->jack, 1, &rt5670->hp_gpio); if (ret) { - dev_err(codec->dev, "Adding jack GPIO failed\n"); + dev_err(component->dev, "Adding jack GPIO failed\n"); return ret; } @@ -699,17 +699,17 @@ static const struct snd_kcontrol_new rt5670_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5670->sysclk / rl6231_get_pre_div(rt5670->regmap, RT5670_ADDA_CLK1, RT5670_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else - snd_soc_update_bits(codec, RT5670_DMIC_CTRL1, + snd_soc_component_update_bits(component, RT5670_DMIC_CTRL1, RT5670_DMIC_CLK_MASK, idx << RT5670_DMIC_CLK_SFT); return idx; } @@ -717,8 +717,8 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); if (rt5670->sysclk_src == RT5670_SCLK_S_PLL1) return 1; @@ -729,7 +729,7 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, static int is_using_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); unsigned int reg, shift, val; switch (source->shift) { @@ -765,7 +765,7 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source, return 0; } - val = (snd_soc_read(codec, reg) >> shift) & 0xf; + val = (snd_soc_component_read32(component, reg) >> shift) & 0xf; switch (val) { case 1: case 2: @@ -781,8 +781,8 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source, static int can_use_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); if (rt5670->sysclk > rt5670->lrck[RT5670_AIF1] * 384) return 1; @@ -793,7 +793,7 @@ static int can_use_asrc(struct snd_soc_dapm_widget *source, /** * rt5670_sel_asrc_clk_src - select ASRC clock source for a set of filters - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @filter_mask: mask of filters. * @clk_src: clock source * @@ -805,7 +805,7 @@ static int can_use_asrc(struct snd_soc_dapm_widget *source, * set of filters specified by the mask. And the codec driver will turn on ASRC * for these filters if ASRC is selected as their clock source. */ -int rt5670_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5670_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { unsigned int asrc2_mask = 0, asrc2_value = 0; @@ -863,11 +863,11 @@ int rt5670_sel_asrc_clk_src(struct snd_soc_codec *codec, } if (asrc2_mask) - snd_soc_update_bits(codec, RT5670_ASRC_2, + snd_soc_component_update_bits(component, RT5670_ASRC_2, asrc2_mask, asrc2_value); if (asrc3_mask) - snd_soc_update_bits(codec, RT5670_ASRC_3, + snd_soc_component_update_bits(component, RT5670_ASRC_3, asrc3_mask, asrc3_value); return 0; } @@ -1421,8 +1421,8 @@ static const struct snd_kcontrol_new rt5670_vad_adc_mux = static int rt5670_hp_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -1457,8 +1457,8 @@ static int rt5670_hp_power_event(struct snd_soc_dapm_widget *w, static int rt5670_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -1507,16 +1507,16 @@ static int rt5670_hp_event(struct snd_soc_dapm_widget *w, static int rt5670_bst1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5670_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, RT5670_PWR_BST1_P, RT5670_PWR_BST1_P); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5670_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, RT5670_PWR_BST1_P, 0); break; @@ -1530,16 +1530,16 @@ static int rt5670_bst1_event(struct snd_soc_dapm_widget *w, static int rt5670_bst2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, RT5670_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, RT5670_PWR_BST2_P, RT5670_PWR_BST2_P); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, RT5670_PWR_ANLG2, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, RT5670_PWR_BST2_P, 0); break; @@ -2322,21 +2322,21 @@ static const struct snd_soc_dapm_route rt5672_specific_dapm_routes[] = { static int rt5670_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, bclk_ms, frame_size; rt5670->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5670->sysclk, rt5670->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n", + dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", rt5670->lrck[dai->id], dai->id); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } bclk_ms = frame_size > 32; @@ -2368,20 +2368,20 @@ static int rt5670_hw_params(struct snd_pcm_substream *substream, mask_clk = RT5670_I2S_BCLK_MS1_MASK | RT5670_I2S_PD1_MASK; val_clk = bclk_ms << RT5670_I2S_BCLK_MS1_SFT | pre_div << RT5670_I2S_PD1_SFT; - snd_soc_update_bits(codec, RT5670_I2S1_SDP, + snd_soc_component_update_bits(component, RT5670_I2S1_SDP, RT5670_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5670_ADDA_CLK1, mask_clk, val_clk); break; case RT5670_AIF2: mask_clk = RT5670_I2S_BCLK_MS2_MASK | RT5670_I2S_PD2_MASK; val_clk = bclk_ms << RT5670_I2S_BCLK_MS2_SFT | pre_div << RT5670_I2S_PD2_SFT; - snd_soc_update_bits(codec, RT5670_I2S2_SDP, + snd_soc_component_update_bits(component, RT5670_I2S2_SDP, RT5670_I2S_DL_MASK, val_len); - snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk); + snd_soc_component_update_bits(component, RT5670_ADDA_CLK1, mask_clk, val_clk); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } @@ -2390,8 +2390,8 @@ static int rt5670_hw_params(struct snd_pcm_substream *substream, static int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -2434,26 +2434,26 @@ static int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) switch (dai->id) { case RT5670_AIF1: - snd_soc_update_bits(codec, RT5670_I2S1_SDP, + snd_soc_component_update_bits(component, RT5670_I2S1_SDP, RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK | RT5670_I2S_DF_MASK, reg_val); break; case RT5670_AIF2: - snd_soc_update_bits(codec, RT5670_I2S2_SDP, + snd_soc_component_update_bits(component, RT5670_I2S2_SDP, RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK | RT5670_I2S_DF_MASK, reg_val); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } return 0; } -static int rt5670_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, +static int rt5670_set_codec_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (clk_id) { @@ -2467,16 +2467,16 @@ static int rt5670_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, reg_val |= RT5670_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, RT5670_GLB_CLK, + snd_soc_component_update_bits(component, RT5670_GLB_CLK, RT5670_SCLK_SRC_MASK, reg_val); rt5670->sysclk = freq; if (clk_id != RT5670_SCLK_S_RCCLK) rt5670->sysclk_src = clk_id; - dev_dbg(codec->dev, "Sysclk : %dHz clock id : %d\n", freq, clk_id); + dev_dbg(component->dev, "Sysclk : %dHz clock id : %d\n", freq, clk_id); return 0; } @@ -2484,8 +2484,8 @@ static int rt5670_set_codec_sysclk(struct snd_soc_codec *codec, int clk_id, static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -2494,18 +2494,18 @@ static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5670->pll_in = 0; rt5670->pll_out = 0; - snd_soc_update_bits(codec, RT5670_GLB_CLK, + snd_soc_component_update_bits(component, RT5670_GLB_CLK, RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_MCLK); return 0; } switch (source) { case RT5670_PLL1_S_MCLK: - snd_soc_update_bits(codec, RT5670_GLB_CLK, + snd_soc_component_update_bits(component, RT5670_GLB_CLK, RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_MCLK); break; case RT5670_PLL1_S_BCLK1: @@ -2514,36 +2514,36 @@ static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, case RT5670_PLL1_S_BCLK4: switch (dai->id) { case RT5670_AIF1: - snd_soc_update_bits(codec, RT5670_GLB_CLK, + snd_soc_component_update_bits(component, RT5670_GLB_CLK, RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK1); break; case RT5670_AIF2: - snd_soc_update_bits(codec, RT5670_GLB_CLK, + snd_soc_component_update_bits(component, RT5670_GLB_CLK, RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK2); break; default: - dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id); + dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); return -EINVAL; } break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); - snd_soc_write(codec, RT5670_PLL_CTRL1, + snd_soc_component_write(component, RT5670_PLL_CTRL1, pll_code.n_code << RT5670_PLL_N_SFT | pll_code.k_code); - snd_soc_write(codec, RT5670_PLL_CTRL2, + snd_soc_component_write(component, RT5670_PLL_CTRL2, (pll_code.m_bp ? 0 : pll_code.m_code) << RT5670_PLL_M_SFT | pll_code.m_bp << RT5670_PLL_M_BP_SFT); @@ -2557,7 +2557,7 @@ static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt5670_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val = 0; if (rx_mask || tx_mask) @@ -2595,75 +2595,75 @@ static int rt5670_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return -EINVAL; } - snd_soc_update_bits(codec, RT5670_TDM_CTRL_1, 0x7c00, val); + snd_soc_component_update_bits(component, RT5670_TDM_CTRL_1, 0x7c00, val); return 0; } static int rt5670_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio); + dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); if (dai->id != RT5670_AIF1) return 0; if ((ratio % 50) == 0) - snd_soc_update_bits(codec, RT5670_GEN_CTRL3, + snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, RT5670_TDM_DATA_MODE_SEL, RT5670_TDM_DATA_MODE_50FS); else - snd_soc_update_bits(codec, RT5670_GEN_CTRL3, + snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, RT5670_TDM_DATA_MODE_SEL, RT5670_TDM_DATA_MODE_NOR); return 0; } -static int rt5670_set_bias_level(struct snd_soc_codec *codec, +static int rt5670_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_PREPARE: - if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) { - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) { + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_PWR_VREF1 | RT5670_PWR_MB | RT5670_PWR_BG | RT5670_PWR_VREF2, RT5670_PWR_VREF1 | RT5670_PWR_MB | RT5670_PWR_BG | RT5670_PWR_VREF2); mdelay(10); - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_PWR_FV1 | RT5670_PWR_FV2, RT5670_PWR_FV1 | RT5670_PWR_FV2); - snd_soc_update_bits(codec, RT5670_CHARGE_PUMP, + snd_soc_component_update_bits(component, RT5670_CHARGE_PUMP, RT5670_OSW_L_MASK | RT5670_OSW_R_MASK, RT5670_OSW_L_DIS | RT5670_OSW_R_DIS); - snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x1); - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_DIG_MISC, 0x1, 0x1); + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_LDO_SEL_MASK, 0x5); } break; case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_PWR_VREF1 | RT5670_PWR_VREF2 | RT5670_PWR_FV1 | RT5670_PWR_FV2, 0); - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_LDO_SEL_MASK, 0x3); break; case SND_SOC_BIAS_OFF: if (rt5670->pdata.jd_mode) - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_PWR_VREF1 | RT5670_PWR_MB | RT5670_PWR_BG | RT5670_PWR_VREF2 | RT5670_PWR_FV1 | RT5670_PWR_FV2, RT5670_PWR_MB | RT5670_PWR_BG); else - snd_soc_update_bits(codec, RT5670_PWR_ANLG1, + snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, RT5670_PWR_VREF1 | RT5670_PWR_MB | RT5670_PWR_BG | RT5670_PWR_VREF2 | RT5670_PWR_FV1 | RT5670_PWR_FV2, 0); - snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x0); + snd_soc_component_update_bits(component, RT5670_DIG_MISC, 0x1, 0x0); break; default: @@ -2673,12 +2673,12 @@ static int rt5670_set_bias_level(struct snd_soc_codec *codec, return 0; } -static int rt5670_probe(struct snd_soc_codec *codec) +static int rt5670_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); - switch (snd_soc_read(codec, RT5670_RESET) & RT5670_ID_MASK) { + switch (snd_soc_component_read32(component, RT5670_RESET) & RT5670_ID_MASK) { case RT5670_ID_5670: case RT5670_ID_5671: snd_soc_dapm_new_controls(dapm, @@ -2697,37 +2697,36 @@ static int rt5670_probe(struct snd_soc_codec *codec) ARRAY_SIZE(rt5672_specific_dapm_routes)); break; default: - dev_err(codec->dev, + dev_err(component->dev, "The driver is for RT5670 RT5671 or RT5672 only\n"); return -ENODEV; } - rt5670->codec = codec; + rt5670->component = component; return 0; } -static int rt5670_remove(struct snd_soc_codec *codec) +static void rt5670_remove(struct snd_soc_component *component) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); regmap_write(rt5670->regmap, RT5670_RESET, 0); snd_soc_jack_free_gpios(rt5670->jack, 1, &rt5670->hp_gpio); - return 0; } #ifdef CONFIG_PM -static int rt5670_suspend(struct snd_soc_codec *codec) +static int rt5670_suspend(struct snd_soc_component *component) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5670->regmap, true); regcache_mark_dirty(rt5670->regmap); return 0; } -static int rt5670_resume(struct snd_soc_codec *codec) +static int rt5670_resume(struct snd_soc_component *component) { - struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec); + struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); regcache_cache_only(rt5670->regmap, false); regcache_sync(rt5670->regmap); @@ -2794,22 +2793,22 @@ static struct snd_soc_dai_driver rt5670_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5670 = { - .probe = rt5670_probe, - .remove = rt5670_remove, - .suspend = rt5670_suspend, - .resume = rt5670_resume, - .set_bias_level = rt5670_set_bias_level, - .idle_bias_off = true, - .set_sysclk = rt5670_set_codec_sysclk, - .component_driver = { - .controls = rt5670_snd_controls, - .num_controls = ARRAY_SIZE(rt5670_snd_controls), - .dapm_widgets = rt5670_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5670_dapm_widgets), - .dapm_routes = rt5670_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5670_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5670 = { + .probe = rt5670_probe, + .remove = rt5670_remove, + .suspend = rt5670_suspend, + .resume = rt5670_resume, + .set_bias_level = rt5670_set_bias_level, + .set_sysclk = rt5670_set_codec_sysclk, + .controls = rt5670_snd_controls, + .num_controls = ARRAY_SIZE(rt5670_snd_controls), + .dapm_widgets = rt5670_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5670_dapm_widgets), + .dapm_routes = rt5670_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5670_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5670_regmap = { @@ -3171,7 +3170,8 @@ static int rt5670_i2c_probe(struct i2c_client *i2c, pm_runtime_enable(&i2c->dev); pm_request_idle(&i2c->dev); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5670, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5670, rt5670_dai, ARRAY_SIZE(rt5670_dai)); if (ret < 0) goto err; @@ -3188,7 +3188,6 @@ err: static int rt5670_i2c_remove(struct i2c_client *i2c) { pm_runtime_disable(&i2c->dev); - snd_soc_unregister_codec(&i2c->dev); return 0; } diff --git a/sound/soc/codecs/rt5670.h b/sound/soc/codecs/rt5670.h index 265df80d504e..97e8eebe63fa 100644 --- a/sound/soc/codecs/rt5670.h +++ b/sound/soc/codecs/rt5670.h @@ -1986,11 +1986,11 @@ enum { RT5670_DOWN_RATE_FILTER = (0x1 << 7), }; -int rt5670_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5670_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); struct rt5670_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5670_platform_data pdata; struct regmap *regmap; struct snd_soc_jack *jack; @@ -2012,8 +2012,8 @@ struct rt5670_priv { int jack_type_saved; }; -void rt5670_jack_suspend(struct snd_soc_codec *codec); -void rt5670_jack_resume(struct snd_soc_codec *codec); -int rt5670_set_jack_detect(struct snd_soc_codec *codec, +void rt5670_jack_suspend(struct snd_soc_component *component); +void rt5670_jack_resume(struct snd_soc_component *component); +int rt5670_set_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack); #endif /* __RT5670_H__ */ diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c index 0791fec398fb..bc1a23dd7c2d 100644 --- a/sound/soc/codecs/rt5677.c +++ b/sound/soc/codecs/rt5677.c @@ -554,7 +554,7 @@ static bool rt5677_readable_register(struct device *dev, unsigned int reg) static int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677, unsigned int addr, unsigned int value, unsigned int opcode) { - struct snd_soc_codec *codec = rt5677->codec; + struct snd_soc_component *component = rt5677->component; int ret; mutex_lock(&rt5677->dsp_cmd_lock); @@ -562,35 +562,35 @@ static int rt5677_dsp_mode_i2c_write_addr(struct rt5677_priv *rt5677, ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB, addr >> 16); if (ret < 0) { - dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret); + dev_err(component->dev, "Failed to set addr msb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB, addr & 0xffff); if (ret < 0) { - dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret); + dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_MSB, value >> 16); if (ret < 0) { - dev_err(codec->dev, "Failed to set data msb value: %d\n", ret); + dev_err(component->dev, "Failed to set data msb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_DATA_LSB, value & 0xffff); if (ret < 0) { - dev_err(codec->dev, "Failed to set data lsb value: %d\n", ret); + dev_err(component->dev, "Failed to set data lsb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE, opcode); if (ret < 0) { - dev_err(codec->dev, "Failed to set op code value: %d\n", ret); + dev_err(component->dev, "Failed to set op code value: %d\n", ret); goto err; } @@ -612,7 +612,7 @@ err: static int rt5677_dsp_mode_i2c_read_addr( struct rt5677_priv *rt5677, unsigned int addr, unsigned int *value) { - struct snd_soc_codec *codec = rt5677->codec; + struct snd_soc_component *component = rt5677->component; int ret; unsigned int msb, lsb; @@ -621,21 +621,21 @@ static int rt5677_dsp_mode_i2c_read_addr( ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_MSB, addr >> 16); if (ret < 0) { - dev_err(codec->dev, "Failed to set addr msb value: %d\n", ret); + dev_err(component->dev, "Failed to set addr msb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_ADDR_LSB, addr & 0xffff); if (ret < 0) { - dev_err(codec->dev, "Failed to set addr lsb value: %d\n", ret); + dev_err(component->dev, "Failed to set addr lsb value: %d\n", ret); goto err; } ret = regmap_write(rt5677->regmap_physical, RT5677_DSP_I2C_OP_CODE, 0x0002); if (ret < 0) { - dev_err(codec->dev, "Failed to set op code value: %d\n", ret); + dev_err(component->dev, "Failed to set op code value: %d\n", ret); goto err; } @@ -685,9 +685,9 @@ static int rt5677_dsp_mode_i2c_read( return ret; } -static void rt5677_set_dsp_mode(struct snd_soc_codec *codec, bool on) +static void rt5677_set_dsp_mode(struct snd_soc_component *component, bool on) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); if (on) { regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x2, 0x2); @@ -698,9 +698,9 @@ static void rt5677_set_dsp_mode(struct snd_soc_codec *codec, bool on) } } -static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) +static int rt5677_set_dsp_vad(struct snd_soc_component *component, bool on) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); static bool activity; int ret; @@ -740,17 +740,17 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) } regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x07ff); regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x07fd); - rt5677_set_dsp_mode(codec, true); + rt5677_set_dsp_mode(component, true); ret = request_firmware(&rt5677->fw1, RT5677_FIRMWARE1, - codec->dev); + component->dev); if (ret == 0) { rt5677_spi_write_firmware(0x50000000, rt5677->fw1); release_firmware(rt5677->fw1); } ret = request_firmware(&rt5677->fw2, RT5677_FIRMWARE2, - codec->dev); + component->dev); if (ret == 0) { rt5677_spi_write_firmware(0x60000000, rt5677->fw2); release_firmware(rt5677->fw2); @@ -767,7 +767,7 @@ static int rt5677_set_dsp_vad(struct snd_soc_codec *codec, bool on) regcache_cache_bypass(rt5677->regmap, true); regmap_update_bits(rt5677->regmap, RT5677_PWR_DSP1, 0x1, 0x1); - rt5677_set_dsp_mode(codec, false); + rt5677_set_dsp_mode(component, false); regmap_write(rt5677->regmap, RT5677_PWR_DSP1, 0x0001); regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec); @@ -812,12 +812,11 @@ static int rt5677_dsp_vad_put(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); rt5677->dsp_vad_en = !!ucontrol->value.integer.value[0]; - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) - rt5677_set_dsp_vad(codec, rt5677->dsp_vad_en); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) + rt5677_set_dsp_vad(component, rt5677->dsp_vad_en); return 0; } @@ -911,15 +910,15 @@ static const struct snd_kcontrol_new rt5677_snd_controls[] = { static int set_dmic_clk(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); int idx, rate; rate = rt5677->sysclk / rl6231_get_pre_div(rt5677->regmap, RT5677_CLK_TREE_CTRL1, RT5677_I2S_PD1_SFT); idx = rl6231_calc_dmic_clk(rate); if (idx < 0) - dev_err(codec->dev, "Failed to set DMIC clock\n"); + dev_err(component->dev, "Failed to set DMIC clock\n"); else regmap_update_bits(rt5677->regmap, RT5677_DMIC_CTRL1, RT5677_DMIC_CLK_MASK, idx << RT5677_DMIC_CLK_SFT); @@ -929,8 +928,8 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w, static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int val; regmap_read(rt5677->regmap, RT5677_GLB_CLK1, &val); @@ -944,8 +943,8 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, static int is_using_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int reg, shift, val; if (source->reg == RT5677_ASRC_1) { @@ -1027,8 +1026,8 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source, static int can_use_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384) return 1; @@ -1038,7 +1037,7 @@ static int can_use_asrc(struct snd_soc_dapm_widget *source, /** * rt5677_sel_asrc_clk_src - select ASRC clock source for a set of filters - * @codec: SoC audio codec device. + * @component: SoC audio component device. * @filter_mask: mask of filters. * @clk_src: clock source * @@ -1050,10 +1049,10 @@ static int can_use_asrc(struct snd_soc_dapm_widget *source, * set of filters specified by the mask. And the codec driver will turn on ASRC * for these filters if ASRC is selected as their clock source. */ -int rt5677_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5677_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int asrc3_mask = 0, asrc3_value = 0; unsigned int asrc4_mask = 0, asrc4_value = 0; unsigned int asrc5_mask = 0, asrc5_value = 0; @@ -1232,8 +1231,8 @@ EXPORT_SYMBOL_GPL(rt5677_sel_asrc_clk_src); static int rt5677_dmic_use_asrc(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int asrc_setting; switch (source->shift) { @@ -2393,8 +2392,8 @@ static const struct snd_kcontrol_new rt5677_if2_dac7_tdm_sel_mux = static int rt5677_bst1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -2417,8 +2416,8 @@ static int rt5677_bst1_event(struct snd_soc_dapm_widget *w, static int rt5677_bst2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -2441,8 +2440,8 @@ static int rt5677_bst2_event(struct snd_soc_dapm_widget *w, static int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -2463,8 +2462,8 @@ static int rt5677_set_pll1_event(struct snd_soc_dapm_widget *w, static int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -2485,8 +2484,8 @@ static int rt5677_set_pll2_event(struct snd_soc_dapm_widget *w, static int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: @@ -2512,8 +2511,8 @@ static int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w, static int rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int value; switch (event) { @@ -2535,8 +2534,8 @@ static int rt5677_if1_adc_tdm_event(struct snd_soc_dapm_widget *w, static int rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int value; switch (event) { @@ -2558,12 +2557,12 @@ static int rt5677_if2_adc_tdm_event(struct snd_soc_dapm_widget *w, static int rt5677_vref_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: - if (snd_soc_codec_get_bias_level(codec) != SND_SOC_BIAS_ON && + if (snd_soc_component_get_bias_level(component) != SND_SOC_BIAS_ON && !rt5677->is_vref_slow) { mdelay(20); regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1, @@ -4098,21 +4097,21 @@ static const struct snd_soc_dapm_route rt5677_dmic2_clk_2[] = { static int rt5677_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int val_len = 0, val_clk, mask_clk; int pre_div, bclk_ms, frame_size; rt5677->lrck[dai->id] = params_rate(params); pre_div = rl6231_get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]); if (pre_div < 0) { - dev_err(codec->dev, "Unsupported clock setting: sysclk=%dHz lrck=%dHz\n", + dev_err(component->dev, "Unsupported clock setting: sysclk=%dHz lrck=%dHz\n", rt5677->sysclk, rt5677->lrck[dai->id]); return -EINVAL; } frame_size = snd_soc_params_to_frame_size(params); if (frame_size < 0) { - dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size); + dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); return -EINVAL; } bclk_ms = frame_size > 32; @@ -4183,8 +4182,8 @@ static int rt5677_hw_params(struct snd_pcm_substream *substream, static int rt5677_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -4257,8 +4256,8 @@ static int rt5677_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int rt5677_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int reg_val = 0; if (freq == rt5677->sysclk && clk_id == rt5677->sysclk_src) @@ -4275,7 +4274,7 @@ static int rt5677_set_dai_sysclk(struct snd_soc_dai *dai, reg_val |= RT5677_SCLK_SRC_RCCLK; break; default: - dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); return -EINVAL; } regmap_update_bits(rt5677->regmap, RT5677_GLB_CLK1, @@ -4310,8 +4309,8 @@ static int rt5677_pll_calc(const unsigned int freq_in, static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = dai->codec; - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); struct rl6231_pll_code pll_code; int ret; @@ -4320,7 +4319,7 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, return 0; if (!freq_in || !freq_out) { - dev_dbg(codec->dev, "PLL disabled\n"); + dev_dbg(component->dev, "PLL disabled\n"); rt5677->pll_in = 0; rt5677->pll_out = 0; @@ -4360,17 +4359,17 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, } break; default: - dev_err(codec->dev, "Unknown PLL source %d\n", source); + dev_err(component->dev, "Unknown PLL source %d\n", source); return -EINVAL; } ret = rt5677_pll_calc(freq_in, freq_out, &pll_code); if (ret < 0) { - dev_err(codec->dev, "Unsupport input clock %d\n", freq_in); + dev_err(component->dev, "Unsupport input clock %d\n", freq_in); return ret; } - dev_dbg(codec->dev, "m_bypass=%d m=%d n=%d k=%d\n", + dev_dbg(component->dev, "m_bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, pll_code.k_code); @@ -4390,8 +4389,8 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, static int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); unsigned int val = 0, slot_width_25 = 0; if (rx_mask || tx_mask) @@ -4449,18 +4448,18 @@ static int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, return 0; } -static int rt5677_set_bias_level(struct snd_soc_codec *codec, +static int rt5677_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) { - rt5677_set_dsp_vad(codec, false); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) { + rt5677_set_dsp_vad(component, false); regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG1, RT5677_LDO1_SEL_MASK | RT5677_LDO2_SEL_MASK, @@ -4495,7 +4494,7 @@ static int rt5677_set_bias_level(struct snd_soc_codec *codec, RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000); if (rt5677->dsp_vad_en) - rt5677_set_dsp_vad(codec, true); + rt5677_set_dsp_vad(component, true); break; default: @@ -4696,13 +4695,13 @@ static void rt5677_free_gpio(struct i2c_client *i2c) } #endif -static int rt5677_probe(struct snd_soc_codec *codec) +static int rt5677_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); int i; - rt5677->codec = codec; + rt5677->component = component; if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) { snd_soc_dapm_add_routes(dapm, @@ -4714,7 +4713,7 @@ static int rt5677_probe(struct snd_soc_codec *codec) ARRAY_SIZE(rt5677_dmic2_clk_1)); } - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_OFF); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); regmap_write(rt5677->regmap, RT5677_DIG_MISC, 0x0020); regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x0c00); @@ -4753,21 +4752,19 @@ static int rt5677_probe(struct snd_soc_codec *codec) return 0; } -static int rt5677_remove(struct snd_soc_codec *codec) +static void rt5677_remove(struct snd_soc_component *component) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); regmap_write(rt5677->regmap, RT5677_RESET, 0x10ec); gpiod_set_value_cansleep(rt5677->pow_ldo2, 0); gpiod_set_value_cansleep(rt5677->reset_pin, 1); - - return 0; } #ifdef CONFIG_PM -static int rt5677_suspend(struct snd_soc_codec *codec) +static int rt5677_suspend(struct snd_soc_component *component) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); if (!rt5677->dsp_vad_en) { regcache_cache_only(rt5677->regmap, true); @@ -4780,9 +4777,9 @@ static int rt5677_suspend(struct snd_soc_codec *codec) return 0; } -static int rt5677_resume(struct snd_soc_codec *codec) +static int rt5677_resume(struct snd_soc_component *component) { - struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); + struct rt5677_priv *rt5677 = snd_soc_component_get_drvdata(component); if (!rt5677->dsp_vad_en) { rt5677->pll_src = 0; @@ -4959,21 +4956,21 @@ static struct snd_soc_dai_driver rt5677_dai[] = { }, }; -static const struct snd_soc_codec_driver soc_codec_dev_rt5677 = { - .probe = rt5677_probe, - .remove = rt5677_remove, - .suspend = rt5677_suspend, - .resume = rt5677_resume, - .set_bias_level = rt5677_set_bias_level, - .idle_bias_off = true, - .component_driver = { - .controls = rt5677_snd_controls, - .num_controls = ARRAY_SIZE(rt5677_snd_controls), - .dapm_widgets = rt5677_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(rt5677_dapm_widgets), - .dapm_routes = rt5677_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(rt5677_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_rt5677 = { + .probe = rt5677_probe, + .remove = rt5677_remove, + .suspend = rt5677_suspend, + .resume = rt5677_resume, + .set_bias_level = rt5677_set_bias_level, + .controls = rt5677_snd_controls, + .num_controls = ARRAY_SIZE(rt5677_snd_controls), + .dapm_widgets = rt5677_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt5677_dapm_widgets), + .dapm_routes = rt5677_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(rt5677_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config rt5677_regmap_physical = { @@ -5262,13 +5259,13 @@ static int rt5677_i2c_probe(struct i2c_client *i2c, rt5677_init_gpio(i2c); rt5677_init_irq(i2c); - return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5677, + return devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_rt5677, rt5677_dai, ARRAY_SIZE(rt5677_dai)); } static int rt5677_i2c_remove(struct i2c_client *i2c) { - snd_soc_unregister_codec(&i2c->dev); rt5677_free_irq(i2c); rt5677_free_gpio(i2c); diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h index 97239973edc4..183d92b03045 100644 --- a/sound/soc/codecs/rt5677.h +++ b/sound/soc/codecs/rt5677.h @@ -1790,7 +1790,7 @@ struct rt5677_platform_data { }; struct rt5677_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct rt5677_platform_data pdata; struct regmap *regmap, *regmap_physical; const struct firmware *fw1, *fw2; @@ -1816,7 +1816,7 @@ struct rt5677_priv { bool is_vref_slow; }; -int rt5677_sel_asrc_clk_src(struct snd_soc_codec *codec, +int rt5677_sel_asrc_clk_src(struct snd_soc_component *component, unsigned int filter_mask, unsigned int clk_src); #endif /* __RT5677_H__ */ diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index e1ab5537d27a..7c1d65830c05 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c @@ -147,19 +147,19 @@ struct sgtl5000_priv { static int mic_bias_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: /* change mic bias resistor */ - snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, SGTL5000_BIAS_R_MASK, sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, SGTL5000_BIAS_R_MASK, 0); break; } @@ -174,12 +174,12 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w, static int power_vag_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); const u32 mask = SGTL5000_DAC_POWERUP | SGTL5000_ADC_POWERUP; switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP); msleep(400); break; @@ -190,9 +190,9 @@ static int power_vag_event(struct snd_soc_dapm_widget *w, * operational to prevent inadvertently starving the * other one of them. */ - if ((snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER) & + if ((snd_soc_component_read32(component, SGTL5000_CHIP_ANA_POWER) & mask) != mask) { - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_VAG_POWERUP, 0); msleep(400); } @@ -216,17 +216,54 @@ static SOC_ENUM_SINGLE_DECL(adc_enum, static const struct snd_kcontrol_new adc_mux = SOC_DAPM_ENUM("Capture Mux", adc_enum); +/* input sources for headphone */ +static const char *hp_mux_text[] = { + "DAC", "LINE_IN" +}; + +static SOC_ENUM_SINGLE_DECL(hp_enum, + SGTL5000_CHIP_ANA_CTRL, 6, + hp_mux_text); + +static const struct snd_kcontrol_new hp_mux = +SOC_DAPM_ENUM("Headphone Mux", hp_enum); + /* input sources for DAC */ static const char *dac_mux_text[] = { - "DAC", "LINE_IN" + "ADC", "I2S", "Rsvrd", "DAP" }; static SOC_ENUM_SINGLE_DECL(dac_enum, - SGTL5000_CHIP_ANA_CTRL, 6, + SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAC_SEL_SHIFT, dac_mux_text); static const struct snd_kcontrol_new dac_mux = -SOC_DAPM_ENUM("Headphone Mux", dac_enum); +SOC_DAPM_ENUM("Digital Input Mux", dac_enum); + +/* input sources for DAP */ +static const char *dap_mux_text[] = { + "ADC", "I2S" +}; + +static SOC_ENUM_SINGLE_DECL(dap_enum, + SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAP_SEL_SHIFT, + dap_mux_text); + +static const struct snd_kcontrol_new dap_mux = +SOC_DAPM_ENUM("DAP Mux", dap_enum); + +/* input sources for DAP mix */ +static const char *dapmix_mux_text[] = { + "ADC", "I2S" +}; + +static SOC_ENUM_SINGLE_DECL(dapmix_enum, + SGTL5000_CHIP_SSS_CTRL, SGTL5000_DAP_MIX_SEL_SHIFT, + dapmix_mux_text); + +static const struct snd_kcontrol_new dapmix_mux = +SOC_DAPM_ENUM("DAP MIX Mux", dapmix_enum); + static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = { SND_SOC_DAPM_INPUT("LINE_IN"), @@ -243,7 +280,12 @@ static const struct snd_soc_dapm_widget sgtl5000_dapm_widgets[] = { SND_SOC_DAPM_PGA("LO", SGTL5000_CHIP_ANA_POWER, 0, 0, NULL, 0), SND_SOC_DAPM_MUX("Capture Mux", SND_SOC_NOPM, 0, 0, &adc_mux), - SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &dac_mux), + SND_SOC_DAPM_MUX("Headphone Mux", SND_SOC_NOPM, 0, 0, &hp_mux), + SND_SOC_DAPM_MUX("Digital Input Mux", SND_SOC_NOPM, 0, 0, &dac_mux), + SND_SOC_DAPM_MUX("DAP Mux", SGTL5000_DAP_CTRL, 0, 0, &dap_mux), + SND_SOC_DAPM_MUX("DAP MIX Mux", SGTL5000_DAP_CTRL, 4, 0, &dapmix_mux), + SND_SOC_DAPM_MIXER("DAP", SGTL5000_CHIP_DIG_POWER, 4, 0, NULL, 0), + /* aif for i2s input */ SND_SOC_DAPM_AIF_IN("AIFIN", "Playback", @@ -270,7 +312,19 @@ static const struct snd_soc_dapm_route sgtl5000_dapm_routes[] = { {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */ {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */ - {"DAC", NULL, "AIFIN"}, /* i2s-->dac,skip audio mux */ + {"DAP Mux", "ADC", "ADC"}, /* adc --> DAP mux */ + {"DAP Mux", NULL, "AIFIN"}, /* i2s --> DAP mux */ + {"DAP", NULL, "DAP Mux"}, /* DAP mux --> dap */ + + {"DAP MIX Mux", "ADC", "ADC"}, /* adc --> DAP MIX mux */ + {"DAP MIX Mux", NULL, "AIFIN"}, /* i2s --> DAP MIX mux */ + {"DAP", NULL, "DAP MIX Mux"}, /* DAP MIX mux --> dap */ + + {"Digital Input Mux", "ADC", "ADC"}, /* adc --> audio mux */ + {"Digital Input Mux", NULL, "AIFIN"}, /* i2s --> audio mux */ + {"Digital Input Mux", NULL, "DAP"}, /* dap --> audio mux */ + {"DAC", NULL, "Digital Input Mux"}, /* audio mux --> dac */ + {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */ {"LO", NULL, "DAC"}, /* dac --> line_out */ @@ -318,12 +372,12 @@ static int dac_info_volsw(struct snd_kcontrol *kcontrol, static int dac_get_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int reg; int l; int r; - reg = snd_soc_read(codec, SGTL5000_CHIP_DAC_VOL); + reg = snd_soc_component_read32(component, SGTL5000_CHIP_DAC_VOL); /* get left channel volume */ l = (reg & SGTL5000_DAC_VOL_LEFT_MASK) >> SGTL5000_DAC_VOL_LEFT_SHIFT; @@ -371,7 +425,7 @@ static int dac_get_volsw(struct snd_kcontrol *kcontrol, static int dac_put_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int reg; int l; int r; @@ -391,7 +445,7 @@ static int dac_put_volsw(struct snd_kcontrol *kcontrol, reg = l << SGTL5000_DAC_VOL_LEFT_SHIFT | r << SGTL5000_DAC_VOL_RIGHT_SHIFT; - snd_soc_write(codec, SGTL5000_CHIP_DAC_VOL, reg); + snd_soc_component_write(component, SGTL5000_CHIP_DAC_VOL, reg); return 0; } @@ -409,9 +463,9 @@ static int dac_put_volsw(struct snd_kcontrol *kcontrol, static int avc_get_threshold(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int db, i; - u16 reg = snd_soc_read(codec, SGTL5000_DAP_AVC_THRESHOLD); + u16 reg = snd_soc_component_read32(component, SGTL5000_DAP_AVC_THRESHOLD); /* register value 0 => -96dB */ if (!reg) { @@ -442,7 +496,7 @@ static int avc_get_threshold(struct snd_kcontrol *kcontrol, static int avc_put_threshold(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); int db; u16 reg; @@ -450,7 +504,7 @@ static int avc_put_threshold(struct snd_kcontrol *kcontrol, if (db < 0 || db > 96) return -EINVAL; reg = avc_thr_db2reg[db]; - snd_soc_write(codec, SGTL5000_DAP_AVC_THRESHOLD, reg); + snd_soc_component_write(component, SGTL5000_DAP_AVC_THRESHOLD, reg); return 0; } @@ -463,6 +517,12 @@ static const DECLARE_TLV_DB_RANGE(mic_gain_tlv, 1, 3, TLV_DB_SCALE_ITEM(2000, 1000, 0) ); +/* tlv for DAP channels, 0% - 100% - 200% */ +static const DECLARE_TLV_DB_SCALE(dap_volume, 0, 1, 0); + +/* tlv for bass bands, -11.75db to 12.0db, step .25db */ +static const DECLARE_TLV_DB_SCALE(bass_band, -1175, 25, 0); + /* tlv for hp volume, -51.5db to 12.0db, step .5db */ static const DECLARE_TLV_DB_SCALE(headphone_volume, -5150, 50, 0); @@ -514,6 +574,11 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = { lineout_volume), SOC_SINGLE("Lineout Playback Switch", SGTL5000_CHIP_ANA_CTRL, 8, 1, 1), + SOC_SINGLE_TLV("DAP Main channel", SGTL5000_DAP_MAIN_CHAN, + 0, 0xffff, 0, dap_volume), + + SOC_SINGLE_TLV("DAP Mix channel", SGTL5000_DAP_MIX_CHAN, + 0, 0xffff, 0, dap_volume), /* Automatic Volume Control (DAP AVC) */ SOC_SINGLE("AVC Switch", SGTL5000_DAP_AVC_CTRL, 0, 1, 0), SOC_SINGLE("AVC Hard Limiter Switch", SGTL5000_DAP_AVC_CTRL, 5, 1, 0), @@ -523,16 +588,36 @@ static const struct snd_kcontrol_new sgtl5000_snd_controls[] = { SOC_SINGLE_EXT_TLV("AVC Threshold Volume", SGTL5000_DAP_AVC_THRESHOLD, 0, 96, 0, avc_get_threshold, avc_put_threshold, avc_threshold), + + SOC_SINGLE_TLV("BASS 0", SGTL5000_DAP_EQ_BASS_BAND0, + 0, 0x5F, 0, bass_band), + + SOC_SINGLE_TLV("BASS 1", SGTL5000_DAP_EQ_BASS_BAND1, + 0, 0x5F, 0, bass_band), + + SOC_SINGLE_TLV("BASS 2", SGTL5000_DAP_EQ_BASS_BAND2, + 0, 0x5F, 0, bass_band), + + SOC_SINGLE_TLV("BASS 3", SGTL5000_DAP_EQ_BASS_BAND3, + 0, 0x5F, 0, bass_band), + + SOC_SINGLE_TLV("BASS 4", SGTL5000_DAP_EQ_BASS_BAND4, + 0, 0x5F, 0, bass_band), }; /* mute the codec used by alsa core */ static int sgtl5000_digital_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; - u16 adcdac_ctrl = SGTL5000_DAC_MUTE_LEFT | SGTL5000_DAC_MUTE_RIGHT; + struct snd_soc_component *component = codec_dai->component; + u16 i2s_pwr = SGTL5000_I2S_IN_POWERUP; - snd_soc_update_bits(codec, SGTL5000_CHIP_ADCDAC_CTRL, - adcdac_ctrl, mute ? adcdac_ctrl : 0); + /* + * During 'digital mute' do not mute DAC + * because LINE_IN would be muted aswell. We want to mute + * only I2S block - this can be done by powering it off + */ + snd_soc_component_update_bits(component, SGTL5000_CHIP_DIG_POWER, + i2s_pwr, mute ? 0 : i2s_pwr); return 0; } @@ -540,8 +625,8 @@ static int sgtl5000_digital_mute(struct snd_soc_dai *codec_dai, int mute) /* set codec format */ static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); u16 i2sctl = 0; sgtl5000->master = 0; @@ -599,7 +684,7 @@ static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } - snd_soc_write(codec, SGTL5000_CHIP_I2S_CTRL, i2sctl); + snd_soc_component_write(component, SGTL5000_CHIP_I2S_CTRL, i2sctl); return 0; } @@ -608,8 +693,8 @@ static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int sgtl5000_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); switch (clk_id) { case SGTL5000_SYSCLK: @@ -635,9 +720,9 @@ static int sgtl5000_set_dai_sysclk(struct snd_soc_dai *codec_dai, * and above. * 3. usage of sys_mclk is preferred over pll to save power. */ -static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate) +static int sgtl5000_set_clock(struct snd_soc_component *component, int frame_rate) { - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); int clk_ctl = 0; int sys_fs; /* sample freq */ @@ -690,7 +775,7 @@ static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate) clk_ctl |= SGTL5000_SYS_FS_96k << SGTL5000_SYS_FS_SHIFT; break; default: - dev_err(codec->dev, "frame rate %d not supported\n", + dev_err(component->dev, "frame rate %d not supported\n", frame_rate); return -EINVAL; } @@ -719,9 +804,9 @@ static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate) clk_ctl |= SGTL5000_MCLK_FREQ_PLL << SGTL5000_MCLK_FREQ_SHIFT; } else { - dev_err(codec->dev, + dev_err(component->dev, "PLL not supported in slave mode\n"); - dev_err(codec->dev, "%d ratio is not supported. " + dev_err(component->dev, "%d ratio is not supported. " "SYS_MCLK needs to be 256, 384 or 512 * fs\n", sgtl5000->sysclk / frame_rate); return -EINVAL; @@ -754,31 +839,31 @@ static int sgtl5000_set_clock(struct snd_soc_codec *codec, int frame_rate) pll_ctl = int_div << SGTL5000_PLL_INT_DIV_SHIFT | frac_div << SGTL5000_PLL_FRAC_DIV_SHIFT; - snd_soc_write(codec, SGTL5000_CHIP_PLL_CTRL, pll_ctl); + snd_soc_component_write(component, SGTL5000_CHIP_PLL_CTRL, pll_ctl); if (div2) - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, SGTL5000_CHIP_CLK_TOP_CTRL, SGTL5000_INPUT_FREQ_DIV2, SGTL5000_INPUT_FREQ_DIV2); else - snd_soc_update_bits(codec, + snd_soc_component_update_bits(component, SGTL5000_CHIP_CLK_TOP_CTRL, SGTL5000_INPUT_FREQ_DIV2, 0); /* power up pll */ - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP, SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP); /* if using pll, clk_ctrl must be set after pll power up */ - snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, clk_ctl); + snd_soc_component_write(component, SGTL5000_CHIP_CLK_CTRL, clk_ctl); } else { /* otherwise, clk_ctrl must be set before pll power down */ - snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, clk_ctl); + snd_soc_component_write(component, SGTL5000_CHIP_CLK_CTRL, clk_ctl); /* power down pll */ - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_PLL_POWERUP | SGTL5000_VCOAMP_POWERUP, 0); } @@ -794,8 +879,8 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); int channels = params_channels(params); int i2s_ctl = 0; int stereo; @@ -803,7 +888,7 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, /* sysclk should already set */ if (!sgtl5000->sysclk) { - dev_err(codec->dev, "%s: set sysclk first!\n", __func__); + dev_err(component->dev, "%s: set sysclk first!\n", __func__); return -EFAULT; } @@ -813,11 +898,11 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, stereo = SGTL5000_ADC_STEREO; /* set mono to save power */ - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, stereo, + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, stereo, channels == 1 ? 0 : stereo); /* set codec clock base on lrclk */ - ret = sgtl5000_set_clock(codec, params_rate(params)); + ret = sgtl5000_set_clock(component, params_rate(params)); if (ret) return ret; @@ -851,7 +936,7 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; } - snd_soc_update_bits(codec, SGTL5000_CHIP_I2S_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_I2S_CTRL, SGTL5000_I2S_DLEN_MASK | SGTL5000_I2S_SCLKFREQ_MASK, i2s_ctl); @@ -868,19 +953,30 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream, * stop: * on --> prepare --> standby */ -static int sgtl5000_set_bias_level(struct snd_soc_codec *codec, +static int sgtl5000_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { + struct sgtl5000_priv *sgtl = snd_soc_component_get_drvdata(component); + int ret; + switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_STANDBY: - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + regcache_cache_only(sgtl->regmap, false); + ret = regcache_sync(sgtl->regmap); + if (ret) { + regcache_cache_only(sgtl->regmap, true); + return ret; + } + + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_REFTOP_POWERUP, SGTL5000_REFTOP_POWERUP); break; case SND_SOC_BIAS_OFF: - snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER, + regcache_cache_only(sgtl->regmap, true); + snd_soc_component_update_bits(component, SGTL5000_CHIP_ANA_POWER, SGTL5000_REFTOP_POWERUP, 0); break; } @@ -1020,7 +1116,7 @@ static const u8 vol_quot_table[] = { * 1. vddd provided by external or not * 2. vdda and vddio voltage value. > 3.1v or not */ -static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) +static int sgtl5000_set_power_regs(struct snd_soc_component *component) { int vddd; int vdda; @@ -1032,7 +1128,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) int vol_quot; int lo_vol; size_t i; - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); vdda = regulator_get_voltage(sgtl5000->supplies[VDDA].consumer); vddio = regulator_get_voltage(sgtl5000->supplies[VDDIO].consumer); @@ -1045,14 +1141,14 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) vddd = vddd / 1000; if (vdda <= 0 || vddio <= 0 || vddd < 0) { - dev_err(codec->dev, "regulator voltage not set correctly\n"); + dev_err(component->dev, "regulator voltage not set correctly\n"); return -EINVAL; } /* according to datasheet, maximum voltage of supplies */ if (vdda > 3600 || vddio > 3600 || vddd > 1980) { - dev_err(codec->dev, + dev_err(component->dev, "exceed max voltage vdda %dmV vddio %dmV vddd %dmV\n", vdda, vddio, vddd); @@ -1060,15 +1156,15 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) } /* reset value */ - ana_pwr = snd_soc_read(codec, SGTL5000_CHIP_ANA_POWER); + ana_pwr = snd_soc_component_read32(component, SGTL5000_CHIP_ANA_POWER); ana_pwr |= SGTL5000_DAC_STEREO | SGTL5000_ADC_STEREO | SGTL5000_REFTOP_POWERUP; - lreg_ctrl = snd_soc_read(codec, SGTL5000_CHIP_LINREG_CTRL); + lreg_ctrl = snd_soc_component_read32(component, SGTL5000_CHIP_LINREG_CTRL); if (vddio < 3100 && vdda < 3100) { /* enable internal oscillator used for charge pump */ - snd_soc_update_bits(codec, SGTL5000_CHIP_CLK_TOP_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_CLK_TOP_CTRL, SGTL5000_INT_OSC_EN, SGTL5000_INT_OSC_EN); /* Enable VDDC charge pump */ @@ -1081,9 +1177,9 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) SGTL5000_VDDC_MAN_ASSN_SHIFT; } - snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl); + snd_soc_component_write(component, SGTL5000_CHIP_LINREG_CTRL, lreg_ctrl); - snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, ana_pwr); + snd_soc_component_write(component, SGTL5000_CHIP_ANA_POWER, ana_pwr); /* * set ADC/DAC VAG to vdda / 2, @@ -1098,7 +1194,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) else vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP; - snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL, SGTL5000_ANA_GND_MASK, vag << SGTL5000_ANA_GND_SHIFT); /* set line out VAG to vddio / 2, in range (0.8v, 1.675v) */ @@ -1112,7 +1208,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) lo_vag = (lo_vag - SGTL5000_LINE_OUT_GND_BASE) / SGTL5000_LINE_OUT_GND_STP; - snd_soc_update_bits(codec, SGTL5000_CHIP_LINE_OUT_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_CTRL, SGTL5000_LINE_OUT_CURRENT_MASK | SGTL5000_LINE_OUT_GND_MASK, lo_vag << SGTL5000_LINE_OUT_GND_SHIFT | @@ -1135,7 +1231,7 @@ static int sgtl5000_set_power_regs(struct snd_soc_codec *codec) break; } - snd_soc_update_bits(codec, SGTL5000_CHIP_LINE_OUT_VOL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_LINE_OUT_VOL, SGTL5000_LINE_OUT_VOL_RIGHT_MASK | SGTL5000_LINE_OUT_VOL_LEFT_MASK, lo_vol << SGTL5000_LINE_OUT_VOL_RIGHT_SHIFT | @@ -1183,59 +1279,57 @@ static int sgtl5000_enable_regulators(struct i2c_client *client) return ret; } -static int sgtl5000_probe(struct snd_soc_codec *codec) +static int sgtl5000_probe(struct snd_soc_component *component) { int ret; u16 reg; - struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec); + struct sgtl5000_priv *sgtl5000 = snd_soc_component_get_drvdata(component); /* power up sgtl5000 */ - ret = sgtl5000_set_power_regs(codec); + ret = sgtl5000_set_power_regs(component); if (ret) goto err; /* enable small pop, introduce 400ms delay in turning off */ - snd_soc_update_bits(codec, SGTL5000_CHIP_REF_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_REF_CTRL, SGTL5000_SMALL_POP, 1); /* disable short cut detector */ - snd_soc_write(codec, SGTL5000_CHIP_SHORT_CTRL, 0); + snd_soc_component_write(component, SGTL5000_CHIP_SHORT_CTRL, 0); - /* - * set i2s as default input of sound switch - * TODO: add sound switch to control and dapm widge. - */ - snd_soc_write(codec, SGTL5000_CHIP_SSS_CTRL, - SGTL5000_DAC_SEL_I2S_IN << SGTL5000_DAC_SEL_SHIFT); - snd_soc_write(codec, SGTL5000_CHIP_DIG_POWER, + snd_soc_component_write(component, SGTL5000_CHIP_DIG_POWER, SGTL5000_ADC_EN | SGTL5000_DAC_EN); /* enable dac volume ramp by default */ - snd_soc_write(codec, SGTL5000_CHIP_ADCDAC_CTRL, + snd_soc_component_write(component, SGTL5000_CHIP_ADCDAC_CTRL, SGTL5000_DAC_VOL_RAMP_EN | SGTL5000_DAC_MUTE_RIGHT | SGTL5000_DAC_MUTE_LEFT); reg = ((sgtl5000->lrclk_strength) << SGTL5000_PAD_I2S_LRCLK_SHIFT | 0x5f); - snd_soc_write(codec, SGTL5000_CHIP_PAD_STRENGTH, reg); + snd_soc_component_write(component, SGTL5000_CHIP_PAD_STRENGTH, reg); - snd_soc_write(codec, SGTL5000_CHIP_ANA_CTRL, + snd_soc_component_write(component, SGTL5000_CHIP_ANA_CTRL, SGTL5000_HP_ZCD_EN | SGTL5000_ADC_ZCD_EN); - snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, SGTL5000_BIAS_R_MASK, sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT); - snd_soc_update_bits(codec, SGTL5000_CHIP_MIC_CTRL, + snd_soc_component_update_bits(component, SGTL5000_CHIP_MIC_CTRL, SGTL5000_BIAS_VOLT_MASK, sgtl5000->micbias_voltage << SGTL5000_BIAS_VOLT_SHIFT); /* - * disable DAP + * enable DAP Graphic EQ * TODO: - * Enable DAP in kcontrol and dapm. + * Add control for changing between PEQ/Tone Control/GEQ */ - snd_soc_write(codec, SGTL5000_DAP_CTRL, 0); + snd_soc_component_write(component, SGTL5000_DAP_AUDIO_EQ, SGTL5000_DAP_SEL_GEQ); + + /* Unmute DAC after start */ + snd_soc_component_update_bits(component, SGTL5000_CHIP_ADCDAC_CTRL, + SGTL5000_DAC_MUTE_LEFT | SGTL5000_DAC_MUTE_RIGHT, 0); return 0; @@ -1243,24 +1337,20 @@ err: return ret; } -static int sgtl5000_remove(struct snd_soc_codec *codec) -{ - return 0; -} - -static const struct snd_soc_codec_driver sgtl5000_driver = { - .probe = sgtl5000_probe, - .remove = sgtl5000_remove, - .set_bias_level = sgtl5000_set_bias_level, - .suspend_bias_off = true, - .component_driver = { - .controls = sgtl5000_snd_controls, - .num_controls = ARRAY_SIZE(sgtl5000_snd_controls), - .dapm_widgets = sgtl5000_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sgtl5000_dapm_widgets), - .dapm_routes = sgtl5000_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sgtl5000_dapm_routes), - }, +static const struct snd_soc_component_driver sgtl5000_driver = { + .probe = sgtl5000_probe, + .set_bias_level = sgtl5000_set_bias_level, + .controls = sgtl5000_snd_controls, + .num_controls = ARRAY_SIZE(sgtl5000_snd_controls), + .dapm_widgets = sgtl5000_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sgtl5000_dapm_widgets), + .dapm_routes = sgtl5000_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sgtl5000_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config sgtl5000_regmap = { @@ -1459,7 +1549,7 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, /* Ensure sgtl5000 will start with sane register values */ sgtl5000_fill_defaults(client); - ret = snd_soc_register_codec(&client->dev, + ret = devm_snd_soc_register_component(&client->dev, &sgtl5000_driver, &sgtl5000_dai, 1); if (ret) goto disable_clk; @@ -1480,7 +1570,6 @@ static int sgtl5000_i2c_remove(struct i2c_client *client) { struct sgtl5000_priv *sgtl5000 = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); clk_disable_unprepare(sgtl5000->mclk); regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies); regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies); diff --git a/sound/soc/codecs/sgtl5000.h b/sound/soc/codecs/sgtl5000.h index 22f3442af982..28cf637155bb 100644 --- a/sound/soc/codecs/sgtl5000.h +++ b/sound/soc/codecs/sgtl5000.h @@ -399,4 +399,11 @@ #define SGTL5000_SYSCLK 0x00 #define SGTL5000_LRCLK 0x01 +/* + * SGTL5000_DAP_AUDIO_EQ + */ +#define SGTL5000_DAP_SEL_PEQ 1 +#define SGTL5000_DAP_SEL_TONE_CTRL 2 +#define SGTL5000_DAP_SEL_GEQ 3 + #endif diff --git a/sound/soc/codecs/si476x.c b/sound/soc/codecs/si476x.c index 7b91ee267b4e..b779c2855c01 100644 --- a/sound/soc/codecs/si476x.c +++ b/sound/soc/codecs/si476x.c @@ -140,14 +140,14 @@ static int si476x_codec_set_dai_fmt(struct snd_soc_dai *codec_dai, si476x_core_lock(core); - err = snd_soc_update_bits(codec_dai->codec, SI476X_DIGITAL_IO_OUTPUT_FORMAT, + err = snd_soc_component_update_bits(codec_dai->component, SI476X_DIGITAL_IO_OUTPUT_FORMAT, SI476X_DIGITAL_IO_OUTPUT_FORMAT_MASK, format); si476x_core_unlock(core); if (err < 0) { - dev_err(codec_dai->codec->dev, "Failed to set output format\n"); + dev_err(codec_dai->component->dev, "Failed to set output format\n"); return err; } @@ -163,7 +163,7 @@ static int si476x_codec_hw_params(struct snd_pcm_substream *substream, rate = params_rate(params); if (rate < 32000 || rate > 48000) { - dev_err(dai->codec->dev, "Rate: %d is not supported\n", rate); + dev_err(dai->component->dev, "Rate: %d is not supported\n", rate); return -EINVAL; } @@ -186,19 +186,19 @@ static int si476x_codec_hw_params(struct snd_pcm_substream *substream, si476x_core_lock(core); - err = snd_soc_write(dai->codec, SI476X_DIGITAL_IO_OUTPUT_SAMPLE_RATE, + err = snd_soc_component_write(dai->component, SI476X_DIGITAL_IO_OUTPUT_SAMPLE_RATE, rate); if (err < 0) { - dev_err(dai->codec->dev, "Failed to set sample rate\n"); + dev_err(dai->component->dev, "Failed to set sample rate\n"); goto out; } - err = snd_soc_update_bits(dai->codec, SI476X_DIGITAL_IO_OUTPUT_FORMAT, + err = snd_soc_component_update_bits(dai->component, SI476X_DIGITAL_IO_OUTPUT_FORMAT, SI476X_DIGITAL_IO_OUTPUT_WIDTH_MASK, (width << SI476X_DIGITAL_IO_SLOT_SIZE_SHIFT) | (width << SI476X_DIGITAL_IO_SAMPLE_SIZE_SHIFT)); if (err < 0) { - dev_err(dai->codec->dev, "Failed to set output width\n"); + dev_err(dai->component->dev, "Failed to set output width\n"); goto out; } @@ -239,28 +239,25 @@ static int si476x_probe(struct snd_soc_component *component) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_si476x = { - .component_driver = { - .probe = si476x_probe, - .dapm_widgets = si476x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(si476x_dapm_widgets), - .dapm_routes = si476x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(si476x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_si476x = { + .probe = si476x_probe, + .dapm_widgets = si476x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(si476x_dapm_widgets), + .dapm_routes = si476x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(si476x_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int si476x_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_si476x, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_si476x, &si476x_dai, 1); } -static int si476x_platform_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - MODULE_ALIAS("platform:si476x-codec"); static struct platform_driver si476x_platform_driver = { @@ -268,7 +265,6 @@ static struct platform_driver si476x_platform_driver = { .name = "si476x-codec", }, .probe = si476x_platform_probe, - .remove = si476x_platform_remove, }; module_platform_driver(si476x_platform_driver); diff --git a/sound/soc/codecs/sirf-audio-codec.c b/sound/soc/codecs/sirf-audio-codec.c index 7ae8c181d1a4..e424499a8450 100644 --- a/sound/soc/codecs/sirf-audio-codec.c +++ b/sound/soc/codecs/sirf-audio-codec.c @@ -120,8 +120,8 @@ static int atlas6_codec_enable_and_reset_event(struct snd_soc_dapm_widget *w, { #define ATLAS6_CODEC_ENABLE_BITS (1 << 29) #define ATLAS6_CODEC_RESET_BITS (1 << 28) - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sirf_audio_codec *sirf_audio_codec = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: enable_and_reset_codec(sirf_audio_codec->regmap, @@ -143,8 +143,8 @@ static int prima2_codec_enable_and_reset_event(struct snd_soc_dapm_widget *w, { #define PRIMA2_CODEC_ENABLE_BITS (1 << 27) #define PRIMA2_CODEC_RESET_BITS (1 << 26) - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct sirf_audio_codec *sirf_audio_codec = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: enable_and_reset_codec(sirf_audio_codec->regmap, @@ -333,8 +333,8 @@ static int sirf_audio_codec_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct sirf_audio_codec *sirf_audio_codec = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct sirf_audio_codec *sirf_audio_codec = snd_soc_component_get_drvdata(component); int playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; /* @@ -346,7 +346,7 @@ static int sirf_audio_codec_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: if (playback) { - snd_soc_update_bits(codec, AUDIO_IC_CODEC_CTRL0, + snd_soc_component_update_bits(component, AUDIO_IC_CODEC_CTRL0, IC_HSLEN | IC_HSREN, 0); sirf_audio_codec_tx_disable(sirf_audio_codec); } else @@ -357,7 +357,7 @@ static int sirf_audio_codec_trigger(struct snd_pcm_substream *substream, case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: if (playback) { sirf_audio_codec_tx_enable(sirf_audio_codec); - snd_soc_update_bits(codec, AUDIO_IC_CODEC_CTRL0, + snd_soc_component_update_bits(component, AUDIO_IC_CODEC_CTRL0, IC_HSLEN | IC_HSREN, IC_HSLEN | IC_HSREN); } else sirf_audio_codec_rx_enable(sirf_audio_codec, @@ -393,29 +393,29 @@ static struct snd_soc_dai_driver sirf_audio_codec_dai = { .ops = &sirf_audio_codec_dai_ops, }; -static int sirf_audio_codec_probe(struct snd_soc_codec *codec) +static int sirf_audio_codec_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); - pm_runtime_enable(codec->dev); + pm_runtime_enable(component->dev); - if (of_device_is_compatible(codec->dev->of_node, "sirf,prima2-audio-codec")) { + if (of_device_is_compatible(component->dev->of_node, "sirf,prima2-audio-codec")) { snd_soc_dapm_new_controls(dapm, prima2_output_driver_dapm_widgets, ARRAY_SIZE(prima2_output_driver_dapm_widgets)); snd_soc_dapm_new_controls(dapm, &prima2_codec_clock_dapm_widget, 1); - return snd_soc_add_codec_controls(codec, + return snd_soc_add_component_controls(component, volume_controls_prima2, ARRAY_SIZE(volume_controls_prima2)); } - if (of_device_is_compatible(codec->dev->of_node, "sirf,atlas6-audio-codec")) { + if (of_device_is_compatible(component->dev->of_node, "sirf,atlas6-audio-codec")) { snd_soc_dapm_new_controls(dapm, atlas6_output_driver_dapm_widgets, ARRAY_SIZE(atlas6_output_driver_dapm_widgets)); snd_soc_dapm_new_controls(dapm, &atlas6_codec_clock_dapm_widget, 1); - return snd_soc_add_codec_controls(codec, + return snd_soc_add_component_controls(component, volume_controls_atlas6, ARRAY_SIZE(volume_controls_atlas6)); } @@ -423,22 +423,21 @@ static int sirf_audio_codec_probe(struct snd_soc_codec *codec) return -EINVAL; } -static int sirf_audio_codec_remove(struct snd_soc_codec *codec) +static void sirf_audio_codec_remove(struct snd_soc_component *component) { - pm_runtime_disable(codec->dev); - return 0; + pm_runtime_disable(component->dev); } -static const struct snd_soc_codec_driver soc_codec_device_sirf_audio_codec = { - .probe = sirf_audio_codec_probe, - .remove = sirf_audio_codec_remove, - .component_driver = { - .dapm_widgets = sirf_audio_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sirf_audio_codec_dapm_widgets), - .dapm_routes = sirf_audio_codec_map, - .num_dapm_routes = ARRAY_SIZE(sirf_audio_codec_map), - }, - .idle_bias_off = true, +static const struct snd_soc_component_driver soc_codec_device_sirf_audio_codec = { + .probe = sirf_audio_codec_probe, + .remove = sirf_audio_codec_remove, + .dapm_widgets = sirf_audio_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sirf_audio_codec_dapm_widgets), + .dapm_routes = sirf_audio_codec_map, + .num_dapm_routes = ARRAY_SIZE(sirf_audio_codec_map), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct of_device_id sirf_audio_codec_of_match[] = { @@ -495,7 +494,7 @@ static int sirf_audio_codec_driver_probe(struct platform_device *pdev) return ret; } - ret = snd_soc_register_codec(&(pdev->dev), + ret = devm_snd_soc_register_component(&(pdev->dev), &soc_codec_device_sirf_audio_codec, &sirf_audio_codec_dai, 1); if (ret) { @@ -525,7 +524,6 @@ static int sirf_audio_codec_driver_remove(struct platform_device *pdev) struct sirf_audio_codec *sirf_audio_codec = platform_get_drvdata(pdev); clk_disable_unprepare(sirf_audio_codec->clk); - snd_soc_unregister_codec(&(pdev->dev)); return 0; } diff --git a/sound/soc/codecs/spdif_receiver.c b/sound/soc/codecs/spdif_receiver.c index c8fd6367f6c0..ac69d495d121 100644 --- a/sound/soc/codecs/spdif_receiver.c +++ b/sound/soc/codecs/spdif_receiver.c @@ -38,13 +38,15 @@ static const struct snd_soc_dapm_route dir_routes[] = { SNDRV_PCM_FMTBIT_S32_LE | \ SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE) -static struct snd_soc_codec_driver soc_codec_spdif_dir = { - .component_driver = { - .dapm_widgets = dir_widgets, - .num_dapm_widgets = ARRAY_SIZE(dir_widgets), - .dapm_routes = dir_routes, - .num_dapm_routes = ARRAY_SIZE(dir_routes), - }, +static struct snd_soc_component_driver soc_codec_spdif_dir = { + .dapm_widgets = dir_widgets, + .num_dapm_widgets = ARRAY_SIZE(dir_widgets), + .dapm_routes = dir_routes, + .num_dapm_routes = ARRAY_SIZE(dir_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_driver dir_stub_dai = { @@ -60,16 +62,11 @@ static struct snd_soc_dai_driver dir_stub_dai = { static int spdif_dir_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dir, + return devm_snd_soc_register_component(&pdev->dev, + &soc_codec_spdif_dir, &dir_stub_dai, 1); } -static int spdif_dir_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - #ifdef CONFIG_OF static const struct of_device_id spdif_dir_dt_ids[] = { { .compatible = "linux,spdif-dir", }, @@ -80,7 +77,6 @@ MODULE_DEVICE_TABLE(of, spdif_dir_dt_ids); static struct platform_driver spdif_dir_driver = { .probe = spdif_dir_probe, - .remove = spdif_dir_remove, .driver = { .name = "spdif-dir", .of_match_table = of_match_ptr(spdif_dir_dt_ids), diff --git a/sound/soc/codecs/spdif_transmitter.c b/sound/soc/codecs/spdif_transmitter.c index 037aa1d45559..b4f7fc4acb39 100644 --- a/sound/soc/codecs/spdif_transmitter.c +++ b/sound/soc/codecs/spdif_transmitter.c @@ -38,13 +38,15 @@ static const struct snd_soc_dapm_route dit_routes[] = { { "spdif-out", NULL, "Playback" }, }; -static struct snd_soc_codec_driver soc_codec_spdif_dit = { - .component_driver = { - .dapm_widgets = dit_widgets, - .num_dapm_widgets = ARRAY_SIZE(dit_widgets), - .dapm_routes = dit_routes, - .num_dapm_routes = ARRAY_SIZE(dit_routes), - }, +static struct snd_soc_component_driver soc_codec_spdif_dit = { + .dapm_widgets = dit_widgets, + .num_dapm_widgets = ARRAY_SIZE(dit_widgets), + .dapm_routes = dit_routes, + .num_dapm_routes = ARRAY_SIZE(dit_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_driver dit_stub_dai = { @@ -60,16 +62,11 @@ static struct snd_soc_dai_driver dit_stub_dai = { static int spdif_dit_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dit, + return devm_snd_soc_register_component(&pdev->dev, + &soc_codec_spdif_dit, &dit_stub_dai, 1); } -static int spdif_dit_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - #ifdef CONFIG_OF static const struct of_device_id spdif_dit_dt_ids[] = { { .compatible = "linux,spdif-dit", }, @@ -80,7 +77,6 @@ MODULE_DEVICE_TABLE(of, spdif_dit_dt_ids); static struct platform_driver spdif_dit_driver = { .probe = spdif_dit_probe, - .remove = spdif_dit_remove, .driver = { .name = DRV_NAME, .of_match_table = of_match_ptr(spdif_dit_dt_ids), diff --git a/sound/soc/codecs/ssm2518.c b/sound/soc/codecs/ssm2518.c index 15486fd16269..4a1d42a33030 100644 --- a/sound/soc/codecs/ssm2518.c +++ b/sound/soc/codecs/ssm2518.c @@ -336,8 +336,8 @@ static int ssm2518_lookup_mcs(struct ssm2518 *ssm2518, static int ssm2518_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); unsigned int ctrl1, ctrl1_mask; int mcs; @@ -391,7 +391,7 @@ static int ssm2518_hw_params(struct snd_pcm_substream *substream, static int ssm2518_mute(struct snd_soc_dai *dai, int mute) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(dai->component); unsigned int val; if (mute) @@ -405,7 +405,7 @@ static int ssm2518_mute(struct snd_soc_dai *dai, int mute) static int ssm2518_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(dai->component); unsigned int ctrl1 = 0, ctrl2 = 0; bool invert_fclk; int ret; @@ -498,10 +498,10 @@ static int ssm2518_set_power(struct ssm2518 *ssm2518, bool enable) return ret; } -static int ssm2518_set_bias_level(struct snd_soc_codec *codec, +static int ssm2518_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(component); int ret = 0; switch (level) { @@ -510,7 +510,7 @@ static int ssm2518_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) ret = ssm2518_set_power(ssm2518, true); break; case SND_SOC_BIAS_OFF: @@ -524,7 +524,7 @@ static int ssm2518_set_bias_level(struct snd_soc_codec *codec, static int ssm2518_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int width) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(dai->component); unsigned int ctrl1, ctrl2; int left_slot, right_slot; int ret; @@ -609,7 +609,7 @@ static int ssm2518_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, static int ssm2518_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(dai->component); if (ssm2518->constraints) snd_pcm_hw_constraint_list(substream->runtime, 0, @@ -641,10 +641,10 @@ static struct snd_soc_dai_driver ssm2518_dai = { .ops = &ssm2518_dai_ops, }; -static int ssm2518_set_sysclk(struct snd_soc_codec *codec, int clk_id, +static int ssm2518_set_sysclk(struct snd_soc_component *component, int clk_id, int source, unsigned int freq, int dir) { - struct ssm2518 *ssm2518 = snd_soc_codec_get_drvdata(codec); + struct ssm2518 *ssm2518 = snd_soc_component_get_drvdata(component); unsigned int val; if (clk_id != SSM2518_SYSCLK) @@ -710,19 +710,18 @@ static int ssm2518_set_sysclk(struct snd_soc_codec *codec, int clk_id, SSM2518_POWER1_NO_BCLK, val); } -static const struct snd_soc_codec_driver ssm2518_codec_driver = { - .set_bias_level = ssm2518_set_bias_level, - .set_sysclk = ssm2518_set_sysclk, - .idle_bias_off = true, - - .component_driver = { - .controls = ssm2518_snd_controls, - .num_controls = ARRAY_SIZE(ssm2518_snd_controls), - .dapm_widgets = ssm2518_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ssm2518_dapm_widgets), - .dapm_routes = ssm2518_routes, - .num_dapm_routes = ARRAY_SIZE(ssm2518_routes), - }, +static const struct snd_soc_component_driver ssm2518_component_driver = { + .set_bias_level = ssm2518_set_bias_level, + .set_sysclk = ssm2518_set_sysclk, + .controls = ssm2518_snd_controls, + .num_controls = ARRAY_SIZE(ssm2518_snd_controls), + .dapm_widgets = ssm2518_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ssm2518_dapm_widgets), + .dapm_routes = ssm2518_routes, + .num_dapm_routes = ARRAY_SIZE(ssm2518_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ssm2518_regmap_config = { @@ -792,16 +791,11 @@ static int ssm2518_i2c_probe(struct i2c_client *i2c, if (ret) return ret; - return snd_soc_register_codec(&i2c->dev, &ssm2518_codec_driver, + return devm_snd_soc_register_component(&i2c->dev, + &ssm2518_component_driver, &ssm2518_dai, 1); } -static int ssm2518_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - #ifdef CONFIG_OF static const struct of_device_id ssm2518_dt_ids[] = { { .compatible = "adi,ssm2518", }, @@ -822,7 +816,6 @@ static struct i2c_driver ssm2518_driver = { .of_match_table = of_match_ptr(ssm2518_dt_ids), }, .probe = ssm2518_i2c_probe, - .remove = ssm2518_i2c_remove, .id_table = ssm2518_i2c_ids, }; module_i2c_driver(ssm2518_driver); diff --git a/sound/soc/codecs/ssm2602-i2c.c b/sound/soc/codecs/ssm2602-i2c.c index 173ba85ff59e..f1c2b1a3ada3 100644 --- a/sound/soc/codecs/ssm2602-i2c.c +++ b/sound/soc/codecs/ssm2602-i2c.c @@ -27,12 +27,6 @@ static int ssm2602_i2c_probe(struct i2c_client *client, devm_regmap_init_i2c(client, &ssm2602_regmap_config)); } -static int ssm2602_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id ssm2602_i2c_id[] = { { "ssm2602", SSM2602 }, { "ssm2603", SSM2602 }, @@ -55,7 +49,6 @@ static struct i2c_driver ssm2602_i2c_driver = { .of_match_table = ssm2602_of_match, }, .probe = ssm2602_i2c_probe, - .remove = ssm2602_i2c_remove, .id_table = ssm2602_i2c_id, }; module_i2c_driver(ssm2602_i2c_driver); diff --git a/sound/soc/codecs/ssm2602-spi.c b/sound/soc/codecs/ssm2602-spi.c index 842f373045c6..8848628571a1 100644 --- a/sound/soc/codecs/ssm2602-spi.c +++ b/sound/soc/codecs/ssm2602-spi.c @@ -20,12 +20,6 @@ static int ssm2602_spi_probe(struct spi_device *spi) devm_regmap_init_spi(spi, &ssm2602_regmap_config)); } -static int ssm2602_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static const struct of_device_id ssm2602_of_match[] = { { .compatible = "adi,ssm2602", }, { } @@ -38,7 +32,6 @@ static struct spi_driver ssm2602_spi_driver = { .of_match_table = ssm2602_of_match, }, .probe = ssm2602_spi_probe, - .remove = ssm2602_spi_remove, }; module_spi_driver(ssm2602_spi_driver); diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c index 9b341c23f62b..501a4e73b185 100644 --- a/sound/soc/codecs/ssm2602.c +++ b/sound/soc/codecs/ssm2602.c @@ -54,10 +54,17 @@ struct ssm2602_priv { * using 2 wire for device control, so we cache them instead. * There is no point in caching the reset register */ -static const u16 ssm2602_reg[SSM2602_CACHEREGNUM] = { - 0x0097, 0x0097, 0x0079, 0x0079, - 0x000a, 0x0008, 0x009f, 0x000a, - 0x0000, 0x0000 +static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = { + { .reg = 0x00, .def = 0x0097 }, + { .reg = 0x01, .def = 0x0097 }, + { .reg = 0x02, .def = 0x0079 }, + { .reg = 0x03, .def = 0x0079 }, + { .reg = 0x04, .def = 0x000a }, + { .reg = 0x05, .def = 0x0008 }, + { .reg = 0x06, .def = 0x009f }, + { .reg = 0x07, .def = 0x000a }, + { .reg = 0x08, .def = 0x0000 }, + { .reg = 0x09, .def = 0x0000 } }; @@ -273,8 +280,8 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params)); unsigned int iface; @@ -308,8 +315,8 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream, static int ssm2602_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); if (ssm2602->sysclk_constraints) { snd_pcm_hw_constraint_list(substream->runtime, 0, @@ -322,7 +329,7 @@ static int ssm2602_startup(struct snd_pcm_substream *substream, static int ssm2602_mute(struct snd_soc_dai *dai, int mute) { - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(dai->component); if (mute) regmap_update_bits(ssm2602->regmap, SSM2602_APDIGI, @@ -337,8 +344,8 @@ static int ssm2602_mute(struct snd_soc_dai *dai, int mute) static int ssm2602_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); if (dir == SND_SOC_CLOCK_IN) { if (clk_id != SSM2602_SYSCLK) @@ -389,7 +396,7 @@ static int ssm2602_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int ssm2602_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec_dai->codec); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(codec_dai->component); unsigned int iface = 0; /* set master/slave audio interface */ @@ -445,10 +452,10 @@ static int ssm2602_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } -static int ssm2602_set_bias_level(struct snd_soc_codec *codec, +static int ssm2602_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: @@ -511,19 +518,19 @@ static struct snd_soc_dai_driver ssm2602_dai = { .symmetric_samplebits = 1, }; -static int ssm2602_resume(struct snd_soc_codec *codec) +static int ssm2602_resume(struct snd_soc_component *component) { - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); regcache_sync(ssm2602->regmap); return 0; } -static int ssm2602_codec_probe(struct snd_soc_codec *codec) +static int ssm2602_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); int ret; regmap_update_bits(ssm2602->regmap, SSM2602_LOUT1V, @@ -531,7 +538,7 @@ static int ssm2602_codec_probe(struct snd_soc_codec *codec) regmap_update_bits(ssm2602->regmap, SSM2602_ROUT1V, ROUT1V_RLHP_BOTH, ROUT1V_RLHP_BOTH); - ret = snd_soc_add_codec_controls(codec, ssm2602_snd_controls, + ret = snd_soc_add_component_controls(component, ssm2602_snd_controls, ARRAY_SIZE(ssm2602_snd_controls)); if (ret) return ret; @@ -545,9 +552,9 @@ static int ssm2602_codec_probe(struct snd_soc_codec *codec) ARRAY_SIZE(ssm2602_routes)); } -static int ssm2604_codec_probe(struct snd_soc_codec *codec) +static int ssm2604_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int ret; ret = snd_soc_dapm_new_controls(dapm, ssm2604_dapm_widgets, @@ -559,14 +566,14 @@ static int ssm2604_codec_probe(struct snd_soc_codec *codec) ARRAY_SIZE(ssm2604_routes)); } -static int ssm260x_codec_probe(struct snd_soc_codec *codec) +static int ssm260x_component_probe(struct snd_soc_component *component) { - struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); + struct ssm2602_priv *ssm2602 = snd_soc_component_get_drvdata(component); int ret; ret = regmap_write(ssm2602->regmap, SSM2602_RESET, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to issue reset: %d\n", ret); + dev_err(component->dev, "Failed to issue reset: %d\n", ret); return ret; } @@ -581,30 +588,31 @@ static int ssm260x_codec_probe(struct snd_soc_codec *codec) switch (ssm2602->type) { case SSM2602: - ret = ssm2602_codec_probe(codec); + ret = ssm2602_component_probe(component); break; case SSM2604: - ret = ssm2604_codec_probe(codec); + ret = ssm2604_component_probe(component); break; } return ret; } -static const struct snd_soc_codec_driver soc_codec_dev_ssm2602 = { - .probe = ssm260x_codec_probe, - .resume = ssm2602_resume, - .set_bias_level = ssm2602_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = ssm260x_snd_controls, - .num_controls = ARRAY_SIZE(ssm260x_snd_controls), - .dapm_widgets = ssm260x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ssm260x_dapm_widgets), - .dapm_routes = ssm260x_routes, - .num_dapm_routes = ARRAY_SIZE(ssm260x_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_ssm2602 = { + .probe = ssm260x_component_probe, + .resume = ssm2602_resume, + .set_bias_level = ssm2602_set_bias_level, + .controls = ssm260x_snd_controls, + .num_controls = ARRAY_SIZE(ssm260x_snd_controls), + .dapm_widgets = ssm260x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ssm260x_dapm_widgets), + .dapm_routes = ssm260x_routes, + .num_dapm_routes = ARRAY_SIZE(ssm260x_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static bool ssm2602_register_volatile(struct device *dev, unsigned int reg) @@ -620,8 +628,8 @@ const struct regmap_config ssm2602_regmap_config = { .volatile_reg = ssm2602_register_volatile, .cache_type = REGCACHE_RBTREE, - .reg_defaults_raw = ssm2602_reg, - .num_reg_defaults_raw = ARRAY_SIZE(ssm2602_reg), + .reg_defaults = ssm2602_reg, + .num_reg_defaults = ARRAY_SIZE(ssm2602_reg), }; EXPORT_SYMBOL_GPL(ssm2602_regmap_config); @@ -641,7 +649,7 @@ int ssm2602_probe(struct device *dev, enum ssm2602_type type, ssm2602->type = type; ssm2602->regmap = regmap; - return snd_soc_register_codec(dev, &soc_codec_dev_ssm2602, + return devm_snd_soc_register_component(dev, &soc_component_dev_ssm2602, &ssm2602_dai, 1); } EXPORT_SYMBOL_GPL(ssm2602_probe); diff --git a/sound/soc/codecs/ssm4567.c b/sound/soc/codecs/ssm4567.c index 4afeddef7728..90119ea00498 100644 --- a/sound/soc/codecs/ssm4567.c +++ b/sound/soc/codecs/ssm4567.c @@ -199,8 +199,8 @@ static const struct snd_soc_dapm_route ssm4567_routes[] = { static int ssm4567_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct ssm4567 *ssm4567 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct ssm4567 *ssm4567 = snd_soc_component_get_drvdata(component); unsigned int rate = params_rate(params); unsigned int dacfs; @@ -223,7 +223,7 @@ static int ssm4567_hw_params(struct snd_pcm_substream *substream, static int ssm4567_mute(struct snd_soc_dai *dai, int mute) { - struct ssm4567 *ssm4567 = snd_soc_codec_get_drvdata(dai->codec); + struct ssm4567 *ssm4567 = snd_soc_component_get_drvdata(dai->component); unsigned int val; val = mute ? SSM4567_DAC_MUTE : 0; @@ -366,10 +366,10 @@ static int ssm4567_set_power(struct ssm4567 *ssm4567, bool enable) return ret; } -static int ssm4567_set_bias_level(struct snd_soc_codec *codec, +static int ssm4567_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct ssm4567 *ssm4567 = snd_soc_codec_get_drvdata(codec); + struct ssm4567 *ssm4567 = snd_soc_component_get_drvdata(component); int ret = 0; switch (level) { @@ -378,7 +378,7 @@ static int ssm4567_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) ret = ssm4567_set_power(ssm4567, true); break; case SND_SOC_BIAS_OFF: @@ -417,18 +417,17 @@ static struct snd_soc_dai_driver ssm4567_dai = { .ops = &ssm4567_dai_ops, }; -static const struct snd_soc_codec_driver ssm4567_codec_driver = { - .set_bias_level = ssm4567_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = ssm4567_snd_controls, - .num_controls = ARRAY_SIZE(ssm4567_snd_controls), - .dapm_widgets = ssm4567_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(ssm4567_dapm_widgets), - .dapm_routes = ssm4567_routes, - .num_dapm_routes = ARRAY_SIZE(ssm4567_routes), - }, +static const struct snd_soc_component_driver ssm4567_component_driver = { + .set_bias_level = ssm4567_set_bias_level, + .controls = ssm4567_snd_controls, + .num_controls = ARRAY_SIZE(ssm4567_snd_controls), + .dapm_widgets = ssm4567_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(ssm4567_dapm_widgets), + .dapm_routes = ssm4567_routes, + .num_dapm_routes = ARRAY_SIZE(ssm4567_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config ssm4567_regmap_config = { @@ -469,16 +468,10 @@ static int ssm4567_i2c_probe(struct i2c_client *i2c, if (ret) return ret; - return snd_soc_register_codec(&i2c->dev, &ssm4567_codec_driver, + return devm_snd_soc_register_component(&i2c->dev, &ssm4567_component_driver, &ssm4567_dai, 1); } -static int ssm4567_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id ssm4567_i2c_ids[] = { { "ssm4567", 0 }, { } @@ -510,7 +503,6 @@ static struct i2c_driver ssm4567_driver = { .acpi_match_table = ACPI_PTR(ssm4567_acpi_match), }, .probe = ssm4567_i2c_probe, - .remove = ssm4567_i2c_remove, .id_table = ssm4567_i2c_ids, }; module_i2c_driver(ssm4567_driver); diff --git a/sound/soc/codecs/sta32x.c b/sound/soc/codecs/sta32x.c index 5b888476d9ff..d5035f2f2b2b 100644 --- a/sound/soc/codecs/sta32x.c +++ b/sound/soc/codecs/sta32x.c @@ -143,7 +143,7 @@ static const char *sta32x_supply_names[] = { struct sta32x_priv { struct regmap *regmap; struct regulator_bulk_data supplies[ARRAY_SIZE(sta32x_supply_names)]; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct sta32x_platform_data *pdata; unsigned int mclk; @@ -270,8 +270,8 @@ static int sta32x_coefficient_info(struct snd_kcontrol *kcontrol, static int sta32x_coefficient_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; unsigned int cfud, val; @@ -312,8 +312,8 @@ exit_unlock: static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; unsigned int cfud; @@ -347,9 +347,9 @@ static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol, return 0; } -static int sta32x_sync_coef_shadow(struct snd_soc_codec *codec) +static int sta32x_sync_coef_shadow(struct snd_soc_component *component) { - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); unsigned int cfud; int i; @@ -375,16 +375,16 @@ static int sta32x_sync_coef_shadow(struct snd_soc_codec *codec) return 0; } -static int sta32x_cache_sync(struct snd_soc_codec *codec) +static int sta32x_cache_sync(struct snd_soc_component *component) { - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); unsigned int mute; int rc; /* mute during register sync */ regmap_read(sta32x->regmap, STA32X_MMUTE, &mute); regmap_write(sta32x->regmap, STA32X_MMUTE, mute | STA32X_MMUTE_MMUTE); - sta32x_sync_coef_shadow(codec); + sta32x_sync_coef_shadow(component); rc = regcache_sync(sta32x->regmap); regmap_write(sta32x->regmap, STA32X_MMUTE, mute); return rc; @@ -395,17 +395,17 @@ static void sta32x_watchdog(struct work_struct *work) { struct sta32x_priv *sta32x = container_of(work, struct sta32x_priv, watchdog_work.work); - struct snd_soc_codec *codec = sta32x->codec; + struct snd_soc_component *component = sta32x->component; unsigned int confa, confa_cached; /* check if sta32x has reset itself */ - confa_cached = snd_soc_read(codec, STA32X_CONFA); + confa_cached = snd_soc_component_read32(component, STA32X_CONFA); regcache_cache_bypass(sta32x->regmap, true); - confa = snd_soc_read(codec, STA32X_CONFA); + confa = snd_soc_component_read32(component, STA32X_CONFA); regcache_cache_bypass(sta32x->regmap, false); if (confa != confa_cached) { regcache_mark_dirty(sta32x->regmap); - sta32x_cache_sync(codec); + sta32x_cache_sync(component); } if (!sta32x->shutdown) @@ -582,10 +582,10 @@ static int mcs_ratio_table[3][7] = { static int sta32x_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "mclk=%u\n", freq); + dev_dbg(component->dev, "mclk=%u\n", freq); sta32x->mclk = freq; return 0; @@ -602,8 +602,8 @@ static int sta32x_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int sta32x_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); u8 confb = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -651,22 +651,22 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); int i, mcs = -EINVAL, ir = -EINVAL; unsigned int confa, confb; unsigned int rate, ratio; int ret; if (!sta32x->mclk) { - dev_err(codec->dev, + dev_err(component->dev, "sta32x->mclk is unset. Unable to determine ratio\n"); return -EIO; } rate = params_rate(params); ratio = sta32x->mclk / rate; - dev_dbg(codec->dev, "rate: %u, ratio: %u\n", rate, ratio); + dev_dbg(component->dev, "rate: %u, ratio: %u\n", rate, ratio); for (i = 0; i < ARRAY_SIZE(interpolation_ratios); i++) { if (interpolation_ratios[i].fs == rate) { @@ -676,7 +676,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, } if (ir < 0) { - dev_err(codec->dev, "Unsupported samplerate: %u\n", rate); + dev_err(component->dev, "Unsupported samplerate: %u\n", rate); return -EINVAL; } @@ -688,7 +688,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, } if (mcs < 0) { - dev_err(codec->dev, "Unresolvable ratio: %u\n", ratio); + dev_err(component->dev, "Unresolvable ratio: %u\n", ratio); return -EINVAL; } @@ -698,10 +698,10 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 24: - dev_dbg(codec->dev, "24bit\n"); + dev_dbg(component->dev, "24bit\n"); /* fall through */ case 32: - dev_dbg(codec->dev, "24bit or 32bit\n"); + dev_dbg(component->dev, "24bit or 32bit\n"); switch (sta32x->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x0; @@ -716,7 +716,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, break; case 20: - dev_dbg(codec->dev, "20bit\n"); + dev_dbg(component->dev, "20bit\n"); switch (sta32x->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x4; @@ -731,7 +731,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, break; case 18: - dev_dbg(codec->dev, "18bit\n"); + dev_dbg(component->dev, "18bit\n"); switch (sta32x->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x8; @@ -746,7 +746,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream, break; case 16: - dev_dbg(codec->dev, "16bit\n"); + dev_dbg(component->dev, "16bit\n"); switch (sta32x->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x0; @@ -793,20 +793,20 @@ static int sta32x_startup_sequence(struct sta32x_priv *sta32x) /** * sta32x_set_bias_level - DAPM callback - * @codec: the codec device + * @component: the component device * @level: DAPM power level * - * This is called by ALSA to put the codec into low power mode - * or to wake it up. If the codec is powered off completely + * This is called by ALSA to put the component into low power mode + * or to wake it up. If the component is powered off completely * all registers must be restored after power on. */ -static int sta32x_set_bias_level(struct snd_soc_codec *codec, +static int sta32x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { int ret; - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "level = %d\n", level); + dev_dbg(component->dev, "level = %d\n", level); switch (level) { case SND_SOC_BIAS_ON: break; @@ -819,17 +819,17 @@ static int sta32x_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); return ret; } sta32x_startup_sequence(sta32x); - sta32x_cache_sync(codec); + sta32x_cache_sync(component); sta32x_watchdog_start(sta32x); } @@ -874,21 +874,21 @@ static struct snd_soc_dai_driver sta32x_dai = { .ops = &sta32x_dai_ops, }; -static int sta32x_probe(struct snd_soc_codec *codec) +static int sta32x_probe(struct snd_soc_component *component) { - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); struct sta32x_platform_data *pdata = sta32x->pdata; int i, ret = 0, thermal = 0; ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); return ret; } ret = sta32x_startup_sequence(sta32x); if (ret < 0) { - dev_err(codec->dev, "Failed to startup device\n"); + dev_err(component->dev, "Failed to startup device\n"); return ret; } @@ -968,36 +968,36 @@ static int sta32x_probe(struct snd_soc_codec *codec) if (sta32x->pdata->needs_esd_watchdog) INIT_DELAYED_WORK(&sta32x->watchdog_work, sta32x_watchdog); - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); return 0; } -static int sta32x_remove(struct snd_soc_codec *codec) +static void sta32x_remove(struct snd_soc_component *component) { - struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); + struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component); sta32x_watchdog_stop(sta32x); regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); - - return 0; } -static const struct snd_soc_codec_driver sta32x_codec = { - .probe = sta32x_probe, - .remove = sta32x_remove, - .set_bias_level = sta32x_set_bias_level, - .suspend_bias_off = true, - .component_driver = { - .controls = sta32x_snd_controls, - .num_controls = ARRAY_SIZE(sta32x_snd_controls), - .dapm_widgets = sta32x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sta32x_dapm_widgets), - .dapm_routes = sta32x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sta32x_dapm_routes), - }, +static const struct snd_soc_component_driver sta32x_component = { + .probe = sta32x_probe, + .remove = sta32x_remove, + .set_bias_level = sta32x_set_bias_level, + .controls = sta32x_snd_controls, + .num_controls = ARRAY_SIZE(sta32x_snd_controls), + .dapm_widgets = sta32x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sta32x_dapm_widgets), + .dapm_routes = sta32x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sta32x_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config sta32x_regmap = { @@ -1121,19 +1121,14 @@ static int sta32x_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, sta32x); - ret = snd_soc_register_codec(dev, &sta32x_codec, &sta32x_dai, 1); + ret = devm_snd_soc_register_component(dev, &sta32x_component, + &sta32x_dai, 1); if (ret < 0) - dev_err(dev, "Failed to register codec (%d)\n", ret); + dev_err(dev, "Failed to register component (%d)\n", ret); return ret; } -static int sta32x_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - return 0; -} - static const struct i2c_device_id sta32x_i2c_id[] = { { "sta326", 0 }, { "sta328", 0 }, @@ -1148,7 +1143,6 @@ static struct i2c_driver sta32x_i2c_driver = { .of_match_table = of_match_ptr(st32x_dt_ids), }, .probe = sta32x_i2c_probe, - .remove = sta32x_i2c_remove, .id_table = sta32x_i2c_id, }; diff --git a/sound/soc/codecs/sta350.c b/sound/soc/codecs/sta350.c index 9644c20f44e3..0b870319b106 100644 --- a/sound/soc/codecs/sta350.c +++ b/sound/soc/codecs/sta350.c @@ -309,8 +309,8 @@ static int sta350_coefficient_info(struct snd_kcontrol *kcontrol, static int sta350_coefficient_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; unsigned int cfud, val; @@ -351,8 +351,8 @@ exit_unlock: static int sta350_coefficient_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; unsigned int cfud; @@ -386,9 +386,9 @@ static int sta350_coefficient_put(struct snd_kcontrol *kcontrol, return 0; } -static int sta350_sync_coef_shadow(struct snd_soc_codec *codec) +static int sta350_sync_coef_shadow(struct snd_soc_component *component) { - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); unsigned int cfud; int i; @@ -414,16 +414,16 @@ static int sta350_sync_coef_shadow(struct snd_soc_codec *codec) return 0; } -static int sta350_cache_sync(struct snd_soc_codec *codec) +static int sta350_cache_sync(struct snd_soc_component *component) { - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); unsigned int mute; int rc; /* mute during register sync */ regmap_read(sta350->regmap, STA350_CFUD, &mute); regmap_write(sta350->regmap, STA350_MMUTE, mute | STA350_MMUTE_MMUTE); - sta350_sync_coef_shadow(codec); + sta350_sync_coef_shadow(component); rc = regcache_sync(sta350->regmap); regmap_write(sta350->regmap, STA350_MMUTE, mute); return rc; @@ -613,10 +613,10 @@ static int mcs_ratio_table[3][6] = { static int sta350_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "mclk=%u\n", freq); + dev_dbg(component->dev, "mclk=%u\n", freq); sta350->mclk = freq; return 0; @@ -633,8 +633,8 @@ static int sta350_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int sta350_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); unsigned int confb = 0; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -682,22 +682,22 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); int i, mcs = -EINVAL, ir = -EINVAL; unsigned int confa, confb; unsigned int rate, ratio; int ret; if (!sta350->mclk) { - dev_err(codec->dev, + dev_err(component->dev, "sta350->mclk is unset. Unable to determine ratio\n"); return -EIO; } rate = params_rate(params); ratio = sta350->mclk / rate; - dev_dbg(codec->dev, "rate: %u, ratio: %u\n", rate, ratio); + dev_dbg(component->dev, "rate: %u, ratio: %u\n", rate, ratio); for (i = 0; i < ARRAY_SIZE(interpolation_ratios); i++) { if (interpolation_ratios[i].fs == rate) { @@ -707,7 +707,7 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, } if (ir < 0) { - dev_err(codec->dev, "Unsupported samplerate: %u\n", rate); + dev_err(component->dev, "Unsupported samplerate: %u\n", rate); return -EINVAL; } @@ -719,7 +719,7 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, } if (mcs < 0) { - dev_err(codec->dev, "Unresolvable ratio: %u\n", ratio); + dev_err(component->dev, "Unresolvable ratio: %u\n", ratio); return -EINVAL; } @@ -729,10 +729,10 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, switch (params_width(params)) { case 24: - dev_dbg(codec->dev, "24bit\n"); + dev_dbg(component->dev, "24bit\n"); /* fall through */ case 32: - dev_dbg(codec->dev, "24bit or 32bit\n"); + dev_dbg(component->dev, "24bit or 32bit\n"); switch (sta350->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x0; @@ -747,7 +747,7 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, break; case 20: - dev_dbg(codec->dev, "20bit\n"); + dev_dbg(component->dev, "20bit\n"); switch (sta350->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x4; @@ -762,7 +762,7 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, break; case 18: - dev_dbg(codec->dev, "18bit\n"); + dev_dbg(component->dev, "18bit\n"); switch (sta350->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x8; @@ -777,7 +777,7 @@ static int sta350_hw_params(struct snd_pcm_substream *substream, break; case 16: - dev_dbg(codec->dev, "16bit\n"); + dev_dbg(component->dev, "16bit\n"); switch (sta350->format) { case SND_SOC_DAIFMT_I2S: confb |= 0x0; @@ -827,20 +827,20 @@ static int sta350_startup_sequence(struct sta350_priv *sta350) /** * sta350_set_bias_level - DAPM callback - * @codec: the codec device + * @component: the component device * @level: DAPM power level * - * This is called by ALSA to put the codec into low power mode - * or to wake it up. If the codec is powered off completely + * This is called by ALSA to put the component into low power mode + * or to wake it up. If the component is powered off completely * all registers must be restored after power on. */ -static int sta350_set_bias_level(struct snd_soc_codec *codec, +static int sta350_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); int ret; - dev_dbg(codec->dev, "level = %d\n", level); + dev_dbg(component->dev, "level = %d\n", level); switch (level) { case SND_SOC_BIAS_ON: break; @@ -853,18 +853,18 @@ static int sta350_set_bias_level(struct snd_soc_codec *codec, break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable( ARRAY_SIZE(sta350->supplies), sta350->supplies); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); return ret; } sta350_startup_sequence(sta350); - sta350_cache_sync(codec); + sta350_cache_sync(component); } /* Power down */ @@ -911,22 +911,22 @@ static struct snd_soc_dai_driver sta350_dai = { .ops = &sta350_dai_ops, }; -static int sta350_probe(struct snd_soc_codec *codec) +static int sta350_probe(struct snd_soc_component *component) { - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); struct sta350_platform_data *pdata = sta350->pdata; int i, ret = 0, thermal = 0; ret = regulator_bulk_enable(ARRAY_SIZE(sta350->supplies), sta350->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); return ret; } ret = sta350_startup_sequence(sta350); if (ret < 0) { - dev_err(codec->dev, "Failed to startup device\n"); + dev_err(component->dev, "Failed to startup device\n"); return ret; } @@ -1036,35 +1036,35 @@ static int sta350_probe(struct snd_soc_codec *codec) sta350->coef_shadow[60] = 0x400000; sta350->coef_shadow[61] = 0x400000; - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(sta350->supplies), sta350->supplies); return 0; } -static int sta350_remove(struct snd_soc_codec *codec) +static void sta350_remove(struct snd_soc_component *component) { - struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); + struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component); regulator_bulk_disable(ARRAY_SIZE(sta350->supplies), sta350->supplies); - - return 0; } -static const struct snd_soc_codec_driver sta350_codec = { - .probe = sta350_probe, - .remove = sta350_remove, - .set_bias_level = sta350_set_bias_level, - .suspend_bias_off = true, - .component_driver = { - .controls = sta350_snd_controls, - .num_controls = ARRAY_SIZE(sta350_snd_controls), - .dapm_widgets = sta350_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sta350_dapm_widgets), - .dapm_routes = sta350_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sta350_dapm_routes), - }, +static const struct snd_soc_component_driver sta350_component = { + .probe = sta350_probe, + .remove = sta350_remove, + .set_bias_level = sta350_set_bias_level, + .controls = sta350_snd_controls, + .num_controls = ARRAY_SIZE(sta350_snd_controls), + .dapm_widgets = sta350_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sta350_dapm_widgets), + .dapm_routes = sta350_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sta350_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config sta350_regmap = { @@ -1244,16 +1244,15 @@ static int sta350_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, sta350); - ret = snd_soc_register_codec(dev, &sta350_codec, &sta350_dai, 1); + ret = devm_snd_soc_register_component(dev, &sta350_component, &sta350_dai, 1); if (ret < 0) - dev_err(dev, "Failed to register codec (%d)\n", ret); + dev_err(dev, "Failed to register component (%d)\n", ret); return ret; } static int sta350_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/sta529.c b/sound/soc/codecs/sta529.c index 660734359bf3..2881a0f7bb39 100644 --- a/sound/soc/codecs/sta529.c +++ b/sound/soc/codecs/sta529.c @@ -151,28 +151,28 @@ static const struct snd_kcontrol_new sta529_snd_controls[] = { SOC_ENUM("PWM Select", pwm_src), }; -static int sta529_set_bias_level(struct snd_soc_codec *codec, enum +static int sta529_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct sta529 *sta529 = snd_soc_codec_get_drvdata(codec); + struct sta529 *sta529 = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: - snd_soc_update_bits(codec, STA529_FFXCFG0, POWER_CNTLMSAK, + snd_soc_component_update_bits(component, STA529_FFXCFG0, POWER_CNTLMSAK, POWER_UP); - snd_soc_update_bits(codec, STA529_MISC, FFX_CLK_MSK, + snd_soc_component_update_bits(component, STA529_MISC, FFX_CLK_MSK, FFX_CLK_ENB); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) regcache_sync(sta529->regmap); - snd_soc_update_bits(codec, STA529_FFXCFG0, + snd_soc_component_update_bits(component, STA529_FFXCFG0, POWER_CNTLMSAK, POWER_STDBY); /* Making FFX output to zero */ - snd_soc_update_bits(codec, STA529_FFXCFG0, FFX_MASK, + snd_soc_component_update_bits(component, STA529_FFXCFG0, FFX_MASK, FFX_OFF); - snd_soc_update_bits(codec, STA529_MISC, FFX_CLK_MSK, + snd_soc_component_update_bits(component, STA529_MISC, FFX_CLK_MSK, FFX_CLK_DIS); break; case SND_SOC_BIAS_OFF: @@ -187,7 +187,7 @@ static int sta529_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int pdata, play_freq_val, record_freq_val; int bclk_to_fs_ratio; @@ -205,7 +205,7 @@ static int sta529_hw_params(struct snd_pcm_substream *substream, bclk_to_fs_ratio = 2; break; default: - dev_err(codec->dev, "Unsupported format\n"); + dev_err(component->dev, "Unsupported format\n"); return -EINVAL; } @@ -228,23 +228,23 @@ static int sta529_hw_params(struct snd_pcm_substream *substream, record_freq_val = 0; break; default: - dev_err(codec->dev, "Unsupported rate\n"); + dev_err(component->dev, "Unsupported rate\n"); return -EINVAL; } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - snd_soc_update_bits(codec, STA529_S2PCFG1, PDATA_LEN_MSK, + snd_soc_component_update_bits(component, STA529_S2PCFG1, PDATA_LEN_MSK, pdata << 6); - snd_soc_update_bits(codec, STA529_S2PCFG1, BCLK_TO_FS_MSK, + snd_soc_component_update_bits(component, STA529_S2PCFG1, BCLK_TO_FS_MSK, bclk_to_fs_ratio << 4); - snd_soc_update_bits(codec, STA529_MISC, PLAY_FREQ_RANGE_MSK, + snd_soc_component_update_bits(component, STA529_MISC, PLAY_FREQ_RANGE_MSK, play_freq_val << 4); } else { - snd_soc_update_bits(codec, STA529_P2SCFG1, PDATA_LEN_MSK, + snd_soc_component_update_bits(component, STA529_P2SCFG1, PDATA_LEN_MSK, pdata << 6); - snd_soc_update_bits(codec, STA529_P2SCFG1, BCLK_TO_FS_MSK, + snd_soc_component_update_bits(component, STA529_P2SCFG1, BCLK_TO_FS_MSK, bclk_to_fs_ratio << 4); - snd_soc_update_bits(codec, STA529_MISC, CAP_FREQ_RANGE_MSK, + snd_soc_component_update_bits(component, STA529_MISC, CAP_FREQ_RANGE_MSK, record_freq_val << 2); } @@ -258,14 +258,14 @@ static int sta529_mute(struct snd_soc_dai *dai, int mute) if (mute) val |= CODEC_MUTE_VAL; - snd_soc_update_bits(dai->codec, STA529_FFXCFG0, AUDIO_MUTE_MSK, val); + snd_soc_component_update_bits(dai->component, STA529_FFXCFG0, AUDIO_MUTE_MSK, val); return 0; } static int sta529_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 mode = 0; /* interface format */ @@ -283,7 +283,7 @@ static int sta529_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) return -EINVAL; } - snd_soc_update_bits(codec, STA529_S2PCFG0, DATA_FORMAT_MSK, mode); + snd_soc_component_update_bits(component, STA529_S2PCFG0, DATA_FORMAT_MSK, mode); return 0; } @@ -313,14 +313,15 @@ static struct snd_soc_dai_driver sta529_dai = { .ops = &sta529_dai_ops, }; -static const struct snd_soc_codec_driver sta529_codec_driver = { - .set_bias_level = sta529_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = sta529_snd_controls, - .num_controls = ARRAY_SIZE(sta529_snd_controls), - }, +static const struct snd_soc_component_driver sta529_component_driver = { + .set_bias_level = sta529_set_bias_level, + .controls = sta529_snd_controls, + .num_controls = ARRAY_SIZE(sta529_snd_controls), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config sta529_regmap = { @@ -354,21 +355,14 @@ static int sta529_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, sta529); - ret = snd_soc_register_codec(&i2c->dev, - &sta529_codec_driver, &sta529_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &sta529_component_driver, &sta529_dai, 1); if (ret != 0) dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); return ret; } -static int sta529_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - - return 0; -} - static const struct i2c_device_id sta529_i2c_id[] = { { "sta529", 0 }, { } @@ -387,7 +381,6 @@ static struct i2c_driver sta529_i2c_driver = { .of_match_table = sta529_of_match, }, .probe = sta529_i2c_probe, - .remove = sta529_i2c_remove, .id_table = sta529_i2c_id, }; diff --git a/sound/soc/codecs/stac9766.c b/sound/soc/codecs/stac9766.c index c66363a2cac7..f62101a629e0 100644 --- a/sound/soc/codecs/stac9766.c +++ b/sound/soc/codecs/stac9766.c @@ -168,58 +168,58 @@ static const struct snd_kcontrol_new stac9766_snd_ac97_controls[] = { static int ac97_analog_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct snd_pcm_runtime *runtime = substream->runtime; unsigned short reg; /* enable variable rate audio, disable SPDIF output */ - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x5, 0x1); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x5, 0x1); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) reg = AC97_PCM_FRONT_DAC_RATE; else reg = AC97_PCM_LR_ADC_RATE; - return snd_soc_write(codec, reg, runtime->rate); + return snd_soc_component_write(component, reg, runtime->rate); } static int ac97_digital_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct snd_pcm_runtime *runtime = substream->runtime; unsigned short reg; - snd_soc_write(codec, AC97_SPDIF, 0x2002); + snd_soc_component_write(component, AC97_SPDIF, 0x2002); /* Enable VRA and SPDIF out */ - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x5, 0x5); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x5, 0x5); reg = AC97_PCM_FRONT_DAC_RATE; - return snd_soc_write(codec, reg, runtime->rate); + return snd_soc_component_write(component, reg, runtime->rate); } -static int stac9766_set_bias_level(struct snd_soc_codec *codec, +static int stac9766_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: /* full On */ case SND_SOC_BIAS_PREPARE: /* partial On */ case SND_SOC_BIAS_STANDBY: /* Off, with power */ - snd_soc_write(codec, AC97_POWERDOWN, 0x0000); + snd_soc_component_write(component, AC97_POWERDOWN, 0x0000); break; case SND_SOC_BIAS_OFF: /* Off, without power */ /* disable everything including AC link */ - snd_soc_write(codec, AC97_POWERDOWN, 0xffff); + snd_soc_component_write(component, AC97_POWERDOWN, 0xffff); break; } return 0; } -static int stac9766_codec_resume(struct snd_soc_codec *codec) +static int stac9766_component_resume(struct snd_soc_component *component) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); return snd_ac97_reset(ac97, true, STAC9766_VENDOR_ID, STAC9766_VENDOR_ID_MASK); @@ -272,13 +272,13 @@ static struct snd_soc_dai_driver stac9766_dai[] = { } }; -static int stac9766_codec_probe(struct snd_soc_codec *codec) +static int stac9766_component_probe(struct snd_soc_component *component) { struct snd_ac97 *ac97; struct regmap *regmap; int ret; - ac97 = snd_soc_new_ac97_codec(codec, STAC9766_VENDOR_ID, + ac97 = snd_soc_new_ac97_component(component, STAC9766_VENDOR_ID, STAC9766_VENDOR_ID_MASK); if (IS_ERR(ac97)) return PTR_ERR(ac97); @@ -289,46 +289,42 @@ static int stac9766_codec_probe(struct snd_soc_codec *codec) goto err_free_ac97; } - snd_soc_codec_init_regmap(codec, regmap); - snd_soc_codec_set_drvdata(codec, ac97); + snd_soc_component_init_regmap(component, regmap); + snd_soc_component_set_drvdata(component, ac97); return 0; err_free_ac97: - snd_soc_free_ac97_codec(ac97); + snd_soc_free_ac97_component(ac97); return ret; } -static int stac9766_codec_remove(struct snd_soc_codec *codec) +static void stac9766_component_remove(struct snd_soc_component *component) { - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); - snd_soc_codec_exit_regmap(codec); - snd_soc_free_ac97_codec(ac97); - return 0; + snd_soc_component_exit_regmap(component); + snd_soc_free_ac97_component(ac97); } -static const struct snd_soc_codec_driver soc_codec_dev_stac9766 = { - .component_driver = { - .controls = stac9766_snd_ac97_controls, - .num_controls = ARRAY_SIZE(stac9766_snd_ac97_controls), - }, - .set_bias_level = stac9766_set_bias_level, - .suspend_bias_off = true, - .probe = stac9766_codec_probe, - .remove = stac9766_codec_remove, - .resume = stac9766_codec_resume, +static const struct snd_soc_component_driver soc_component_dev_stac9766 = { + .controls = stac9766_snd_ac97_controls, + .num_controls = ARRAY_SIZE(stac9766_snd_ac97_controls), + .set_bias_level = stac9766_set_bias_level, + .probe = stac9766_component_probe, + .remove = stac9766_component_remove, + .resume = stac9766_component_resume, + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, + }; static int stac9766_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_stac9766, stac9766_dai, ARRAY_SIZE(stac9766_dai)); -} - -static int stac9766_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_stac9766, stac9766_dai, ARRAY_SIZE(stac9766_dai)); } static struct platform_driver stac9766_codec_driver = { @@ -337,7 +333,6 @@ static struct platform_driver stac9766_codec_driver = { }, .probe = stac9766_probe, - .remove = stac9766_remove, }; module_platform_driver(stac9766_codec_driver); diff --git a/sound/soc/codecs/sti-sas.c b/sound/soc/codecs/sti-sas.c index 62c618765224..7316c80b8179 100644 --- a/sound/soc/codecs/sti-sas.c +++ b/sound/soc/codecs/sti-sas.c @@ -106,7 +106,7 @@ static int sti_sas_write_reg(void *context, unsigned int reg, return status; } -static int sti_sas_init_sas_registers(struct snd_soc_codec *codec, +static int sti_sas_init_sas_registers(struct snd_soc_component *component, struct sti_sas_data *data) { int ret; @@ -116,35 +116,35 @@ static int sti_sas_init_sas_registers(struct snd_soc_codec *codec, */ /* Initialise bi-phase formatter to disabled */ - ret = snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL, + ret = snd_soc_component_update_bits(component, STIH407_AUDIO_GLUE_CTRL, SPDIF_BIPHASE_ENABLE_MASK, 0); if (!ret) /* Initialise bi-phase formatter idle value to 0 */ - ret = snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL, + ret = snd_soc_component_update_bits(component, STIH407_AUDIO_GLUE_CTRL, SPDIF_BIPHASE_IDLE_MASK, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to update SPDIF registers\n"); + dev_err(component->dev, "Failed to update SPDIF registers\n"); return ret; } /* Init DAC configuration */ /* init configuration */ - ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, + ret = snd_soc_component_update_bits(component, STIH407_AUDIO_DAC_CTRL, STIH407_DAC_STANDBY_MASK, STIH407_DAC_STANDBY_MASK); if (!ret) - ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, + ret = snd_soc_component_update_bits(component, STIH407_AUDIO_DAC_CTRL, STIH407_DAC_STANDBY_ANA_MASK, STIH407_DAC_STANDBY_ANA_MASK); if (!ret) - ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, + ret = snd_soc_component_update_bits(component, STIH407_AUDIO_DAC_CTRL, STIH407_DAC_SOFTMUTE_MASK, STIH407_DAC_SOFTMUTE_MASK); if (ret < 0) { - dev_err(codec->dev, "Failed to update DAC registers\n"); + dev_err(component->dev, "Failed to update DAC registers\n"); return ret; } @@ -158,7 +158,7 @@ static int sti_sas_dac_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { /* Sanity check only */ if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupporter master mask 0x%x\n", __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); return -EINVAL; @@ -183,14 +183,14 @@ static const struct snd_soc_dapm_route stih407_sas_route[] = { static int stih407_sas_dac_mute(struct snd_soc_dai *dai, int mute, int stream) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) { - return snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, + return snd_soc_component_update_bits(component, STIH407_AUDIO_DAC_CTRL, STIH407_DAC_SOFTMUTE_MASK, STIH407_DAC_SOFTMUTE_MASK); } else { - return snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, + return snd_soc_component_update_bits(component, STIH407_AUDIO_DAC_CTRL, STIH407_DAC_SOFTMUTE_MASK, 0); } @@ -203,7 +203,7 @@ static int sti_sas_spdif_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(dai->codec->dev, + dev_err(dai->component->dev, "%s: ERROR: Unsupporter master mask 0x%x\n", __func__, fmt & SND_SOC_DAIFMT_MASTER_MASK); return -EINVAL; @@ -221,19 +221,19 @@ static int sti_sas_spdif_set_fmt(struct snd_soc_dai *dai, static int sti_sas_spdif_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - return snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL, + return snd_soc_component_update_bits(component, STIH407_AUDIO_GLUE_CTRL, SPDIF_BIPHASE_ENABLE_MASK, SPDIF_BIPHASE_ENABLE_MASK); case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: - return snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL, + return snd_soc_component_update_bits(component, STIH407_AUDIO_GLUE_CTRL, SPDIF_BIPHASE_ENABLE_MASK, 0); default: @@ -260,8 +260,8 @@ static bool sti_sas_volatile_register(struct device *dev, unsigned int reg) static int sti_sas_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct sti_sas_data *drvdata = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = dai->component; + struct sti_sas_data *drvdata = dev_get_drvdata(component->dev); if (dir == SND_SOC_CLOCK_OUT) return 0; @@ -285,20 +285,20 @@ static int sti_sas_set_sysclk(struct snd_soc_dai *dai, int clk_id, static int sti_sas_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct sti_sas_data *drvdata = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = dai->component; + struct sti_sas_data *drvdata = dev_get_drvdata(component->dev); struct snd_pcm_runtime *runtime = substream->runtime; switch (dai->id) { case STI_SAS_DAI_SPDIF_OUT: if ((drvdata->spdif.mclk / runtime->rate) != 128) { - dev_err(codec->dev, "unexpected mclk-fs ratio\n"); + dev_err(component->dev, "unexpected mclk-fs ratio\n"); return -EINVAL; } break; case STI_SAS_DAI_ANALOG_OUT: if ((drvdata->dac.mclk / runtime->rate) != 256) { - dev_err(codec->dev, "unexpected mclk-fs ratio\n"); + dev_err(component->dev, "unexpected mclk-fs ratio\n"); return -EINVAL; } break; @@ -375,29 +375,33 @@ static struct snd_soc_dai_driver sti_sas_dai[] = { }; #ifdef CONFIG_PM_SLEEP -static int sti_sas_resume(struct snd_soc_codec *codec) +static int sti_sas_resume(struct snd_soc_component *component) { - struct sti_sas_data *drvdata = dev_get_drvdata(codec->dev); + struct sti_sas_data *drvdata = dev_get_drvdata(component->dev); - return sti_sas_init_sas_registers(codec, drvdata); + return sti_sas_init_sas_registers(component, drvdata); } #else #define sti_sas_resume NULL #endif -static int sti_sas_codec_probe(struct snd_soc_codec *codec) +static int sti_sas_component_probe(struct snd_soc_component *component) { - struct sti_sas_data *drvdata = dev_get_drvdata(codec->dev); + struct sti_sas_data *drvdata = dev_get_drvdata(component->dev); int ret; - ret = sti_sas_init_sas_registers(codec, drvdata); + ret = sti_sas_init_sas_registers(component, drvdata); return ret; } -static struct snd_soc_codec_driver sti_sas_driver = { - .probe = sti_sas_codec_probe, - .resume = sti_sas_resume, +static struct snd_soc_component_driver sti_sas_driver = { + .probe = sti_sas_component_probe, + .resume = sti_sas_resume, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct of_device_id sti_sas_dev_match[] = { @@ -452,34 +456,26 @@ static int sti_sas_driver_probe(struct platform_device *pdev) sti_sas_dai[STI_SAS_DAI_ANALOG_OUT].ops = drvdata->dev_data->dac_ops; /* Set dapms*/ - sti_sas_driver.component_driver.dapm_widgets = drvdata->dev_data->dapm_widgets; - sti_sas_driver.component_driver.num_dapm_widgets = drvdata->dev_data->num_dapm_widgets; + sti_sas_driver.dapm_widgets = drvdata->dev_data->dapm_widgets; + sti_sas_driver.num_dapm_widgets = drvdata->dev_data->num_dapm_widgets; - sti_sas_driver.component_driver.dapm_routes = drvdata->dev_data->dapm_routes; - sti_sas_driver.component_driver.num_dapm_routes = drvdata->dev_data->num_dapm_routes; + sti_sas_driver.dapm_routes = drvdata->dev_data->dapm_routes; + sti_sas_driver.num_dapm_routes = drvdata->dev_data->num_dapm_routes; /* Store context */ dev_set_drvdata(&pdev->dev, drvdata); - return snd_soc_register_codec(&pdev->dev, &sti_sas_driver, + return devm_snd_soc_register_component(&pdev->dev, &sti_sas_driver, sti_sas_dai, ARRAY_SIZE(sti_sas_dai)); } -static int sti_sas_driver_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - - return 0; -} - static struct platform_driver sti_sas_platform_driver = { .driver = { .name = "sti-sas-codec", .of_match_table = sti_sas_dev_match, }, .probe = sti_sas_driver_probe, - .remove = sti_sas_driver_remove, }; module_platform_driver(sti_sas_platform_driver); diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c index 87307dd0f12e..355ecafb7c0f 100644 --- a/sound/soc/codecs/tas2552.c +++ b/sound/soc/codecs/tas2552.c @@ -70,7 +70,7 @@ static const char *tas2552_supply_names[TAS2552_NUM_SUPPLIES] = { }; struct tas2552_data { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regmap *regmap; struct i2c_client *tas2552_client; struct regulator_bulk_data supplies[TAS2552_NUM_SUPPLIES]; @@ -88,22 +88,22 @@ struct tas2552_data { static int tas2552_post_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - snd_soc_write(codec, TAS2552_RESERVED_0D, 0xc0); - snd_soc_update_bits(codec, TAS2552_LIMIT_RATE_HYS, (1 << 5), + snd_soc_component_write(component, TAS2552_RESERVED_0D, 0xc0); + snd_soc_component_update_bits(component, TAS2552_LIMIT_RATE_HYS, (1 << 5), (1 << 5)); - snd_soc_update_bits(codec, TAS2552_CFG_2, 1, 0); - snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_SWS, 0); + snd_soc_component_update_bits(component, TAS2552_CFG_2, 1, 0); + snd_soc_component_update_bits(component, TAS2552_CFG_1, TAS2552_SWS, 0); break; case SND_SOC_DAPM_POST_PMD: - snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_SWS, + snd_soc_component_update_bits(component, TAS2552_CFG_1, TAS2552_SWS, TAS2552_SWS); - snd_soc_update_bits(codec, TAS2552_CFG_2, 1, 1); - snd_soc_update_bits(codec, TAS2552_LIMIT_RATE_HYS, (1 << 5), 0); - snd_soc_write(codec, TAS2552_RESERVED_0D, 0xbe); + snd_soc_component_update_bits(component, TAS2552_CFG_2, 1, 1); + snd_soc_component_update_bits(component, TAS2552_LIMIT_RATE_HYS, (1 << 5), 0); + snd_soc_component_write(component, TAS2552_RESERVED_0D, 0xbe); break; } return 0; @@ -149,21 +149,21 @@ static void tas2552_sw_shutdown(struct tas2552_data *tas2552, int sw_shutdown) { u8 cfg1_reg = 0; - if (!tas2552->codec) + if (!tas2552->component) return; if (sw_shutdown) cfg1_reg = TAS2552_SWS; - snd_soc_update_bits(tas2552->codec, TAS2552_CFG_1, TAS2552_SWS, + snd_soc_component_update_bits(tas2552->component, TAS2552_CFG_1, TAS2552_SWS, cfg1_reg); } #endif -static int tas2552_setup_pll(struct snd_soc_codec *codec, +static int tas2552_setup_pll(struct snd_soc_component *component, struct snd_pcm_hw_params *params) { - struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); + struct tas2552_data *tas2552 = dev_get_drvdata(component->dev); bool bypass_pll = false; unsigned int pll_clk = params_rate(params) * 512; unsigned int pll_clkin = tas2552->pll_clkin; @@ -177,15 +177,15 @@ static int tas2552_setup_pll(struct snd_soc_codec *codec, pll_clkin += tas2552->tdm_delay; } - pll_enable = snd_soc_read(codec, TAS2552_CFG_2) & TAS2552_PLL_ENABLE; - snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE, 0); + pll_enable = snd_soc_component_read32(component, TAS2552_CFG_2) & TAS2552_PLL_ENABLE; + snd_soc_component_update_bits(component, TAS2552_CFG_2, TAS2552_PLL_ENABLE, 0); if (pll_clkin == pll_clk) bypass_pll = true; if (bypass_pll) { /* By pass the PLL configuration */ - snd_soc_update_bits(codec, TAS2552_PLL_CTRL_2, + snd_soc_component_update_bits(component, TAS2552_PLL_CTRL_2, TAS2552_PLL_BYPASS, TAS2552_PLL_BYPASS); } else { /* Fill in the PLL control registers for J & D @@ -195,7 +195,7 @@ static int tas2552_setup_pll(struct snd_soc_codec *codec, unsigned int d, q, t; u8 j; u8 pll_sel = (tas2552->pll_clk_id << 3) & TAS2552_PLL_SRC_MASK; - u8 p = snd_soc_read(codec, TAS2552_PLL_CTRL_1); + u8 p = snd_soc_component_read32(component, TAS2552_PLL_CTRL_1); p = (p >> 7); @@ -221,20 +221,20 @@ recalc: goto recalc; } - snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_PLL_SRC_MASK, + snd_soc_component_update_bits(component, TAS2552_CFG_1, TAS2552_PLL_SRC_MASK, pll_sel); - snd_soc_update_bits(codec, TAS2552_PLL_CTRL_1, + snd_soc_component_update_bits(component, TAS2552_PLL_CTRL_1, TAS2552_PLL_J_MASK, j); /* Will clear the PLL_BYPASS bit */ - snd_soc_write(codec, TAS2552_PLL_CTRL_2, + snd_soc_component_write(component, TAS2552_PLL_CTRL_2, TAS2552_PLL_D_UPPER(d)); - snd_soc_write(codec, TAS2552_PLL_CTRL_3, + snd_soc_component_write(component, TAS2552_PLL_CTRL_3, TAS2552_PLL_D_LOWER(d)); } /* Restore PLL status */ - snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE, + snd_soc_component_update_bits(component, TAS2552_CFG_2, TAS2552_PLL_ENABLE, pll_enable); return 0; @@ -244,8 +244,8 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = dai->component; + struct tas2552_data *tas2552 = dev_get_drvdata(component->dev); int cpf; u8 ser_ctrl1_reg, wclk_rate; @@ -267,7 +267,7 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, cpf = 64 + tas2552->tdm_delay; break; default: - dev_err(codec->dev, "Not supported sample size: %d\n", + dev_err(component->dev, "Not supported sample size: %d\n", params_width(params)); return -EINVAL; } @@ -281,7 +281,7 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, else ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_256; - snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, + snd_soc_component_update_bits(component, TAS2552_SER_CTRL_1, TAS2552_WORDLENGTH_MASK | TAS2552_CLKSPERFRAME_MASK, ser_ctrl1_reg); @@ -316,15 +316,15 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, wclk_rate = TAS2552_WCLK_FREQ_176_192KHZ; break; default: - dev_err(codec->dev, "Not supported sample rate: %d\n", + dev_err(component->dev, "Not supported sample rate: %d\n", params_rate(params)); return -EINVAL; } - snd_soc_update_bits(codec, TAS2552_CFG_3, TAS2552_WCLK_FREQ_MASK, + snd_soc_component_update_bits(component, TAS2552_CFG_3, TAS2552_WCLK_FREQ_MASK, wclk_rate); - return tas2552_setup_pll(codec, params); + return tas2552_setup_pll(component, params); } #define TAS2552_DAI_FMT_MASK (TAS2552_BCLKDIR | \ @@ -333,8 +333,8 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, static int tas2552_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); int delay = 0; /* TDM slot selection only valid in DSP_A/_B mode */ @@ -344,15 +344,15 @@ static int tas2552_prepare(struct snd_pcm_substream *substream, delay += tas2552->tdm_delay; /* Configure data delay */ - snd_soc_write(codec, TAS2552_SER_CTRL_2, delay); + snd_soc_component_write(component, TAS2552_SER_CTRL_2, delay); return 0; } static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = dai->component; + struct tas2552_data *tas2552 = dev_get_drvdata(component->dev); u8 serial_format; switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -369,7 +369,7 @@ static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) serial_format = (TAS2552_BCLKDIR | TAS2552_WCLKDIR); break; default: - dev_vdbg(codec->dev, "DAI Format master is not found\n"); + dev_vdbg(component->dev, "DAI Format master is not found\n"); return -EINVAL; } @@ -388,12 +388,12 @@ static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) serial_format |= TAS2552_DATAFORMAT_LEFT_J; break; default: - dev_vdbg(codec->dev, "DAI Format is not found\n"); + dev_vdbg(component->dev, "DAI Format is not found\n"); return -EINVAL; } tas2552->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; - snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, TAS2552_DAI_FMT_MASK, + snd_soc_component_update_bits(component, TAS2552_SER_CTRL_1, TAS2552_DAI_FMT_MASK, serial_format); return 0; } @@ -401,8 +401,8 @@ static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) static int tas2552_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = dai->codec; - struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = dai->component; + struct tas2552_data *tas2552 = dev_get_drvdata(component->dev); u8 reg, mask, val; switch (clk_id) { @@ -410,7 +410,7 @@ static int tas2552_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, case TAS2552_PLL_CLKIN_IVCLKIN: if (freq < 512000 || freq > 24576000) { /* out of range PLL_CLKIN, fall back to use BCLK */ - dev_warn(codec->dev, "Out of range PLL_CLKIN: %u\n", + dev_warn(component->dev, "Out of range PLL_CLKIN: %u\n", freq); clk_id = TAS2552_PLL_CLKIN_BCLK; freq = 0; @@ -435,11 +435,11 @@ static int tas2552_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, tas2552->pdm_clk = freq; break; default: - dev_err(codec->dev, "Invalid clk id: %d\n", clk_id); + dev_err(component->dev, "Invalid clk id: %d\n", clk_id); return -EINVAL; } - snd_soc_update_bits(codec, reg, mask, val); + snd_soc_component_update_bits(component, reg, mask, val); return 0; } @@ -448,26 +448,26 @@ static int tas2552_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); unsigned int lsb; if (unlikely(!tx_mask)) { - dev_err(codec->dev, "tx masks need to be non 0\n"); + dev_err(component->dev, "tx masks need to be non 0\n"); return -EINVAL; } /* TDM based on DSP mode requires slots to be adjacent */ lsb = __ffs(tx_mask); if ((lsb + 1) != __fls(tx_mask)) { - dev_err(codec->dev, "Invalid mask, slots must be adjacent\n"); + dev_err(component->dev, "Invalid mask, slots must be adjacent\n"); return -EINVAL; } tas2552->tdm_delay = lsb * slot_width; /* DOUT in high-impedance on inactive bit clocks */ - snd_soc_update_bits(codec, TAS2552_DOUT, + snd_soc_component_update_bits(component, TAS2552_DOUT, TAS2552_SDOUT_TRISTATE, TAS2552_SDOUT_TRISTATE); return 0; @@ -476,12 +476,12 @@ static int tas2552_set_dai_tdm_slot(struct snd_soc_dai *dai, static int tas2552_mute(struct snd_soc_dai *dai, int mute) { u8 cfg1_reg = 0; - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; if (mute) cfg1_reg |= TAS2552_MUTE; - snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_MUTE, cfg1_reg); + snd_soc_component_update_bits(component, TAS2552_CFG_1, TAS2552_MUTE, cfg1_reg); return 0; } @@ -570,41 +570,41 @@ static const struct snd_kcontrol_new tas2552_snd_controls[] = { SOC_ENUM("DIN source", tas2552_din_source_enum), }; -static int tas2552_codec_probe(struct snd_soc_codec *codec) +static int tas2552_component_probe(struct snd_soc_component *component) { - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); int ret; - tas2552->codec = codec; + tas2552->component = component; ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies), tas2552->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); return ret; } gpiod_set_value(tas2552->enable_gpio, 1); - ret = pm_runtime_get_sync(codec->dev); + ret = pm_runtime_get_sync(component->dev); if (ret < 0) { - dev_err(codec->dev, "Enabling device failed: %d\n", + dev_err(component->dev, "Enabling device failed: %d\n", ret); goto probe_fail; } - snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_MUTE, TAS2552_MUTE); - snd_soc_write(codec, TAS2552_CFG_3, TAS2552_I2S_OUT_SEL | + snd_soc_component_update_bits(component, TAS2552_CFG_1, TAS2552_MUTE, TAS2552_MUTE); + snd_soc_component_write(component, TAS2552_CFG_3, TAS2552_I2S_OUT_SEL | TAS2552_DIN_SRC_SEL_AVG_L_R); - snd_soc_write(codec, TAS2552_OUTPUT_DATA, + snd_soc_component_write(component, TAS2552_OUTPUT_DATA, TAS2552_PDM_DATA_SEL_V_I | TAS2552_R_DATA_OUT(TAS2552_DATA_OUT_V_DATA)); - snd_soc_write(codec, TAS2552_BOOST_APT_CTRL, TAS2552_APT_DELAY_200 | + snd_soc_component_write(component, TAS2552_BOOST_APT_CTRL, TAS2552_APT_DELAY_200 | TAS2552_APT_THRESH_20_17); - snd_soc_write(codec, TAS2552_CFG_2, TAS2552_BOOST_EN | TAS2552_APT_EN | + snd_soc_component_write(component, TAS2552_CFG_2, TAS2552_BOOST_EN | TAS2552_APT_EN | TAS2552_LIM_EN); return 0; @@ -617,42 +617,40 @@ probe_fail: return ret; } -static int tas2552_codec_remove(struct snd_soc_codec *codec) +static void tas2552_component_remove(struct snd_soc_component *component) { - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); - pm_runtime_put(codec->dev); + pm_runtime_put(component->dev); gpiod_set_value(tas2552->enable_gpio, 0); - - return 0; }; #ifdef CONFIG_PM -static int tas2552_suspend(struct snd_soc_codec *codec) +static int tas2552_suspend(struct snd_soc_component *component) { - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_disable(ARRAY_SIZE(tas2552->supplies), tas2552->supplies); if (ret != 0) - dev_err(codec->dev, "Failed to disable supplies: %d\n", + dev_err(component->dev, "Failed to disable supplies: %d\n", ret); return ret; } -static int tas2552_resume(struct snd_soc_codec *codec) +static int tas2552_resume(struct snd_soc_component *component) { - struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec); + struct tas2552_data *tas2552 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies), tas2552->supplies); if (ret != 0) { - dev_err(codec->dev, "Failed to enable supplies: %d\n", + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); } @@ -663,21 +661,20 @@ static int tas2552_resume(struct snd_soc_codec *codec) #define tas2552_resume NULL #endif -static const struct snd_soc_codec_driver soc_codec_dev_tas2552 = { - .probe = tas2552_codec_probe, - .remove = tas2552_codec_remove, - .suspend = tas2552_suspend, - .resume = tas2552_resume, - .ignore_pmdown_time = true, - - .component_driver = { - .controls = tas2552_snd_controls, - .num_controls = ARRAY_SIZE(tas2552_snd_controls), - .dapm_widgets = tas2552_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas2552_dapm_widgets), - .dapm_routes = tas2552_audio_map, - .num_dapm_routes = ARRAY_SIZE(tas2552_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_tas2552 = { + .probe = tas2552_component_probe, + .remove = tas2552_component_remove, + .suspend = tas2552_suspend, + .resume = tas2552_resume, + .controls = tas2552_snd_controls, + .num_controls = ARRAY_SIZE(tas2552_snd_controls), + .dapm_widgets = tas2552_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas2552_dapm_widgets), + .dapm_routes = tas2552_audio_map, + .num_dapm_routes = ARRAY_SIZE(tas2552_audio_map), + .idle_bias_on = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config tas2552_regmap_config = { @@ -736,18 +733,17 @@ static int tas2552_probe(struct i2c_client *client, dev_set_drvdata(&client->dev, data); - ret = snd_soc_register_codec(&client->dev, - &soc_codec_dev_tas2552, + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_dev_tas2552, tas2552_dai, ARRAY_SIZE(tas2552_dai)); if (ret < 0) - dev_err(&client->dev, "Failed to register codec: %d\n", ret); + dev_err(&client->dev, "Failed to register component: %d\n", ret); return ret; } static int tas2552_i2c_remove(struct i2c_client *client) { - snd_soc_unregister_codec(&client->dev); pm_runtime_disable(&client->dev); return 0; } diff --git a/sound/soc/codecs/tas5086.c b/sound/soc/codecs/tas5086.c index 199272d5cb6a..5efc4b7145d4 100644 --- a/sound/soc/codecs/tas5086.c +++ b/sound/soc/codecs/tas5086.c @@ -261,9 +261,9 @@ struct tas5086_private { static int tas5086_deemph[] = { 0, 32000, 44100, 48000 }; -static int tas5086_set_deemph(struct snd_soc_codec *codec) +static int tas5086_set_deemph(struct snd_soc_component *component) { - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); int i, val = 0; if (priv->deemph) { @@ -282,8 +282,8 @@ static int tas5086_set_deemph(struct snd_soc_codec *codec) static int tas5086_get_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = priv->deemph; @@ -293,20 +293,20 @@ static int tas5086_get_deemph(struct snd_kcontrol *kcontrol, static int tas5086_put_deemph(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); priv->deemph = ucontrol->value.integer.value[0]; - return tas5086_set_deemph(codec); + return tas5086_set_deemph(component); } static int tas5086_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); switch (clk_id) { case TAS5086_CLK_IDX_MCLK: @@ -323,12 +323,12 @@ static int tas5086_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int tas5086_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int format) { - struct snd_soc_codec *codec = codec_dai->codec; - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); /* The TAS5086 can only be slave to all clocks */ if ((format & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_err(codec->dev, "Invalid clocking mode\n"); + dev_err(component->dev, "Invalid clocking mode\n"); return -EINVAL; } @@ -361,8 +361,8 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); int val; int ret; @@ -373,7 +373,7 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, ARRAY_SIZE(tas5086_sample_rates), priv->rate); if (val < 0) { - dev_err(codec->dev, "Invalid sample rate\n"); + dev_err(component->dev, "Invalid sample rate\n"); return -EINVAL; } @@ -387,7 +387,7 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, val = index_in_array(tas5086_ratios, ARRAY_SIZE(tas5086_ratios), priv->mclk / priv->rate); if (val < 0) { - dev_err(codec->dev, "Invalid MCLK / Fs ratio\n"); + dev_err(component->dev, "Invalid MCLK / Fs ratio\n"); return -EINVAL; } @@ -424,7 +424,7 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, val = 0x06; break; default: - dev_err(codec->dev, "Invalid DAI format\n"); + dev_err(component->dev, "Invalid DAI format\n"); return -EINVAL; } @@ -440,7 +440,7 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, val += 2; break; default: - dev_err(codec->dev, "Invalid bit width\n"); + dev_err(component->dev, "Invalid bit width\n"); return -EINVAL; } @@ -454,13 +454,13 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - return tas5086_set_deemph(codec); + return tas5086_set_deemph(component); } static int tas5086_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { - struct snd_soc_codec *codec = dai->codec; - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); unsigned int val = 0; if (mute) @@ -773,9 +773,9 @@ static struct snd_soc_dai_driver tas5086_dai = { }; #ifdef CONFIG_PM -static int tas5086_soc_suspend(struct snd_soc_codec *codec) +static int tas5086_soc_suspend(struct snd_soc_component *component) { - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); int ret; /* Shut down all channels */ @@ -788,9 +788,9 @@ static int tas5086_soc_suspend(struct snd_soc_codec *codec) return 0; } -static int tas5086_soc_resume(struct snd_soc_codec *codec) +static int tas5086_soc_resume(struct snd_soc_component *component) { - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); @@ -800,7 +800,7 @@ static int tas5086_soc_resume(struct snd_soc_codec *codec) tas5086_reset(priv); regcache_mark_dirty(priv->regmap); - ret = tas5086_init(codec->dev, priv); + ret = tas5086_init(component->dev, priv); if (ret < 0) return ret; @@ -823,22 +823,22 @@ static const struct of_device_id tas5086_dt_ids[] = { MODULE_DEVICE_TABLE(of, tas5086_dt_ids); #endif -static int tas5086_probe(struct snd_soc_codec *codec) +static int tas5086_probe(struct snd_soc_component *component) { - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); int i, ret; ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies); if (ret < 0) { - dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); + dev_err(component->dev, "Failed to enable regulators: %d\n", ret); return ret; } priv->pwm_start_mid_z = 0; priv->charge_period = 1300000; /* hardware default is 1300 ms */ - if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) { - struct device_node *of_node = codec->dev->of_node; + if (of_match_device(of_match_ptr(tas5086_dt_ids), component->dev)) { + struct device_node *of_node = component->dev->of_node; of_property_read_u32(of_node, "ti,charge-period", &priv->charge_period); @@ -855,7 +855,7 @@ static int tas5086_probe(struct snd_soc_codec *codec) } tas5086_reset(priv); - ret = tas5086_init(codec->dev, priv); + ret = tas5086_init(component->dev, priv); if (ret < 0) goto exit_disable_regulators; @@ -872,32 +872,32 @@ exit_disable_regulators: return ret; } -static int tas5086_remove(struct snd_soc_codec *codec) +static void tas5086_remove(struct snd_soc_component *component) { - struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas5086_private *priv = snd_soc_component_get_drvdata(component); if (gpio_is_valid(priv->gpio_nreset)) /* Set codec to the reset state */ gpio_set_value(priv->gpio_nreset, 0); regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); - - return 0; }; -static const struct snd_soc_codec_driver soc_codec_dev_tas5086 = { +static const struct snd_soc_component_driver soc_component_dev_tas5086 = { .probe = tas5086_probe, .remove = tas5086_remove, .suspend = tas5086_soc_suspend, .resume = tas5086_soc_resume, - .component_driver = { - .controls = tas5086_controls, - .num_controls = ARRAY_SIZE(tas5086_controls), - .dapm_widgets = tas5086_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas5086_dapm_widgets), - .dapm_routes = tas5086_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(tas5086_dapm_routes), - }, + .controls = tas5086_controls, + .num_controls = ARRAY_SIZE(tas5086_controls), + .dapm_widgets = tas5086_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas5086_dapm_widgets), + .dapm_routes = tas5086_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(tas5086_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct i2c_device_id tas5086_i2c_id[] = { @@ -985,7 +985,8 @@ static int tas5086_i2c_probe(struct i2c_client *i2c, regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies); if (ret == 0) - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_tas5086, + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_tas5086, &tas5086_dai, 1); return ret; @@ -993,7 +994,6 @@ static int tas5086_i2c_probe(struct i2c_client *i2c, static int tas5086_i2c_remove(struct i2c_client *i2c) { - snd_soc_unregister_codec(&i2c->dev); return 0; } diff --git a/sound/soc/codecs/tas571x.c b/sound/soc/codecs/tas571x.c index a09499977be4..52f34c94ec25 100644 --- a/sound/soc/codecs/tas571x.c +++ b/sound/soc/codecs/tas571x.c @@ -51,7 +51,7 @@ struct tas571x_private { unsigned int format; struct gpio_desc *reset_gpio; struct gpio_desc *pdn_gpio; - struct snd_soc_codec_driver codec_driver; + struct snd_soc_component_driver component_driver; }; static int tas571x_register_size(struct tas571x_private *priv, unsigned int reg) @@ -242,8 +242,8 @@ static int tas571x_coefficient_info(struct snd_kcontrol *kcontrol, static int tas571x_coefficient_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct i2c_client *i2c = to_i2c_client(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct i2c_client *i2c = to_i2c_client(component->dev); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; @@ -254,8 +254,8 @@ static int tas571x_coefficient_get(struct snd_kcontrol *kcontrol, static int tas571x_coefficient_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct i2c_client *i2c = to_i2c_client(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct i2c_client *i2c = to_i2c_client(component->dev); int numcoef = kcontrol->private_value >> 16; int index = kcontrol->private_value & 0xffff; @@ -265,7 +265,7 @@ static int tas571x_coefficient_put(struct snd_kcontrol *kcontrol, static int tas571x_set_dai_fmt(struct snd_soc_dai *dai, unsigned int format) { - struct tas571x_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct tas571x_private *priv = snd_soc_component_get_drvdata(dai->component); priv->format = format; @@ -276,7 +276,7 @@ static int tas571x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct tas571x_private *priv = snd_soc_codec_get_drvdata(dai->codec); + struct tas571x_private *priv = snd_soc_component_get_drvdata(dai->component); u32 val; switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -304,13 +304,13 @@ static int tas571x_hw_params(struct snd_pcm_substream *substream, static int tas571x_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 sysctl2; int ret; sysctl2 = mute ? TAS571X_SYS_CTRL_2_SDN_MASK : 0; - ret = snd_soc_update_bits(codec, + ret = snd_soc_component_update_bits(component, TAS571X_SYS_CTRL_2_REG, TAS571X_SYS_CTRL_2_SDN_MASK, sysctl2); @@ -319,10 +319,10 @@ static int tas571x_mute(struct snd_soc_dai *dai, int mute) return ret; } -static int tas571x_set_bias_level(struct snd_soc_codec *codec, +static int tas571x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct tas571x_private *priv = snd_soc_codec_get_drvdata(codec); + struct tas571x_private *priv = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -331,11 +331,11 @@ static int tas571x_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { if (!IS_ERR(priv->mclk)) { ret = clk_prepare_enable(priv->mclk); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable master clock: %d\n", ret); return ret; @@ -643,16 +643,15 @@ static const struct snd_soc_dapm_route tas571x_dapm_routes[] = { { "OUT_D", NULL, "DACR" }, }; -static const struct snd_soc_codec_driver tas571x_codec = { - .set_bias_level = tas571x_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .dapm_widgets = tas571x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas571x_dapm_widgets), - .dapm_routes = tas571x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(tas571x_dapm_routes), - }, +static const struct snd_soc_component_driver tas571x_component = { + .set_bias_level = tas571x_set_bias_level, + .dapm_widgets = tas571x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas571x_dapm_widgets), + .dapm_routes = tas571x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(tas571x_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_driver tas571x_dai = { @@ -746,9 +745,9 @@ static int tas571x_i2c_probe(struct i2c_client *client, usleep_range(50000, 60000); - memcpy(&priv->codec_driver, &tas571x_codec, sizeof(priv->codec_driver)); - priv->codec_driver.component_driver.controls = priv->chip->controls; - priv->codec_driver.component_driver.num_controls = priv->chip->num_controls; + memcpy(&priv->component_driver, &tas571x_component, sizeof(priv->component_driver)); + priv->component_driver.controls = priv->chip->controls; + priv->component_driver.num_controls = priv->chip->num_controls; if (priv->chip->vol_reg_size == 2) { /* @@ -761,7 +760,8 @@ static int tas571x_i2c_probe(struct i2c_client *client, return ret; } - return snd_soc_register_codec(&client->dev, &priv->codec_driver, + return devm_snd_soc_register_component(&client->dev, + &priv->component_driver, &tas571x_dai, 1); } @@ -769,7 +769,6 @@ static int tas571x_i2c_remove(struct i2c_client *client) { struct tas571x_private *priv = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); regulator_bulk_disable(priv->chip->num_supply_names, priv->supplies); return 0; diff --git a/sound/soc/codecs/tas5720.c b/sound/soc/codecs/tas5720.c index f3006f301fe8..ae3d032ac35a 100644 --- a/sound/soc/codecs/tas5720.c +++ b/sound/soc/codecs/tas5720.c @@ -49,7 +49,7 @@ static const char * const tas5720_supply_names[] = { #define TAS5720_NUM_SUPPLIES ARRAY_SIZE(tas5720_supply_names) struct tas5720_data { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regmap *regmap; struct i2c_client *tas5720_client; enum tas572x_type devtype; @@ -62,7 +62,7 @@ static int tas5720_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int rate = params_rate(params); bool ssz_ds; int ret; @@ -77,14 +77,14 @@ static int tas5720_hw_params(struct snd_pcm_substream *substream, ssz_ds = true; break; default: - dev_err(codec->dev, "unsupported sample rate: %u\n", rate); + dev_err(component->dev, "unsupported sample rate: %u\n", rate); return -EINVAL; } - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL1_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL1_REG, TAS5720_SSZ_DS, ssz_ds); if (ret < 0) { - dev_err(codec->dev, "error setting sample rate: %d\n", ret); + dev_err(component->dev, "error setting sample rate: %d\n", ret); return ret; } @@ -93,12 +93,12 @@ static int tas5720_hw_params(struct snd_pcm_substream *substream, static int tas5720_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 serial_format; int ret; if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) { - dev_vdbg(codec->dev, "DAI Format master is not found\n"); + dev_vdbg(component->dev, "DAI Format master is not found\n"); return -EINVAL; } @@ -132,15 +132,15 @@ static int tas5720_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) serial_format = TAS5720_SAIF_LEFTJ; break; default: - dev_vdbg(codec->dev, "DAI Format is not found\n"); + dev_vdbg(component->dev, "DAI Format is not found\n"); return -EINVAL; } - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL1_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL1_REG, TAS5720_SAIF_FORMAT_MASK, serial_format); if (ret < 0) { - dev_err(codec->dev, "error setting SAIF format: %d\n", ret); + dev_err(component->dev, "error setting SAIF format: %d\n", ret); return ret; } @@ -151,12 +151,12 @@ static int tas5720_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int first_slot; int ret; if (!tx_mask) { - dev_err(codec->dev, "tx masks must not be 0\n"); + dev_err(component->dev, "tx masks must not be 0\n"); return -EINVAL; } @@ -168,39 +168,39 @@ static int tas5720_set_dai_tdm_slot(struct snd_soc_dai *dai, first_slot = __ffs(tx_mask); if (first_slot > 7) { - dev_err(codec->dev, "slot selection out of bounds (%u)\n", + dev_err(component->dev, "slot selection out of bounds (%u)\n", first_slot); return -EINVAL; } /* Enable manual TDM slot selection (instead of I2C ID based) */ - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL1_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL1_REG, TAS5720_TDM_CFG_SRC, TAS5720_TDM_CFG_SRC); if (ret < 0) - goto error_snd_soc_update_bits; + goto error_snd_soc_component_update_bits; /* Configure the TDM slot to process audio from */ - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL2_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL2_REG, TAS5720_TDM_SLOT_SEL_MASK, first_slot); if (ret < 0) - goto error_snd_soc_update_bits; + goto error_snd_soc_component_update_bits; return 0; -error_snd_soc_update_bits: - dev_err(codec->dev, "error configuring TDM mode: %d\n", ret); +error_snd_soc_component_update_bits: + dev_err(component->dev, "error configuring TDM mode: %d\n", ret); return ret; } static int tas5720_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int ret; - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL2_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL2_REG, TAS5720_MUTE, mute ? TAS5720_MUTE : 0); if (ret < 0) { - dev_err(codec->dev, "error (un-)muting device: %d\n", ret); + dev_err(component->dev, "error (un-)muting device: %d\n", ret); return ret; } @@ -211,7 +211,7 @@ static void tas5720_fault_check_work(struct work_struct *work) { struct tas5720_data *tas5720 = container_of(work, struct tas5720_data, fault_check_work.work); - struct device *dev = tas5720->codec->dev; + struct device *dev = tas5720->component->dev; unsigned int curr_fault; int ret; @@ -267,18 +267,18 @@ out: msecs_to_jiffies(TAS5720_FAULT_CHECK_INTERVAL)); } -static int tas5720_codec_probe(struct snd_soc_codec *codec) +static int tas5720_codec_probe(struct snd_soc_component *component) { - struct tas5720_data *tas5720 = snd_soc_codec_get_drvdata(codec); + struct tas5720_data *tas5720 = snd_soc_component_get_drvdata(component); unsigned int device_id, expected_device_id; int ret; - tas5720->codec = codec; + tas5720->component = component; ret = regulator_bulk_enable(ARRAY_SIZE(tas5720->supplies), tas5720->supplies); if (ret != 0) { - dev_err(codec->dev, "failed to enable supplies: %d\n", ret); + dev_err(component->dev, "failed to enable supplies: %d\n", ret); return ret; } @@ -289,7 +289,7 @@ static int tas5720_codec_probe(struct snd_soc_codec *codec) */ ret = regmap_read(tas5720->regmap, TAS5720_DEVICE_ID_REG, &device_id); if (ret < 0) { - dev_err(codec->dev, "failed to read device ID register: %d\n", + dev_err(component->dev, "failed to read device ID register: %d\n", ret); goto probe_fail; } @@ -302,19 +302,19 @@ static int tas5720_codec_probe(struct snd_soc_codec *codec) expected_device_id = TAS5722_DEVICE_ID; break; default: - dev_err(codec->dev, "unexpected private driver data\n"); + dev_err(component->dev, "unexpected private driver data\n"); return -EINVAL; } if (device_id != expected_device_id) - dev_warn(codec->dev, "wrong device ID. expected: %u read: %u\n", + dev_warn(component->dev, "wrong device ID. expected: %u read: %u\n", expected_device_id, device_id); /* Set device to mute */ - ret = snd_soc_update_bits(codec, TAS5720_DIGITAL_CTRL2_REG, + ret = snd_soc_component_update_bits(component, TAS5720_DIGITAL_CTRL2_REG, TAS5720_MUTE, TAS5720_MUTE); if (ret < 0) - goto error_snd_soc_update_bits; + goto error_snd_soc_component_update_bits; /* * Enter shutdown mode - our default when not playing audio - to @@ -322,17 +322,17 @@ static int tas5720_codec_probe(struct snd_soc_codec *codec) * side doing so as all device registers are preserved and the wakeup * of the codec is rather quick which we do using a dapm widget. */ - ret = snd_soc_update_bits(codec, TAS5720_POWER_CTRL_REG, + ret = snd_soc_component_update_bits(component, TAS5720_POWER_CTRL_REG, TAS5720_SDZ, 0); if (ret < 0) - goto error_snd_soc_update_bits; + goto error_snd_soc_component_update_bits; INIT_DELAYED_WORK(&tas5720->fault_check_work, tas5720_fault_check_work); return 0; -error_snd_soc_update_bits: - dev_err(codec->dev, "error configuring device registers: %d\n", ret); +error_snd_soc_component_update_bits: + dev_err(component->dev, "error configuring device registers: %d\n", ret); probe_fail: regulator_bulk_disable(ARRAY_SIZE(tas5720->supplies), @@ -340,9 +340,9 @@ probe_fail: return ret; } -static int tas5720_codec_remove(struct snd_soc_codec *codec) +static void tas5720_codec_remove(struct snd_soc_component *component) { - struct tas5720_data *tas5720 = snd_soc_codec_get_drvdata(codec); + struct tas5720_data *tas5720 = snd_soc_component_get_drvdata(component); int ret; cancel_delayed_work_sync(&tas5720->fault_check_work); @@ -350,24 +350,22 @@ static int tas5720_codec_remove(struct snd_soc_codec *codec) ret = regulator_bulk_disable(ARRAY_SIZE(tas5720->supplies), tas5720->supplies); if (ret < 0) - dev_err(codec->dev, "failed to disable supplies: %d\n", ret); - - return ret; + dev_err(component->dev, "failed to disable supplies: %d\n", ret); }; static int tas5720_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tas5720_data *tas5720 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct tas5720_data *tas5720 = snd_soc_component_get_drvdata(component); int ret; if (event & SND_SOC_DAPM_POST_PMU) { /* Take TAS5720 out of shutdown mode */ - ret = snd_soc_update_bits(codec, TAS5720_POWER_CTRL_REG, + ret = snd_soc_component_update_bits(component, TAS5720_POWER_CTRL_REG, TAS5720_SDZ, TAS5720_SDZ); if (ret < 0) { - dev_err(codec->dev, "error waking codec: %d\n", ret); + dev_err(component->dev, "error waking component: %d\n", ret); return ret; } @@ -390,10 +388,10 @@ static int tas5720_dac_event(struct snd_soc_dapm_widget *w, cancel_delayed_work_sync(&tas5720->fault_check_work); /* Place TAS5720 in shutdown mode to minimize current draw */ - ret = snd_soc_update_bits(codec, TAS5720_POWER_CTRL_REG, + ret = snd_soc_component_update_bits(component, TAS5720_POWER_CTRL_REG, TAS5720_SDZ, 0); if (ret < 0) { - dev_err(codec->dev, "error shutting down codec: %d\n", + dev_err(component->dev, "error shutting down component: %d\n", ret); return ret; } @@ -403,9 +401,9 @@ static int tas5720_dac_event(struct snd_soc_dapm_widget *w, } #ifdef CONFIG_PM -static int tas5720_suspend(struct snd_soc_codec *codec) +static int tas5720_suspend(struct snd_soc_component *component) { - struct tas5720_data *tas5720 = snd_soc_codec_get_drvdata(codec); + struct tas5720_data *tas5720 = snd_soc_component_get_drvdata(component); int ret; regcache_cache_only(tas5720->regmap, true); @@ -414,20 +412,20 @@ static int tas5720_suspend(struct snd_soc_codec *codec) ret = regulator_bulk_disable(ARRAY_SIZE(tas5720->supplies), tas5720->supplies); if (ret < 0) - dev_err(codec->dev, "failed to disable supplies: %d\n", ret); + dev_err(component->dev, "failed to disable supplies: %d\n", ret); return ret; } -static int tas5720_resume(struct snd_soc_codec *codec) +static int tas5720_resume(struct snd_soc_component *component) { - struct tas5720_data *tas5720 = snd_soc_codec_get_drvdata(codec); + struct tas5720_data *tas5720 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(tas5720->supplies), tas5720->supplies); if (ret < 0) { - dev_err(codec->dev, "failed to enable supplies: %d\n", ret); + dev_err(component->dev, "failed to enable supplies: %d\n", ret); return ret; } @@ -435,7 +433,7 @@ static int tas5720_resume(struct snd_soc_codec *codec) ret = regcache_sync(tas5720->regmap); if (ret < 0) { - dev_err(codec->dev, "failed to sync regcache: %d\n", ret); + dev_err(component->dev, "failed to sync regcache: %d\n", ret); return ret; } @@ -512,20 +510,21 @@ static const struct snd_soc_dapm_route tas5720_audio_map[] = { { "OUT", NULL, "DAC" }, }; -static const struct snd_soc_codec_driver soc_codec_dev_tas5720 = { - .probe = tas5720_codec_probe, - .remove = tas5720_codec_remove, - .suspend = tas5720_suspend, - .resume = tas5720_resume, - - .component_driver = { - .controls = tas5720_snd_controls, - .num_controls = ARRAY_SIZE(tas5720_snd_controls), - .dapm_widgets = tas5720_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas5720_dapm_widgets), - .dapm_routes = tas5720_audio_map, - .num_dapm_routes = ARRAY_SIZE(tas5720_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_tas5720 = { + .probe = tas5720_codec_probe, + .remove = tas5720_codec_remove, + .suspend = tas5720_suspend, + .resume = tas5720_resume, + .controls = tas5720_snd_controls, + .num_controls = ARRAY_SIZE(tas5720_snd_controls), + .dapm_widgets = tas5720_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas5720_dapm_widgets), + .dapm_routes = tas5720_audio_map, + .num_dapm_routes = ARRAY_SIZE(tas5720_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* PCM rates supported by the TAS5720 driver */ @@ -614,26 +613,17 @@ static int tas5720_probe(struct i2c_client *client, dev_set_drvdata(dev, data); - ret = snd_soc_register_codec(&client->dev, - &soc_codec_dev_tas5720, + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_dev_tas5720, tas5720_dai, ARRAY_SIZE(tas5720_dai)); if (ret < 0) { - dev_err(dev, "failed to register codec: %d\n", ret); + dev_err(dev, "failed to register component: %d\n", ret); return ret; } return 0; } -static int tas5720_remove(struct i2c_client *client) -{ - struct device *dev = &client->dev; - - snd_soc_unregister_codec(dev); - - return 0; -} - static const struct i2c_device_id tas5720_id[] = { { "tas5720", TAS5720 }, { "tas5722", TAS5722 }, @@ -656,7 +646,6 @@ static struct i2c_driver tas5720_i2c_driver = { .of_match_table = of_match_ptr(tas5720_of_match), }, .probe = tas5720_probe, - .remove = tas5720_remove, .id_table = tas5720_id, }; diff --git a/sound/soc/codecs/tas6424.c b/sound/soc/codecs/tas6424.c index 49b87f6e85bf..4f3a16c520a2 100644 --- a/sound/soc/codecs/tas6424.c +++ b/sound/soc/codecs/tas6424.c @@ -66,10 +66,10 @@ static const struct snd_kcontrol_new tas6424_snd_controls[] = { static int tas6424_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tas6424_data *tas6424 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s() event=0x%0x\n", __func__, event); + dev_dbg(component->dev, "%s() event=0x%0x\n", __func__, event); if (event & SND_SOC_DAPM_POST_PMU) { /* Observe codec shutdown-to-active time */ @@ -105,12 +105,12 @@ static int tas6424_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int rate = params_rate(params); unsigned int width = params_width(params); u8 sap_ctrl = 0; - dev_dbg(codec->dev, "%s() rate=%u width=%u\n", __func__, rate, width); + dev_dbg(component->dev, "%s() rate=%u width=%u\n", __func__, rate, width); switch (rate) { case 44100: @@ -123,7 +123,7 @@ static int tas6424_hw_params(struct snd_pcm_substream *substream, sap_ctrl |= TAS6424_SAP_RATE_96000; break; default: - dev_err(codec->dev, "unsupported sample rate: %u\n", rate); + dev_err(component->dev, "unsupported sample rate: %u\n", rate); return -EINVAL; } @@ -134,11 +134,11 @@ static int tas6424_hw_params(struct snd_pcm_substream *substream, case 24: break; default: - dev_err(codec->dev, "unsupported sample width: %u\n", width); + dev_err(component->dev, "unsupported sample width: %u\n", width); return -EINVAL; } - snd_soc_update_bits(codec, TAS6424_SAP_CTRL, + snd_soc_component_update_bits(component, TAS6424_SAP_CTRL, TAS6424_SAP_RATE_MASK | TAS6424_SAP_TDM_SLOT_SZ_16, sap_ctrl); @@ -148,17 +148,17 @@ static int tas6424_hw_params(struct snd_pcm_substream *substream, static int tas6424_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 serial_format = 0; - dev_dbg(codec->dev, "%s() fmt=0x%0x\n", __func__, fmt); + dev_dbg(component->dev, "%s() fmt=0x%0x\n", __func__, fmt); /* clock masters */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: break; default: - dev_err(codec->dev, "Invalid DAI master/slave interface\n"); + dev_err(component->dev, "Invalid DAI master/slave interface\n"); return -EINVAL; } @@ -167,7 +167,7 @@ static int tas6424_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) case SND_SOC_DAIFMT_NB_NF: break; default: - dev_err(codec->dev, "Invalid DAI clock signal polarity\n"); + dev_err(component->dev, "Invalid DAI clock signal polarity\n"); return -EINVAL; } @@ -191,11 +191,11 @@ static int tas6424_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) serial_format |= TAS6424_SAP_LEFTJ; break; default: - dev_err(codec->dev, "Invalid DAI interface format\n"); + dev_err(component->dev, "Invalid DAI interface format\n"); return -EINVAL; } - snd_soc_update_bits(codec, TAS6424_SAP_CTRL, + snd_soc_component_update_bits(component, TAS6424_SAP_CTRL, TAS6424_SAP_FMT_MASK, serial_format); return 0; @@ -205,11 +205,11 @@ static int tas6424_set_dai_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int first_slot, last_slot; bool sap_tdm_slot_last; - dev_dbg(codec->dev, "%s() tx_mask=%d rx_mask=%d\n", __func__, + dev_dbg(component->dev, "%s() tx_mask=%d rx_mask=%d\n", __func__, tx_mask, rx_mask); if (!tx_mask || !rx_mask) @@ -224,7 +224,7 @@ static int tas6424_set_dai_tdm_slot(struct snd_soc_dai *dai, last_slot = __fls(rx_mask); if (last_slot - first_slot != 4) { - dev_err(codec->dev, "tdm mask must cover 4 contiguous slots\n"); + dev_err(component->dev, "tdm mask must cover 4 contiguous slots\n"); return -EINVAL; } @@ -236,11 +236,11 @@ static int tas6424_set_dai_tdm_slot(struct snd_soc_dai *dai, sap_tdm_slot_last = true; break; default: - dev_err(codec->dev, "tdm mask must start at slot 0 or 4\n"); + dev_err(component->dev, "tdm mask must start at slot 0 or 4\n"); return -EINVAL; } - snd_soc_update_bits(codec, TAS6424_SAP_CTRL, TAS6424_SAP_TDM_SLOT_LAST, + snd_soc_component_update_bits(component, TAS6424_SAP_CTRL, TAS6424_SAP_TDM_SLOT_LAST, sap_tdm_slot_last ? TAS6424_SAP_TDM_SLOT_LAST : 0); return 0; @@ -248,27 +248,27 @@ static int tas6424_set_dai_tdm_slot(struct snd_soc_dai *dai, static int tas6424_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; unsigned int val; - dev_dbg(codec->dev, "%s() mute=%d\n", __func__, mute); + dev_dbg(component->dev, "%s() mute=%d\n", __func__, mute); if (mute) val = TAS6424_ALL_STATE_MUTE; else val = TAS6424_ALL_STATE_PLAY; - snd_soc_write(codec, TAS6424_CH_STATE_CTRL, val); + snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, val); return 0; } -static int tas6424_power_off(struct snd_soc_codec *codec) +static int tas6424_power_off(struct snd_soc_component *component) { - struct tas6424_data *tas6424 = snd_soc_codec_get_drvdata(codec); + struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component); int ret; - snd_soc_write(codec, TAS6424_CH_STATE_CTRL, TAS6424_ALL_STATE_HIZ); + snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, TAS6424_ALL_STATE_HIZ); regcache_cache_only(tas6424->regmap, true); regcache_mark_dirty(tas6424->regmap); @@ -276,22 +276,22 @@ static int tas6424_power_off(struct snd_soc_codec *codec) ret = regulator_bulk_disable(ARRAY_SIZE(tas6424->supplies), tas6424->supplies); if (ret < 0) { - dev_err(codec->dev, "failed to disable supplies: %d\n", ret); + dev_err(component->dev, "failed to disable supplies: %d\n", ret); return ret; } return 0; } -static int tas6424_power_on(struct snd_soc_codec *codec) +static int tas6424_power_on(struct snd_soc_component *component) { - struct tas6424_data *tas6424 = snd_soc_codec_get_drvdata(codec); + struct tas6424_data *tas6424 = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(tas6424->supplies), tas6424->supplies); if (ret < 0) { - dev_err(codec->dev, "failed to enable supplies: %d\n", ret); + dev_err(component->dev, "failed to enable supplies: %d\n", ret); return ret; } @@ -299,11 +299,11 @@ static int tas6424_power_on(struct snd_soc_codec *codec) ret = regcache_sync(tas6424->regmap); if (ret < 0) { - dev_err(codec->dev, "failed to sync regcache: %d\n", ret); + dev_err(component->dev, "failed to sync regcache: %d\n", ret); return ret; } - snd_soc_write(codec, TAS6424_CH_STATE_CTRL, TAS6424_ALL_STATE_MUTE); + snd_soc_component_write(component, TAS6424_CH_STATE_CTRL, TAS6424_ALL_STATE_MUTE); /* any time we come out of HIZ, the output channels automatically run DC * load diagnostics, wait here until this completes @@ -313,39 +313,38 @@ static int tas6424_power_on(struct snd_soc_codec *codec) return 0; } -static int tas6424_set_bias_level(struct snd_soc_codec *codec, +static int tas6424_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - dev_dbg(codec->dev, "%s() level=%d\n", __func__, level); + dev_dbg(component->dev, "%s() level=%d\n", __func__, level); switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) - tas6424_power_on(codec); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) + tas6424_power_on(component); break; case SND_SOC_BIAS_OFF: - tas6424_power_off(codec); + tas6424_power_off(component); break; } return 0; } -static struct snd_soc_codec_driver soc_codec_dev_tas6424 = { - .set_bias_level = tas6424_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = tas6424_snd_controls, - .num_controls = ARRAY_SIZE(tas6424_snd_controls), - .dapm_widgets = tas6424_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tas6424_dapm_widgets), - .dapm_routes = tas6424_audio_map, - .num_dapm_routes = ARRAY_SIZE(tas6424_audio_map), - }, +static struct snd_soc_component_driver soc_codec_dev_tas6424 = { + .set_bias_level = tas6424_set_bias_level, + .controls = tas6424_snd_controls, + .num_controls = ARRAY_SIZE(tas6424_snd_controls), + .dapm_widgets = tas6424_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tas6424_dapm_widgets), + .dapm_routes = tas6424_audio_map, + .num_dapm_routes = ARRAY_SIZE(tas6424_audio_map), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_ops tas6424_speaker_dai_ops = { @@ -654,7 +653,7 @@ static int tas6424_i2c_probe(struct i2c_client *client, INIT_DELAYED_WORK(&tas6424->fault_check_work, tas6424_fault_check_work); - ret = snd_soc_register_codec(dev, &soc_codec_dev_tas6424, + ret = devm_snd_soc_register_component(dev, &soc_codec_dev_tas6424, tas6424_dai, ARRAY_SIZE(tas6424_dai)); if (ret < 0) { dev_err(dev, "unable to register codec: %d\n", ret); @@ -670,8 +669,6 @@ static int tas6424_i2c_remove(struct i2c_client *client) struct tas6424_data *tas6424 = dev_get_drvdata(dev); int ret; - snd_soc_unregister_codec(dev); - cancel_delayed_work_sync(&tas6424->fault_check_work); ret = regulator_bulk_disable(ARRAY_SIZE(tas6424->supplies), diff --git a/sound/soc/codecs/tda7419.c b/sound/soc/codecs/tda7419.c new file mode 100644 index 000000000000..225c210ac38f --- /dev/null +++ b/sound/soc/codecs/tda7419.c @@ -0,0 +1,654 @@ +/* + * TDA7419 audio processor driver + * + * Copyright 2018 Konsulko Group + * + * Author: Matt Porter <mporter@konsulko.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include <linux/i2c.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/regmap.h> +#include <sound/core.h> +#include <sound/control.h> +#include <sound/soc.h> +#include <sound/tlv.h> + +#define TDA7419_MAIN_SRC_REG 0x00 +#define TDA7419_LOUDNESS_REG 0x01 +#define TDA7419_MUTE_CLK_REG 0x02 +#define TDA7419_VOLUME_REG 0x03 +#define TDA7419_TREBLE_REG 0x04 +#define TDA7419_MIDDLE_REG 0x05 +#define TDA7419_BASS_REG 0x06 +#define TDA7419_SECOND_SRC_REG 0x07 +#define TDA7419_SUB_MID_BASS_REG 0x08 +#define TDA7419_MIXING_GAIN_REG 0x09 +#define TDA7419_ATTENUATOR_LF_REG 0x0a +#define TDA7419_ATTENUATOR_RF_REG 0x0b +#define TDA7419_ATTENUATOR_LR_REG 0x0c +#define TDA7419_ATTENUATOR_RR_REG 0x0d +#define TDA7419_MIXING_LEVEL_REG 0x0e +#define TDA7419_ATTENUATOR_SUB_REG 0x0f +#define TDA7419_SA_CLK_AC_REG 0x10 +#define TDA7419_TESTING_REG 0x11 + +#define TDA7419_MAIN_SRC_SEL 0 +#define TDA7419_MAIN_SRC_GAIN 3 +#define TDA7419_MAIN_SRC_AUTOZERO 7 + +#define TDA7419_LOUDNESS_ATTEN 0 +#define TDA7419_LOUDNESS_CENTER_FREQ 4 +#define TDA7419_LOUDNESS_BOOST 6 +#define TDA7419_LOUDNESS_SOFT_STEP 7 + +#define TDA7419_VOLUME_SOFT_STEP 7 + +#define TDA7419_SOFT_MUTE 0 +#define TDA7419_MUTE_INFLUENCE 1 +#define TDA7419_SOFT_MUTE_TIME 2 +#define TDA7419_SOFT_STEP_TIME 4 +#define TDA7419_CLK_FAST_MODE 7 + +#define TDA7419_TREBLE_CENTER_FREQ 5 +#define TDA7419_REF_OUT_SELECT 7 + +#define TDA7419_MIDDLE_Q_FACTOR 5 +#define TDA7419_MIDDLE_SOFT_STEP 7 + +#define TDA7419_BASS_Q_FACTOR 5 +#define TDA7419_BASS_SOFT_STEP 7 + +#define TDA7419_SECOND_SRC_SEL 0 +#define TDA7419_SECOND_SRC_GAIN 3 +#define TDA7419_REAR_SPKR_SRC 7 + +#define TDA7419_SUB_CUT_OFF_FREQ 0 +#define TDA7419_MIDDLE_CENTER_FREQ 2 +#define TDA7419_BASS_CENTER_FREQ 4 +#define TDA7419_BASS_DC_MODE 6 +#define TDA7419_SMOOTHING_FILTER 7 + +#define TDA7419_MIX_LF 0 +#define TDA7419_MIX_RF 1 +#define TDA7419_MIX_ENABLE 2 +#define TDA7419_SUB_ENABLE 3 +#define TDA7419_HPF_GAIN 4 + +#define TDA7419_SA_Q_FACTOR 0 +#define TDA7419_RESET_MODE 1 +#define TDA7419_SA_SOURCE 2 +#define TDA7419_SA_RUN 3 +#define TDA7419_RESET 4 +#define TDA7419_CLK_SOURCE 5 +#define TDA7419_COUPLING_MODE 6 + +struct tda7419_data { + struct regmap *regmap; +}; + +static bool tda7419_readable_reg(struct device *dev, unsigned int reg) +{ + return false; +} + +static const struct reg_default tda7419_regmap_defaults[] = { + { TDA7419_MAIN_SRC_REG, 0xfe }, + { TDA7419_LOUDNESS_REG, 0xfe }, + { TDA7419_MUTE_CLK_REG, 0xfe }, + { TDA7419_VOLUME_REG, 0xfe }, + { TDA7419_TREBLE_REG, 0xfe }, + { TDA7419_MIDDLE_REG, 0xfe }, + { TDA7419_BASS_REG, 0xfe }, + { TDA7419_SECOND_SRC_REG, 0xfe }, + { TDA7419_SUB_MID_BASS_REG, 0xfe }, + { TDA7419_MIXING_GAIN_REG, 0xfe }, + { TDA7419_ATTENUATOR_LF_REG, 0xfe }, + { TDA7419_ATTENUATOR_RF_REG, 0xfe }, + { TDA7419_ATTENUATOR_LR_REG, 0xfe }, + { TDA7419_ATTENUATOR_RR_REG, 0xfe }, + { TDA7419_MIXING_LEVEL_REG, 0xfe }, + { TDA7419_ATTENUATOR_SUB_REG, 0xfe }, + { TDA7419_SA_CLK_AC_REG, 0xfe }, + { TDA7419_TESTING_REG, 0xfe }, +}; + +static const struct regmap_config tda7419_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = TDA7419_TESTING_REG, + .cache_type = REGCACHE_RBTREE, + .readable_reg = tda7419_readable_reg, + .reg_defaults = tda7419_regmap_defaults, + .num_reg_defaults = ARRAY_SIZE(tda7419_regmap_defaults), +}; + +struct tda7419_vol_control { + int min, max; + unsigned int reg, rreg, mask, thresh; + unsigned int invert:1; +}; + +static inline bool tda7419_vol_is_stereo(struct tda7419_vol_control *tvc) +{ + if (tvc->reg == tvc->rreg) + return 0; + + return 1; +} + +static int tda7419_vol_info(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_info *uinfo) +{ + struct tda7419_vol_control *tvc = + (struct tda7419_vol_control *)kcontrol->private_value; + + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; + uinfo->count = tda7419_vol_is_stereo(tvc) ? 2 : 1; + uinfo->value.integer.min = tvc->min; + uinfo->value.integer.max = tvc->max; + + return 0; +} + +static inline int tda7419_vol_get_value(int val, unsigned int mask, + int min, int thresh, + unsigned int invert) +{ + val &= mask; + if (val < thresh) { + if (invert) + val = 0 - val; + } else if (val > thresh) { + if (invert) + val = val - thresh; + else + val = thresh - val; + } + + if (val < min) + val = min; + + return val; +} + +static int tda7419_vol_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct tda7419_vol_control *tvc = + (struct tda7419_vol_control *)kcontrol->private_value; + unsigned int reg = tvc->reg; + unsigned int rreg = tvc->rreg; + unsigned int mask = tvc->mask; + int min = tvc->min; + int thresh = tvc->thresh; + unsigned int invert = tvc->invert; + int val; + int ret; + + ret = snd_soc_component_read(component, reg, &val); + if (ret < 0) + return ret; + ucontrol->value.integer.value[0] = + tda7419_vol_get_value(val, mask, min, thresh, invert); + + if (tda7419_vol_is_stereo(tvc)) { + ret = snd_soc_component_read(component, rreg, &val); + if (ret < 0) + return ret; + ucontrol->value.integer.value[1] = + tda7419_vol_get_value(val, mask, min, thresh, invert); + } + + return 0; +} + +static inline int tda7419_vol_put_value(int val, int thresh, + unsigned int invert) +{ + if (val < 0) { + if (invert) + val = abs(val); + else + val = thresh - val; + } else if ((val > 0) && invert) { + val += thresh; + } + + return val; +} + +static int tda7419_vol_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = + snd_kcontrol_chip(kcontrol); + struct tda7419_vol_control *tvc = + (struct tda7419_vol_control *)kcontrol->private_value; + unsigned int reg = tvc->reg; + unsigned int rreg = tvc->rreg; + unsigned int mask = tvc->mask; + int thresh = tvc->thresh; + unsigned int invert = tvc->invert; + int val; + int ret; + + val = tda7419_vol_put_value(ucontrol->value.integer.value[0], + thresh, invert); + ret = snd_soc_component_update_bits(component, reg, + mask, val); + if (ret < 0) + return ret; + + if (tda7419_vol_is_stereo(tvc)) { + val = tda7419_vol_put_value(ucontrol->value.integer.value[1], + thresh, invert); + ret = snd_soc_component_update_bits(component, rreg, + mask, val); + } + + return ret; +} + +#define TDA7419_SINGLE_VALUE(xreg, xmask, xmin, xmax, xthresh, xinvert) \ + ((unsigned long)&(struct tda7419_vol_control) \ + {.reg = xreg, .rreg = xreg, .mask = xmask, .min = xmin, \ + .max = xmax, .thresh = xthresh, .invert = xinvert}) + +#define TDA7419_DOUBLE_R_VALUE(xregl, xregr, xmask, xmin, xmax, xthresh, \ + xinvert) \ + ((unsigned long)&(struct tda7419_vol_control) \ + {.reg = xregl, .rreg = xregr, .mask = xmask, .min = xmin, \ + .max = xmax, .thresh = xthresh, .invert = xinvert}) + +#define TDA7419_SINGLE_TLV(xname, xreg, xmask, xmin, xmax, xthresh, \ + xinvert, xtlv_array) \ +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ + .name = xname, \ + .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ + SNDRV_CTL_ELEM_ACCESS_READWRITE, \ + .tlv.p = (xtlv_array), \ + .info = tda7419_vol_info, \ + .get = tda7419_vol_get, \ + .put = tda7419_vol_put, \ + .private_value = TDA7419_SINGLE_VALUE(xreg, xmask, xmin, \ + xmax, xthresh, xinvert), \ +} + +#define TDA7419_DOUBLE_R_TLV(xname, xregl, xregr, xmask, xmin, xmax, \ + xthresh, xinvert, xtlv_array) \ +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ + .name = xname, \ + .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ + SNDRV_CTL_ELEM_ACCESS_READWRITE, \ + .tlv.p = (xtlv_array), \ + .info = tda7419_vol_info, \ + .get = tda7419_vol_get, \ + .put = tda7419_vol_put, \ + .private_value = TDA7419_DOUBLE_R_VALUE(xregl, xregr, xmask, \ + xmin, xmax, xthresh, \ + xinvert), \ +} + +static const char * const enum_src_sel[] = { + "QD", "SE1", "SE2", "SE3", "SE", "Mute", "Mute", "Mute"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_main_src_sel, + TDA7419_MAIN_SRC_REG, TDA7419_MAIN_SRC_SEL, enum_src_sel); +static const struct snd_kcontrol_new soc_mux_main_src_sel = + SOC_DAPM_ENUM("Main Source Select", soc_enum_main_src_sel); +static DECLARE_TLV_DB_SCALE(tlv_src_gain, 0, 100, 0); +static DECLARE_TLV_DB_SCALE(tlv_loudness_atten, -1500, 100, 0); +static const char * const enum_loudness_center_freq[] = { + "Flat", "400 Hz", "800 Hz", "2400 Hz"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_loudness_center_freq, + TDA7419_LOUDNESS_REG, TDA7419_LOUDNESS_CENTER_FREQ, + enum_loudness_center_freq); +static const char * const enum_mute_influence[] = { + "Pin and IIC", "IIC"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_mute_influence, + TDA7419_MUTE_CLK_REG, TDA7419_MUTE_INFLUENCE, enum_mute_influence); +static const char * const enum_soft_mute_time[] = { + "0.48 ms", "0.96 ms", "123 ms", "123 ms"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_soft_mute_time, + TDA7419_MUTE_CLK_REG, TDA7419_SOFT_MUTE_TIME, enum_soft_mute_time); +static const char * const enum_soft_step_time[] = { + "0.160 ms", "0.321 ms", "0.642 ms", "1.28 ms", + "2.56 ms", "5.12 ms", "10.24 ms", "20.48 ms"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_soft_step_time, + TDA7419_MUTE_CLK_REG, TDA7419_SOFT_STEP_TIME, enum_soft_step_time); +static DECLARE_TLV_DB_SCALE(tlv_volume, -8000, 100, 1); +static const char * const enum_treble_center_freq[] = { + "10.0 kHz", "12.5 kHz", "15.0 kHz", "17.5 kHz"}; +static DECLARE_TLV_DB_SCALE(tlv_filter, -1500, 100, 0); +static SOC_ENUM_SINGLE_DECL(soc_enum_treble_center_freq, + TDA7419_TREBLE_REG, TDA7419_TREBLE_CENTER_FREQ, + enum_treble_center_freq); +static const char * const enum_ref_out_select[] = { + "External Vref (4 V)", "Internal Vref (3.3 V)"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_ref_out_select, + TDA7419_TREBLE_REG, TDA7419_REF_OUT_SELECT, enum_ref_out_select); +static const char * const enum_middle_q_factor[] = { + "0.5", "0.75", "1.0", "1.25"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_middle_q_factor, + TDA7419_MIDDLE_REG, TDA7419_MIDDLE_Q_FACTOR, enum_middle_q_factor); +static const char * const enum_bass_q_factor[] = { + "1.0", "1.25", "1.5", "2.0"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_bass_q_factor, + TDA7419_BASS_REG, TDA7419_BASS_Q_FACTOR, enum_bass_q_factor); +static SOC_ENUM_SINGLE_DECL(soc_enum_second_src_sel, + TDA7419_SECOND_SRC_REG, TDA7419_SECOND_SRC_SEL, enum_src_sel); +static const struct snd_kcontrol_new soc_mux_second_src_sel = + SOC_DAPM_ENUM("Second Source Select", soc_enum_second_src_sel); +static const char * const enum_rear_spkr_src[] = { + "Main", "Second"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_rear_spkr_src, + TDA7419_SECOND_SRC_REG, TDA7419_REAR_SPKR_SRC, enum_rear_spkr_src); +static const struct snd_kcontrol_new soc_mux_rear_spkr_src = + SOC_DAPM_ENUM("Rear Speaker Source", soc_enum_rear_spkr_src); +static const char * const enum_sub_cut_off_freq[] = { + "Flat", "80 Hz", "120 Hz", "160 Hz"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_sub_cut_off_freq, + TDA7419_SUB_MID_BASS_REG, TDA7419_SUB_CUT_OFF_FREQ, + enum_sub_cut_off_freq); +static const char * const enum_middle_center_freq[] = { + "500 Hz", "1000 Hz", "1500 Hz", "2500 Hz"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_middle_center_freq, + TDA7419_SUB_MID_BASS_REG, TDA7419_MIDDLE_CENTER_FREQ, + enum_middle_center_freq); +static const char * const enum_bass_center_freq[] = { + "60 Hz", "80 Hz", "100 Hz", "200 Hz"}; +static SOC_ENUM_SINGLE_DECL(soc_enum_bass_center_freq, + TDA7419_SUB_MID_BASS_REG, TDA7419_BASS_CENTER_FREQ, + enum_bass_center_freq); +static const char * const enum_sa_q_factor[] = { + "3.5", "1.75" }; +static SOC_ENUM_SINGLE_DECL(soc_enum_sa_q_factor, + TDA7419_SA_CLK_AC_REG, TDA7419_SA_Q_FACTOR, enum_sa_q_factor); +static const char * const enum_reset_mode[] = { + "IIC", "Auto" }; +static SOC_ENUM_SINGLE_DECL(soc_enum_reset_mode, + TDA7419_SA_CLK_AC_REG, TDA7419_RESET_MODE, enum_reset_mode); +static const char * const enum_sa_src[] = { + "Bass", "In Gain" }; +static SOC_ENUM_SINGLE_DECL(soc_enum_sa_src, + TDA7419_SA_CLK_AC_REG, TDA7419_SA_SOURCE, enum_sa_src); +static const char * const enum_clk_src[] = { + "Internal", "External" }; +static SOC_ENUM_SINGLE_DECL(soc_enum_clk_src, + TDA7419_SA_CLK_AC_REG, TDA7419_CLK_SOURCE, enum_clk_src); +static const char * const enum_coupling_mode[] = { + "DC Coupling (without HPF)", "AC Coupling after In Gain", + "DC Coupling (with HPF)", "AC Coupling after Bass" }; +static SOC_ENUM_SINGLE_DECL(soc_enum_coupling_mode, + TDA7419_SA_CLK_AC_REG, TDA7419_COUPLING_MODE, enum_coupling_mode); + +/* ASoC Controls */ +static struct snd_kcontrol_new tda7419_controls[] = { +SOC_SINGLE_TLV("Main Source Capture Volume", TDA7419_MAIN_SRC_REG, + TDA7419_MAIN_SRC_GAIN, 15, 0, tlv_src_gain), +SOC_SINGLE("Main Source AutoZero Switch", TDA7419_MAIN_SRC_REG, + TDA7419_MAIN_SRC_AUTOZERO, 1, 1), +SOC_SINGLE_TLV("Loudness Playback Volume", TDA7419_LOUDNESS_REG, + TDA7419_LOUDNESS_ATTEN, 15, 1, tlv_loudness_atten), +SOC_ENUM("Loudness Center Frequency", soc_enum_loudness_center_freq), +SOC_SINGLE("Loudness High Boost Switch", TDA7419_LOUDNESS_REG, + TDA7419_LOUDNESS_BOOST, 1, 1), +SOC_SINGLE("Loudness Soft Step Switch", TDA7419_LOUDNESS_REG, + TDA7419_LOUDNESS_SOFT_STEP, 1, 1), +SOC_SINGLE("Soft Mute Switch", TDA7419_MUTE_CLK_REG, TDA7419_SOFT_MUTE, 1, 1), +SOC_ENUM("Mute Influence", soc_enum_mute_influence), +SOC_ENUM("Soft Mute Time", soc_enum_soft_mute_time), +SOC_ENUM("Soft Step Time", soc_enum_soft_step_time), +SOC_SINGLE("Clock Fast Mode Switch", TDA7419_MUTE_CLK_REG, + TDA7419_CLK_FAST_MODE, 1, 1), +TDA7419_SINGLE_TLV("Master Playback Volume", TDA7419_VOLUME_REG, + 0x7f, -80, 15, 0x10, 0, tlv_volume), +SOC_SINGLE("Volume Soft Step Switch", TDA7419_VOLUME_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +TDA7419_SINGLE_TLV("Treble Playback Volume", TDA7419_TREBLE_REG, + 0x1f, -15, 15, 0x10, 1, tlv_filter), +SOC_ENUM("Treble Center Frequency", soc_enum_treble_center_freq), +SOC_ENUM("Reference Output Select", soc_enum_ref_out_select), +TDA7419_SINGLE_TLV("Middle Playback Volume", TDA7419_MIDDLE_REG, + 0x1f, -15, 15, 0x10, 1, tlv_filter), +SOC_ENUM("Middle Q Factor", soc_enum_middle_q_factor), +SOC_SINGLE("Middle Soft Step Switch", TDA7419_MIDDLE_REG, + TDA7419_MIDDLE_SOFT_STEP, 1, 1), +TDA7419_SINGLE_TLV("Bass Playback Volume", TDA7419_BASS_REG, + 0x1f, -15, 15, 0x10, 1, tlv_filter), +SOC_ENUM("Bass Q Factor", soc_enum_bass_q_factor), +SOC_SINGLE("Bass Soft Step Switch", TDA7419_BASS_REG, + TDA7419_BASS_SOFT_STEP, 1, 1), +SOC_SINGLE_TLV("Second Source Capture Volume", TDA7419_SECOND_SRC_REG, + TDA7419_SECOND_SRC_GAIN, 15, 0, tlv_src_gain), +SOC_ENUM("Subwoofer Cut-off Frequency", soc_enum_sub_cut_off_freq), +SOC_ENUM("Middle Center Frequency", soc_enum_middle_center_freq), +SOC_ENUM("Bass Center Frequency", soc_enum_bass_center_freq), +SOC_SINGLE("Bass DC Mode Switch", TDA7419_SUB_MID_BASS_REG, + TDA7419_BASS_DC_MODE, 1, 1), +SOC_SINGLE("Smoothing Filter Switch", TDA7419_SUB_MID_BASS_REG, + TDA7419_SMOOTHING_FILTER, 1, 1), +TDA7419_DOUBLE_R_TLV("Front Speaker Playback Volume", TDA7419_ATTENUATOR_LF_REG, + TDA7419_ATTENUATOR_RF_REG, 0x7f, -80, 15, 0x10, 0, + tlv_volume), +SOC_SINGLE("Left Front Soft Step Switch", TDA7419_ATTENUATOR_LF_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +SOC_SINGLE("Right Front Soft Step Switch", TDA7419_ATTENUATOR_RF_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +TDA7419_DOUBLE_R_TLV("Rear Speaker Playback Volume", TDA7419_ATTENUATOR_LR_REG, + TDA7419_ATTENUATOR_RR_REG, 0x7f, -80, 15, 0x10, 0, + tlv_volume), +SOC_SINGLE("Left Rear Soft Step Switch", TDA7419_ATTENUATOR_LR_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +SOC_SINGLE("Right Rear Soft Step Switch", TDA7419_ATTENUATOR_RR_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +TDA7419_SINGLE_TLV("Mixing Capture Volume", TDA7419_MIXING_LEVEL_REG, + 0x7f, -80, 15, 0x10, 0, tlv_volume), +SOC_SINGLE("Mixing Level Soft Step Switch", TDA7419_MIXING_LEVEL_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +TDA7419_SINGLE_TLV("Subwoofer Playback Volume", TDA7419_ATTENUATOR_SUB_REG, + 0x7f, -80, 15, 0x10, 0, tlv_volume), +SOC_SINGLE("Subwoofer Soft Step Switch", TDA7419_ATTENUATOR_SUB_REG, + TDA7419_VOLUME_SOFT_STEP, 1, 1), +SOC_ENUM("Spectrum Analyzer Q Factor", soc_enum_sa_q_factor), +SOC_ENUM("Spectrum Analyzer Reset Mode", soc_enum_reset_mode), +SOC_ENUM("Spectrum Analyzer Source", soc_enum_sa_src), +SOC_SINGLE("Spectrum Analyzer Run Switch", TDA7419_SA_CLK_AC_REG, + TDA7419_SA_RUN, 1, 1), +SOC_SINGLE("Spectrum Analyzer Reset Switch", TDA7419_SA_CLK_AC_REG, + TDA7419_RESET, 1, 1), +SOC_ENUM("Clock Source", soc_enum_clk_src), +SOC_ENUM("Coupling Mode", soc_enum_coupling_mode), +}; + +static const struct snd_kcontrol_new soc_mixer_lf_output_controls[] = { + SOC_DAPM_SINGLE("Mix to LF Speaker Switch", + TDA7419_MIXING_GAIN_REG, + TDA7419_MIX_LF, 1, 1), +}; + +static const struct snd_kcontrol_new soc_mixer_rf_output_controls[] = { + SOC_DAPM_SINGLE("Mix to RF Speaker Switch", + TDA7419_MIXING_GAIN_REG, + TDA7419_MIX_RF, 1, 1), +}; + +static const struct snd_kcontrol_new soc_mix_enable_switch_controls[] = { + SOC_DAPM_SINGLE("Switch", TDA7419_MIXING_GAIN_REG, + TDA7419_MIX_ENABLE, 1, 1), +}; + +static const struct snd_kcontrol_new soc_sub_enable_switch_controls[] = { + SOC_DAPM_SINGLE("Switch", TDA7419_MIXING_GAIN_REG, + TDA7419_MIX_ENABLE, 1, 1), +}; + +static const struct snd_soc_dapm_widget tda7419_dapm_widgets[] = { + SND_SOC_DAPM_INPUT("SE3L"), + SND_SOC_DAPM_INPUT("SE3R"), + SND_SOC_DAPM_INPUT("SE2L"), + SND_SOC_DAPM_INPUT("SE2R"), + SND_SOC_DAPM_INPUT("SE1L"), + SND_SOC_DAPM_INPUT("SE1R"), + SND_SOC_DAPM_INPUT("DIFFL"), + SND_SOC_DAPM_INPUT("DIFFR"), + SND_SOC_DAPM_INPUT("MIX"), + + SND_SOC_DAPM_MUX("Main Source Select", SND_SOC_NOPM, + 0, 0, &soc_mux_main_src_sel), + SND_SOC_DAPM_MUX("Second Source Select", SND_SOC_NOPM, + 0, 0, &soc_mux_second_src_sel), + SND_SOC_DAPM_MUX("Rear Speaker Source", SND_SOC_NOPM, + 0, 0, &soc_mux_rear_spkr_src), + + SND_SOC_DAPM_SWITCH("Mix Enable", SND_SOC_NOPM, + 0, 0, &soc_mix_enable_switch_controls[0]), + SND_SOC_DAPM_MIXER_NAMED_CTL("LF Output Mixer", SND_SOC_NOPM, + 0, 0, &soc_mixer_lf_output_controls[0], + ARRAY_SIZE(soc_mixer_lf_output_controls)), + SND_SOC_DAPM_MIXER_NAMED_CTL("RF Output Mixer", SND_SOC_NOPM, + 0, 0, &soc_mixer_rf_output_controls[0], + ARRAY_SIZE(soc_mixer_rf_output_controls)), + + SND_SOC_DAPM_SWITCH("Subwoofer Enable", + SND_SOC_NOPM, 0, 0, + &soc_sub_enable_switch_controls[0]), + + SND_SOC_DAPM_OUTPUT("OUTLF"), + SND_SOC_DAPM_OUTPUT("OUTRF"), + SND_SOC_DAPM_OUTPUT("OUTLR"), + SND_SOC_DAPM_OUTPUT("OUTRR"), + SND_SOC_DAPM_OUTPUT("OUTSW"), +}; + +static const struct snd_soc_dapm_route tda7419_dapm_routes[] = { + {"Main Source Select", "SE3", "SE3L"}, + {"Main Source Select", "SE3", "SE3R"}, + {"Main Source Select", "SE2", "SE2L"}, + {"Main Source Select", "SE2", "SE2R"}, + {"Main Source Select", "SE1", "SE1L"}, + {"Main Source Select", "SE1", "SE1R"}, + {"Main Source Select", "SE", "DIFFL"}, + {"Main Source Select", "SE", "DIFFR"}, + {"Main Source Select", "QD", "DIFFL"}, + {"Main Source Select", "QD", "DIFFR"}, + + {"Second Source Select", "SE3", "SE3L"}, + {"Second Source Select", "SE3", "SE3R"}, + {"Second Source Select", "SE2", "SE2L"}, + {"Second Source Select", "SE2", "SE2R"}, + {"Second Source Select", "SE1", "SE1L"}, + {"Second Source Select", "SE1", "SE1R"}, + {"Second Source Select", "SE", "DIFFL"}, + {"Second Source Select", "SE", "DIFFR"}, + {"Second Source Select", "QD", "DIFFL"}, + {"Second Source Select", "QD", "DIFFR"}, + + {"Rear Speaker Source", "Main", "Main Source Select"}, + {"Rear Speaker Source", "Second", "Second Source Select"}, + + {"Subwoofer Enable", "Switch", "Main Source Select"}, + + {"Mix Enable", "Switch", "MIX"}, + + {"LF Output Mixer", NULL, "Main Source Select"}, + {"LF Output Mixer", "Mix to LF Speaker Switch", "Mix Enable"}, + {"RF Output Mixer", NULL, "Main Source Select"}, + {"RF Output Mixer", "Mix to RF Speaker Switch", "Mix Enable"}, + + {"OUTLF", NULL, "LF Output Mixer"}, + {"OUTRF", NULL, "RF Output Mixer"}, + {"OUTLR", NULL, "Rear Speaker Source"}, + {"OUTRR", NULL, "Rear Speaker Source"}, + {"OUTSW", NULL, "Subwoofer Enable"}, +}; + +static const struct snd_soc_component_driver tda7419_component_driver = { + .name = "tda7419", + .controls = tda7419_controls, + .num_controls = ARRAY_SIZE(tda7419_controls), + .dapm_widgets = tda7419_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tda7419_dapm_widgets), + .dapm_routes = tda7419_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(tda7419_dapm_routes), +}; + +static int tda7419_probe(struct i2c_client *i2c, + const struct i2c_device_id *id) +{ + struct tda7419_data *tda7419; + int i, ret; + + tda7419 = devm_kzalloc(&i2c->dev, + sizeof(struct tda7419_data), + GFP_KERNEL); + if (tda7419 == NULL) + return -ENOMEM; + + i2c_set_clientdata(i2c, tda7419); + + tda7419->regmap = devm_regmap_init_i2c(i2c, &tda7419_regmap_config); + if (IS_ERR(tda7419->regmap)) { + ret = PTR_ERR(tda7419->regmap); + dev_err(&i2c->dev, "error initializing regmap: %d\n", + ret); + return ret; + } + + /* + * Reset registers to power-on defaults. The part does not provide a + * soft-reset function and the registers are not readable. This ensures + * that the cache matches register contents even if the registers have + * been previously initialized and not power cycled before probe. + */ + for (i = 0; i < ARRAY_SIZE(tda7419_regmap_defaults); i++) + regmap_write(tda7419->regmap, + tda7419_regmap_defaults[i].reg, + tda7419_regmap_defaults[i].def); + + ret = devm_snd_soc_register_component(&i2c->dev, + &tda7419_component_driver, NULL, 0); + if (ret < 0) { + dev_err(&i2c->dev, "error registering component: %d\n", + ret); + } + + return ret; +} + +static const struct i2c_device_id tda7419_i2c_id[] = { + { "tda7419", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tda7419_i2c_id); + +static const struct of_device_id tda7419_of_match[] = { + { .compatible = "st,tda7419" }, + { }, +}; + +static struct i2c_driver tda7419_driver = { + .driver = { + .name = "tda7419", + .of_match_table = tda7419_of_match, + }, + .probe = tda7419_probe, + .id_table = tda7419_i2c_id, +}; + +module_i2c_driver(tda7419_driver); + +MODULE_AUTHOR("Matt Porter <mporter@konsulko.com>"); +MODULE_DESCRIPTION("TDA7419 audio processor driver"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/tfa9879.c b/sound/soc/codecs/tfa9879.c index e7ca764b5729..6d213c6d3920 100644 --- a/sound/soc/codecs/tfa9879.c +++ b/sound/soc/codecs/tfa9879.c @@ -30,8 +30,8 @@ static int tfa9879_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tfa9879_priv *tfa9879 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tfa9879_priv *tfa9879 = snd_soc_component_get_drvdata(component); int fs; int i2s_set = 0; @@ -88,11 +88,11 @@ static int tfa9879_hw_params(struct snd_pcm_substream *substream, } if (tfa9879->lsb_justified) - snd_soc_update_bits(codec, TFA9879_SERIAL_INTERFACE_1, + snd_soc_component_update_bits(component, TFA9879_SERIAL_INTERFACE_1, TFA9879_I2S_SET_MASK, i2s_set << TFA9879_I2S_SET_SHIFT); - snd_soc_update_bits(codec, TFA9879_SERIAL_INTERFACE_1, + snd_soc_component_update_bits(component, TFA9879_SERIAL_INTERFACE_1, TFA9879_I2S_FS_MASK, fs << TFA9879_I2S_FS_SHIFT); return 0; @@ -100,9 +100,9 @@ static int tfa9879_hw_params(struct snd_pcm_substream *substream, static int tfa9879_digital_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - snd_soc_update_bits(codec, TFA9879_MISC_CONTROL, + snd_soc_component_update_bits(component, TFA9879_MISC_CONTROL, TFA9879_S_MUTE_MASK, !!mute << TFA9879_S_MUTE_SHIFT); @@ -111,8 +111,8 @@ static int tfa9879_digital_mute(struct snd_soc_dai *dai, int mute) static int tfa9879_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct snd_soc_codec *codec = dai->codec; - struct tfa9879_priv *tfa9879 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tfa9879_priv *tfa9879 = snd_soc_component_get_drvdata(component); int i2s_set; int sck_pol; @@ -151,10 +151,10 @@ static int tfa9879_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, TFA9879_SERIAL_INTERFACE_1, + snd_soc_component_update_bits(component, TFA9879_SERIAL_INTERFACE_1, TFA9879_SCK_POL_MASK, sck_pol << TFA9879_SCK_POL_SHIFT); - snd_soc_update_bits(codec, TFA9879_SERIAL_INTERFACE_1, + snd_soc_component_update_bits(component, TFA9879_SERIAL_INTERFACE_1, TFA9879_I2S_SET_MASK, i2s_set << TFA9879_I2S_SET_SHIFT); return 0; @@ -230,15 +230,17 @@ static const struct snd_soc_dapm_route tfa9879_dapm_routes[] = { { "DAC", NULL, "POWER" }, }; -static const struct snd_soc_codec_driver tfa9879_codec = { - .component_driver = { - .controls = tfa9879_controls, - .num_controls = ARRAY_SIZE(tfa9879_controls), - .dapm_widgets = tfa9879_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tfa9879_dapm_widgets), - .dapm_routes = tfa9879_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(tfa9879_dapm_routes), - }, +static const struct snd_soc_component_driver tfa9879_component = { + .controls = tfa9879_controls, + .num_controls = ARRAY_SIZE(tfa9879_controls), + .dapm_widgets = tfa9879_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tfa9879_dapm_widgets), + .dapm_routes = tfa9879_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(tfa9879_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config tfa9879_regmap = { @@ -295,17 +297,10 @@ static int tfa9879_i2c_probe(struct i2c_client *i2c, regmap_write(tfa9879->regmap, tfa9879_regs[i].reg, tfa9879_regs[i].def); - return snd_soc_register_codec(&i2c->dev, &tfa9879_codec, + return devm_snd_soc_register_component(&i2c->dev, &tfa9879_component, &tfa9879_dai, 1); } -static int tfa9879_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - - return 0; -} - static const struct i2c_device_id tfa9879_i2c_id[] = { { "tfa9879", 0 }, { } @@ -324,7 +319,6 @@ static struct i2c_driver tfa9879_i2c_driver = { .of_match_table = tfa9879_of_match, }, .probe = tfa9879_i2c_probe, - .remove = tfa9879_i2c_remove, .id_table = tfa9879_i2c_id, }; diff --git a/sound/soc/codecs/tlv320aic23-i2c.c b/sound/soc/codecs/tlv320aic23-i2c.c index 78a94af65518..1d7c117316fb 100644 --- a/sound/soc/codecs/tlv320aic23-i2c.c +++ b/sound/soc/codecs/tlv320aic23-i2c.c @@ -31,12 +31,6 @@ static int tlv320aic23_i2c_probe(struct i2c_client *i2c, return tlv320aic23_probe(&i2c->dev, regmap); } -static int tlv320aic23_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - return 0; -} - static const struct i2c_device_id tlv320aic23_id[] = { {"tlv320aic23", 0}, {} @@ -56,7 +50,6 @@ static struct i2c_driver tlv320aic23_i2c_driver = { .of_match_table = of_match_ptr(tlv320aic23_of_match), }, .probe = tlv320aic23_i2c_probe, - .remove = tlv320aic23_i2c_remove, .id_table = tlv320aic23_id, }; diff --git a/sound/soc/codecs/tlv320aic23-spi.c b/sound/soc/codecs/tlv320aic23-spi.c index f801ae051658..d8c9ec1e9201 100644 --- a/sound/soc/codecs/tlv320aic23-spi.c +++ b/sound/soc/codecs/tlv320aic23-spi.c @@ -34,18 +34,11 @@ static int aic23_spi_probe(struct spi_device *spi) return tlv320aic23_probe(&spi->dev, regmap); } -static int aic23_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver aic23_spi = { .driver = { .name = "tlv320aic23", }, .probe = aic23_spi_probe, - .remove = aic23_spi_remove, }; module_spi_driver(aic23_spi); diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c index 74909211c608..47480cb4d078 100644 --- a/sound/soc/codecs/tlv320aic23.c +++ b/sound/soc/codecs/tlv320aic23.c @@ -82,7 +82,7 @@ static const DECLARE_TLV_DB_SCALE(sidetone_vol_tlv, -1800, 300, 0); static int snd_soc_tlv320aic23_put_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); u16 val, reg; val = (ucontrol->value.integer.value[0] & 0x07); @@ -96,8 +96,8 @@ static int snd_soc_tlv320aic23_put_volsw(struct snd_kcontrol *kcontrol, */ val = (val >= 4) ? 4 : (3 - val); - reg = snd_soc_read(codec, TLV320AIC23_ANLG) & (~0x1C0); - snd_soc_write(codec, TLV320AIC23_ANLG, reg | (val << 6)); + reg = snd_soc_component_read32(component, TLV320AIC23_ANLG) & (~0x1C0); + snd_soc_component_write(component, TLV320AIC23_ANLG, reg | (val << 6)); return 0; } @@ -105,10 +105,10 @@ static int snd_soc_tlv320aic23_put_volsw(struct snd_kcontrol *kcontrol, static int snd_soc_tlv320aic23_get_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); u16 val; - val = snd_soc_read(codec, TLV320AIC23_ANLG) & (0x1C0); + val = snd_soc_component_read32(component, TLV320AIC23_ANLG) & (0x1C0); val = val >> 6; val = (val >= 4) ? 4 : (3 - val); ucontrol->value.integer.value[0] = val; @@ -296,10 +296,10 @@ static int find_rate(int mclk, u32 need_adc, u32 need_dac) } #ifdef DEBUG -static void get_current_sample_rates(struct snd_soc_codec *codec, int mclk, +static void get_current_sample_rates(struct snd_soc_component *component, int mclk, u32 *sample_rate_adc, u32 *sample_rate_dac) { - int src = snd_soc_read(codec, TLV320AIC23_SRATE); + int src = snd_soc_component_read32(component, TLV320AIC23_SRATE); int sr = (src >> 2) & 0x0f; int val = (mclk / bosr_usb_divisor_table[src & 3]); int adc = (val * sr_adc_mult_table[sr]) / SR_MULT; @@ -313,7 +313,7 @@ static void get_current_sample_rates(struct snd_soc_codec *codec, int mclk, } #endif -static int set_sample_rate_control(struct snd_soc_codec *codec, int mclk, +static int set_sample_rate_control(struct snd_soc_component *component, int mclk, u32 sample_rate_adc, u32 sample_rate_dac) { /* Search for the right sample rate */ @@ -323,11 +323,11 @@ static int set_sample_rate_control(struct snd_soc_codec *codec, int mclk, __func__, sample_rate_adc, sample_rate_dac); return -EINVAL; } - snd_soc_write(codec, TLV320AIC23_SRATE, data); + snd_soc_component_write(component, TLV320AIC23_SRATE, data); #ifdef DEBUG { u32 adc, dac; - get_current_sample_rates(codec, mclk, &adc, &dac); + get_current_sample_rates(component, mclk, &adc, &dac); printk(KERN_DEBUG "actual samplerate = %u,%u reg=%x\n", adc, dac, data); } @@ -339,10 +339,10 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 iface_reg; int ret; - struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); + struct aic23 *aic23 = snd_soc_component_get_drvdata(component); u32 sample_rate_adc = aic23->requested_adc; u32 sample_rate_dac = aic23->requested_dac; u32 sample_rate = params_rate(params); @@ -356,12 +356,12 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, if (!sample_rate_dac) sample_rate_dac = sample_rate; } - ret = set_sample_rate_control(codec, aic23->mclk, sample_rate_adc, + ret = set_sample_rate_control(component, aic23->mclk, sample_rate_adc, sample_rate_dac); if (ret < 0) return ret; - iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & ~(0x03 << 2); + iface_reg = snd_soc_component_read32(component, TLV320AIC23_DIGT_FMT) & ~(0x03 << 2); switch (params_width(params)) { case 16: @@ -376,7 +376,7 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, iface_reg |= (0x03 << 2); break; } - snd_soc_write(codec, TLV320AIC23_DIGT_FMT, iface_reg); + snd_soc_component_write(component, TLV320AIC23_DIGT_FMT, iface_reg); return 0; } @@ -384,10 +384,10 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream, static int tlv320aic23_pcm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; /* set active */ - snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0001); + snd_soc_component_write(component, TLV320AIC23_ACTIVE, 0x0001); return 0; } @@ -395,13 +395,13 @@ static int tlv320aic23_pcm_prepare(struct snd_pcm_substream *substream, static void tlv320aic23_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic23 *aic23 = snd_soc_component_get_drvdata(component); /* deactivate */ - if (!snd_soc_codec_is_active(codec)) { + if (!snd_soc_component_is_active(component)) { udelay(50); - snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); + snd_soc_component_write(component, TLV320AIC23_ACTIVE, 0x0); } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) aic23->requested_dac = 0; @@ -411,17 +411,17 @@ static void tlv320aic23_shutdown(struct snd_pcm_substream *substream, static int tlv320aic23_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u16 reg; - reg = snd_soc_read(codec, TLV320AIC23_DIGT); + reg = snd_soc_component_read32(component, TLV320AIC23_DIGT); if (mute) reg |= TLV320AIC23_DACM_MUTE; else reg &= ~TLV320AIC23_DACM_MUTE; - snd_soc_write(codec, TLV320AIC23_DIGT, reg); + snd_soc_component_write(component, TLV320AIC23_DIGT, reg); return 0; } @@ -429,10 +429,10 @@ static int tlv320aic23_mute(struct snd_soc_dai *dai, int mute) static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u16 iface_reg; - iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & (~0x03); + iface_reg = snd_soc_component_read32(component, TLV320AIC23_DIGT_FMT) & (~0x03); /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -468,7 +468,7 @@ static int tlv320aic23_set_dai_fmt(struct snd_soc_dai *codec_dai, } - snd_soc_write(codec, TLV320AIC23_DIGT_FMT, iface_reg); + snd_soc_component_write(component, TLV320AIC23_DIGT_FMT, iface_reg); return 0; } @@ -481,29 +481,29 @@ static int tlv320aic23_set_dai_sysclk(struct snd_soc_dai *codec_dai, return 0; } -static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, +static int tlv320aic23_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - u16 reg = snd_soc_read(codec, TLV320AIC23_PWR) & 0x17f; + u16 reg = snd_soc_component_read32(component, TLV320AIC23_PWR) & 0x17f; switch (level) { case SND_SOC_BIAS_ON: /* vref/mid, osc on, dac unmute */ reg &= ~(TLV320AIC23_DEVICE_PWR_OFF | TLV320AIC23_OSC_OFF | \ TLV320AIC23_DAC_OFF); - snd_soc_write(codec, TLV320AIC23_PWR, reg); + snd_soc_component_write(component, TLV320AIC23_PWR, reg); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* everything off except vref/vmid, */ - snd_soc_write(codec, TLV320AIC23_PWR, + snd_soc_component_write(component, TLV320AIC23_PWR, reg | TLV320AIC23_CLK_OFF); break; case SND_SOC_BIAS_OFF: /* everything off, dac mute, inactive */ - snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x0); - snd_soc_write(codec, TLV320AIC23_PWR, 0x1ff); + snd_soc_component_write(component, TLV320AIC23_ACTIVE, 0x0); + snd_soc_component_write(component, TLV320AIC23_PWR, 0x1ff); break; } return 0; @@ -539,58 +539,59 @@ static struct snd_soc_dai_driver tlv320aic23_dai = { .ops = &tlv320aic23_dai_ops, }; -static int tlv320aic23_resume(struct snd_soc_codec *codec) +static int tlv320aic23_resume(struct snd_soc_component *component) { - struct aic23 *aic23 = snd_soc_codec_get_drvdata(codec); + struct aic23 *aic23 = snd_soc_component_get_drvdata(component); regcache_mark_dirty(aic23->regmap); regcache_sync(aic23->regmap); return 0; } -static int tlv320aic23_codec_probe(struct snd_soc_codec *codec) +static int tlv320aic23_component_probe(struct snd_soc_component *component) { /* Reset codec */ - snd_soc_write(codec, TLV320AIC23_RESET, 0); + snd_soc_component_write(component, TLV320AIC23_RESET, 0); - snd_soc_write(codec, TLV320AIC23_DIGT, TLV320AIC23_DEEMP_44K); + snd_soc_component_write(component, TLV320AIC23_DIGT, TLV320AIC23_DEEMP_44K); /* Unmute input */ - snd_soc_update_bits(codec, TLV320AIC23_LINVOL, + snd_soc_component_update_bits(component, TLV320AIC23_LINVOL, TLV320AIC23_LIM_MUTED, TLV320AIC23_LRS_ENABLED); - snd_soc_update_bits(codec, TLV320AIC23_RINVOL, + snd_soc_component_update_bits(component, TLV320AIC23_RINVOL, TLV320AIC23_LIM_MUTED, TLV320AIC23_LRS_ENABLED); - snd_soc_update_bits(codec, TLV320AIC23_ANLG, + snd_soc_component_update_bits(component, TLV320AIC23_ANLG, TLV320AIC23_BYPASS_ON | TLV320AIC23_MICM_MUTED, 0); /* Default output volume */ - snd_soc_write(codec, TLV320AIC23_LCHNVOL, + snd_soc_component_write(component, TLV320AIC23_LCHNVOL, TLV320AIC23_DEFAULT_OUT_VOL & TLV320AIC23_OUT_VOL_MASK); - snd_soc_write(codec, TLV320AIC23_RCHNVOL, + snd_soc_component_write(component, TLV320AIC23_RCHNVOL, TLV320AIC23_DEFAULT_OUT_VOL & TLV320AIC23_OUT_VOL_MASK); - snd_soc_write(codec, TLV320AIC23_ACTIVE, 0x1); + snd_soc_component_write(component, TLV320AIC23_ACTIVE, 0x1); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = { - .probe = tlv320aic23_codec_probe, - .resume = tlv320aic23_resume, - .set_bias_level = tlv320aic23_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = tlv320aic23_snd_controls, - .num_controls = ARRAY_SIZE(tlv320aic23_snd_controls), - .dapm_widgets = tlv320aic23_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tlv320aic23_dapm_widgets), - .dapm_routes = tlv320aic23_intercon, - .num_dapm_routes = ARRAY_SIZE(tlv320aic23_intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_tlv320aic23 = { + .probe = tlv320aic23_component_probe, + .resume = tlv320aic23_resume, + .set_bias_level = tlv320aic23_set_bias_level, + .controls = tlv320aic23_snd_controls, + .num_controls = ARRAY_SIZE(tlv320aic23_snd_controls), + .dapm_widgets = tlv320aic23_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tlv320aic23_dapm_widgets), + .dapm_routes = tlv320aic23_intercon, + .num_dapm_routes = ARRAY_SIZE(tlv320aic23_intercon), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; int tlv320aic23_probe(struct device *dev, struct regmap *regmap) @@ -608,7 +609,8 @@ int tlv320aic23_probe(struct device *dev, struct regmap *regmap) dev_set_drvdata(dev, aic23); - return snd_soc_register_codec(dev, &soc_codec_dev_tlv320aic23, + return devm_snd_soc_register_component(dev, + &soc_component_dev_tlv320aic23, &tlv320aic23_dai, 1); } EXPORT_SYMBOL(tlv320aic23_probe); diff --git a/sound/soc/codecs/tlv320aic26.c b/sound/soc/codecs/tlv320aic26.c index 89421caaeb70..b91b8d5f1ba3 100644 --- a/sound/soc/codecs/tlv320aic26.c +++ b/sound/soc/codecs/tlv320aic26.c @@ -30,7 +30,7 @@ MODULE_LICENSE("GPL"); struct aic26 { struct spi_device *spi; struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; int master; int datfm; int mclk; @@ -64,8 +64,8 @@ static int aic26_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic26 *aic26 = snd_soc_component_get_drvdata(component); int fsref, divisor, wlen, pval, jval, dval, qval; u16 reg; @@ -112,20 +112,20 @@ static int aic26_hw_params(struct snd_pcm_substream *substream, dev_dbg(&aic26->spi->dev, "Setting PLLM to %d.%04d\n", jval, dval); qval = 0; reg = 0x8000 | qval << 11 | pval << 8 | jval << 2; - snd_soc_write(codec, AIC26_REG_PLL_PROG1, reg); + snd_soc_component_write(component, AIC26_REG_PLL_PROG1, reg); reg = dval << 2; - snd_soc_write(codec, AIC26_REG_PLL_PROG2, reg); + snd_soc_component_write(component, AIC26_REG_PLL_PROG2, reg); /* Audio Control 3 (master mode, fsref rate) */ if (aic26->master) reg = 0x0800; if (fsref == 48000) reg = 0x2000; - snd_soc_update_bits(codec, AIC26_REG_AUDIO_CTRL3, 0xf800, reg); + snd_soc_component_update_bits(component, AIC26_REG_AUDIO_CTRL3, 0xf800, reg); /* Audio Control 1 (FSref divisor) */ reg = wlen | aic26->datfm | (divisor << 3) | divisor; - snd_soc_update_bits(codec, AIC26_REG_AUDIO_CTRL1, 0xfff, reg); + snd_soc_component_update_bits(component, AIC26_REG_AUDIO_CTRL1, 0xfff, reg); return 0; } @@ -135,8 +135,8 @@ static int aic26_hw_params(struct snd_pcm_substream *substream, */ static int aic26_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic26 *aic26 = snd_soc_component_get_drvdata(component); u16 reg; dev_dbg(&aic26->spi->dev, "aic26_mute(dai=%p, mute=%i)\n", @@ -146,7 +146,7 @@ static int aic26_mute(struct snd_soc_dai *dai, int mute) reg = 0x8080; else reg = 0; - snd_soc_update_bits(codec, AIC26_REG_DAC_GAIN, 0x8000, reg); + snd_soc_component_update_bits(component, AIC26_REG_DAC_GAIN, 0x8000, reg); return 0; } @@ -154,8 +154,8 @@ static int aic26_mute(struct snd_soc_dai *dai, int mute) static int aic26_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic26 *aic26 = snd_soc_component_get_drvdata(component); dev_dbg(&aic26->spi->dev, "aic26_set_sysclk(dai=%p, clk_id==%i," " freq=%i, dir=%i)\n", @@ -171,8 +171,8 @@ static int aic26_set_sysclk(struct snd_soc_dai *codec_dai, static int aic26_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic26 *aic26 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic26 *aic26 = snd_soc_component_get_drvdata(component); dev_dbg(&aic26->spi->dev, "aic26_set_fmt(dai=%p, fmt==%i)\n", codec_dai, fmt); @@ -265,7 +265,7 @@ static ssize_t aic26_keyclick_show(struct device *dev, struct aic26 *aic26 = dev_get_drvdata(dev); int val, amp, freq, len; - val = snd_soc_read(aic26->codec, AIC26_REG_AUDIO_CTRL2); + val = snd_soc_component_read32(aic26->component, AIC26_REG_AUDIO_CTRL2); amp = (val >> 12) & 0x7; freq = (125 << ((val >> 8) & 0x7)) >> 1; len = 2 * (1 + ((val >> 4) & 0xf)); @@ -280,7 +280,7 @@ static ssize_t aic26_keyclick_set(struct device *dev, { struct aic26 *aic26 = dev_get_drvdata(dev); - snd_soc_update_bits(aic26->codec, AIC26_REG_AUDIO_CTRL2, + snd_soc_component_update_bits(aic26->component, AIC26_REG_AUDIO_CTRL2, 0x8000, 0x800); return count; @@ -291,44 +291,46 @@ static DEVICE_ATTR(keyclick, 0644, aic26_keyclick_show, aic26_keyclick_set); /* --------------------------------------------------------------------- * SoC CODEC portion of driver: probe and release routines */ -static int aic26_probe(struct snd_soc_codec *codec) +static int aic26_probe(struct snd_soc_component *component) { - struct aic26 *aic26 = dev_get_drvdata(codec->dev); + struct aic26 *aic26 = dev_get_drvdata(component->dev); int ret, reg; - aic26->codec = codec; + aic26->component = component; /* Reset the codec to power on defaults */ - snd_soc_write(codec, AIC26_REG_RESET, 0xBB00); + snd_soc_component_write(component, AIC26_REG_RESET, 0xBB00); /* Power up CODEC */ - snd_soc_write(codec, AIC26_REG_POWER_CTRL, 0); + snd_soc_component_write(component, AIC26_REG_POWER_CTRL, 0); /* Audio Control 3 (master mode, fsref rate) */ - reg = snd_soc_read(codec, AIC26_REG_AUDIO_CTRL3); + reg = snd_soc_component_read32(component, AIC26_REG_AUDIO_CTRL3); reg &= ~0xf800; reg |= 0x0800; /* set master mode */ - snd_soc_write(codec, AIC26_REG_AUDIO_CTRL3, reg); + snd_soc_component_write(component, AIC26_REG_AUDIO_CTRL3, reg); /* Register the sysfs files for debugging */ /* Create SysFS files */ - ret = device_create_file(codec->dev, &dev_attr_keyclick); + ret = device_create_file(component->dev, &dev_attr_keyclick); if (ret) - dev_info(codec->dev, "error creating sysfs files\n"); + dev_info(component->dev, "error creating sysfs files\n"); return 0; } -static const struct snd_soc_codec_driver aic26_soc_codec_dev = { - .probe = aic26_probe, - .component_driver = { - .controls = aic26_snd_controls, - .num_controls = ARRAY_SIZE(aic26_snd_controls), - .dapm_widgets = tlv320aic26_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tlv320aic26_dapm_widgets), - .dapm_routes = tlv320aic26_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(tlv320aic26_dapm_routes), - }, +static const struct snd_soc_component_driver aic26_soc_component_dev = { + .probe = aic26_probe, + .controls = aic26_snd_controls, + .num_controls = ARRAY_SIZE(aic26_snd_controls), + .dapm_widgets = tlv320aic26_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tlv320aic26_dapm_widgets), + .dapm_routes = tlv320aic26_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(tlv320aic26_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config aic26_regmap = { @@ -361,23 +363,16 @@ static int aic26_spi_probe(struct spi_device *spi) dev_set_drvdata(&spi->dev, aic26); aic26->master = 1; - ret = snd_soc_register_codec(&spi->dev, - &aic26_soc_codec_dev, &aic26_dai, 1); + ret = devm_snd_soc_register_component(&spi->dev, + &aic26_soc_component_dev, &aic26_dai, 1); return ret; } -static int aic26_spi_remove(struct spi_device *spi) -{ - snd_soc_unregister_codec(&spi->dev); - return 0; -} - static struct spi_driver aic26_spi = { .driver = { .name = "tlv320aic26-codec", }, .probe = aic26_spi_probe, - .remove = aic26_spi_remove, }; module_spi_driver(aic26_spi); diff --git a/sound/soc/codecs/tlv320aic31xx.c b/sound/soc/codecs/tlv320aic31xx.c index 858cb8be445f..bf92d36b8f8a 100644 --- a/sound/soc/codecs/tlv320aic31xx.c +++ b/sound/soc/codecs/tlv320aic31xx.c @@ -153,7 +153,7 @@ struct aic31xx_disable_nb { }; struct aic31xx_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; u8 i2c_regs_status; struct device *dev; struct regmap *regmap; @@ -166,6 +166,7 @@ struct aic31xx_priv { unsigned int sysclk; u8 p_div; int rate_div_line; + bool master_dapm_route_applied; }; struct aic31xx_rate_divs { @@ -348,8 +349,8 @@ static int aic31xx_wait_bits(struct aic31xx_priv *aic31xx, unsigned int reg, static int aic31xx_dapm_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); unsigned int reg = AIC31XX_DACFLAG1; unsigned int mask; @@ -377,7 +378,7 @@ static int aic31xx_dapm_power_event(struct snd_soc_dapm_widget *w, reg = AIC31XX_ADCFLAG; break; default: - dev_err(codec->dev, "Unknown widget '%s' calling %s\n", + dev_err(component->dev, "Unknown widget '%s' calling %s\n", w->name, __func__); return -EINVAL; } @@ -388,7 +389,7 @@ static int aic31xx_dapm_power_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_POST_PMD: return aic31xx_wait_bits(aic31xx, reg, mask, 0, 5000, 100); default: - dev_dbg(codec->dev, + dev_dbg(component->dev, "Unhandled dapm widget event %d from %s\n", event, w->name); } @@ -444,30 +445,30 @@ static const struct snd_kcontrol_new aic31xx_dapm_spr_switch = static int mic_bias_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: /* change mic bias voltage to user defined */ - snd_soc_update_bits(codec, AIC31XX_MICBIAS, + snd_soc_component_update_bits(component, AIC31XX_MICBIAS, AIC31XX_MICBIAS_MASK, aic31xx->micbias_vg << AIC31XX_MICBIAS_SHIFT); - dev_dbg(codec->dev, "%s: turned on\n", __func__); + dev_dbg(component->dev, "%s: turned on\n", __func__); break; case SND_SOC_DAPM_PRE_PMD: /* turn mic bias off */ - snd_soc_update_bits(codec, AIC31XX_MICBIAS, + snd_soc_component_update_bits(component, AIC31XX_MICBIAS, AIC31XX_MICBIAS_MASK, 0); - dev_dbg(codec->dev, "%s: turned off\n", __func__); + dev_dbg(component->dev, "%s: turned off\n", __func__); break; } return 0; } static const struct snd_soc_dapm_widget common31xx_dapm_widgets[] = { - SND_SOC_DAPM_AIF_IN("DAC IN", "DAC Playback", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("AIF IN", "Playback", 0, SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_MUX("DAC Left Input", SND_SOC_NOPM, 0, 0, &ldac_in_control), @@ -500,6 +501,10 @@ static const struct snd_soc_dapm_widget common31xx_dapm_widgets[] = { SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, mic_bias_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + /* Keep BCLK/WCLK enabled even if DAC/ADC is powered down */ + SND_SOC_DAPM_SUPPLY("Activate I2S clocks", AIC31XX_IFACE2, 2, 0, + NULL, 0), + /* Outputs */ SND_SOC_DAPM_OUTPUT("HPL"), SND_SOC_DAPM_OUTPUT("HPR"), @@ -552,6 +557,8 @@ static const struct snd_soc_dapm_widget aic31xx_dapm_widgets[] = { SND_SOC_DAPM_MIXER("Output Right", SND_SOC_NOPM, 0, 0, aic31xx_right_output_switches, ARRAY_SIZE(aic31xx_right_output_switches)), + + SND_SOC_DAPM_AIF_OUT("AIF OUT", "Capture", 0, SND_SOC_NOPM, 0, 0), }; static const struct snd_soc_dapm_widget aic311x_dapm_widgets[] = { @@ -583,12 +590,12 @@ static const struct snd_soc_dapm_widget aic310x_dapm_widgets[] = { static const struct snd_soc_dapm_route common31xx_audio_map[] = { /* DAC Input Routing */ - {"DAC Left Input", "Left Data", "DAC IN"}, - {"DAC Left Input", "Right Data", "DAC IN"}, - {"DAC Left Input", "Mono", "DAC IN"}, - {"DAC Right Input", "Left Data", "DAC IN"}, - {"DAC Right Input", "Right Data", "DAC IN"}, - {"DAC Right Input", "Mono", "DAC IN"}, + {"DAC Left Input", "Left Data", "AIF IN"}, + {"DAC Left Input", "Right Data", "AIF IN"}, + {"DAC Left Input", "Mono", "AIF IN"}, + {"DAC Right Input", "Left Data", "AIF IN"}, + {"DAC Right Input", "Right Data", "AIF IN"}, + {"DAC Right Input", "Mono", "AIF IN"}, {"DAC Left", NULL, "DAC Left Input"}, {"DAC Right", NULL, "DAC Right Input"}, @@ -639,6 +646,8 @@ aic31xx_audio_map[] = { {"ADC", NULL, "MIC_GAIN_CTL"}, + {"AIF OUT", NULL, "ADC"}, + /* Left Output */ {"Output Left", "From Left DAC", "DAC Left"}, {"Output Left", "From MIC1LP", "MIC1LP"}, @@ -670,34 +679,61 @@ aic310x_audio_map[] = { {"SPK", NULL, "SPK ClassD"}, }; -static int aic31xx_add_controls(struct snd_soc_codec *codec) +/* + * Always connected DAPM routes for codec clock master modes. + * If the codec is the master on the I2S bus, we need to power up components + * to have valid DAC_CLK. + * + * In order to have the I2S clocks on the bus either the DACs/ADC need to be + * enabled, or the P0/R29/D2 (Keep bclk/wclk in power down) need to be set. + * + * Otherwise the codec will not generate clocks on the bus. + */ +static const struct snd_soc_dapm_route +common31xx_cm_audio_map[] = { + {"HPL", NULL, "AIF IN"}, + {"HPR", NULL, "AIF IN"}, + + {"AIF IN", NULL, "Activate I2S clocks"}, +}; + +static const struct snd_soc_dapm_route +aic31xx_cm_audio_map[] = { + {"AIF OUT", NULL, "MIC1LP"}, + {"AIF OUT", NULL, "MIC1RP"}, + {"AIF OUT", NULL, "MIC1LM"}, + + {"AIF OUT", NULL, "Activate I2S clocks"}, +}; + +static int aic31xx_add_controls(struct snd_soc_component *component) { int ret = 0; - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); if (!(aic31xx->codec_type & DAC31XX_BIT)) - ret = snd_soc_add_codec_controls( - codec, aic31xx_snd_controls, + ret = snd_soc_add_component_controls( + component, aic31xx_snd_controls, ARRAY_SIZE(aic31xx_snd_controls)); if (ret) return ret; if (aic31xx->codec_type & AIC31XX_STEREO_CLASS_D_BIT) - ret = snd_soc_add_codec_controls( - codec, aic311x_snd_controls, + ret = snd_soc_add_component_controls( + component, aic311x_snd_controls, ARRAY_SIZE(aic311x_snd_controls)); else - ret = snd_soc_add_codec_controls( - codec, aic310x_snd_controls, + ret = snd_soc_add_component_controls( + component, aic310x_snd_controls, ARRAY_SIZE(aic310x_snd_controls)); return ret; } -static int aic31xx_add_widgets(struct snd_soc_codec *codec) +static int aic31xx_add_widgets(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int ret = 0; if (aic31xx->codec_type & DAC31XX_BIT) { @@ -751,10 +787,10 @@ static int aic31xx_add_widgets(struct snd_soc_codec *codec) return 0; } -static int aic31xx_setup_pll(struct snd_soc_codec *codec, +static int aic31xx_setup_pll(struct snd_soc_component *component, struct snd_pcm_hw_params *params) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int bclk_score = snd_soc_params_to_frame_size(params); int mclk_p; int bclk_n = 0; @@ -762,15 +798,15 @@ static int aic31xx_setup_pll(struct snd_soc_codec *codec, int i; if (!aic31xx->sysclk || !aic31xx->p_div) { - dev_err(codec->dev, "Master clock not supplied\n"); + dev_err(component->dev, "Master clock not supplied\n"); return -EINVAL; } mclk_p = aic31xx->sysclk / aic31xx->p_div; /* Use PLL as CODEC_CLKIN and DAC_CLK as BDIV_CLKIN */ - snd_soc_update_bits(codec, AIC31XX_CLKMUX, + snd_soc_component_update_bits(component, AIC31XX_CLKMUX, AIC31XX_CODEC_CLKIN_MASK, AIC31XX_CODEC_CLKIN_PLL); - snd_soc_update_bits(codec, AIC31XX_IFACE2, + snd_soc_component_update_bits(component, AIC31XX_IFACE2, AIC31XX_BDIVCLK_MASK, AIC31XX_DAC2BCLK); for (i = 0; i < ARRAY_SIZE(aic31xx_divs); i++) { @@ -789,14 +825,14 @@ static int aic31xx_setup_pll(struct snd_soc_codec *codec, } if (match == -1) { - dev_err(codec->dev, + dev_err(component->dev, "%s: Sample rate (%u) and format not supported\n", __func__, params_rate(params)); /* See bellow for details how fix this. */ return -EINVAL; } if (bclk_score != 0) { - dev_warn(codec->dev, "Can not produce exact bitclock"); + dev_warn(component->dev, "Can not produce exact bitclock"); /* This is fine if using dsp format, but if using i2s there may be trouble. To fix the issue edit the aic31xx_divs table for your mclk and sample @@ -808,39 +844,39 @@ static int aic31xx_setup_pll(struct snd_soc_codec *codec, i = match; /* PLL configuration */ - snd_soc_update_bits(codec, AIC31XX_PLLPR, AIC31XX_PLL_MASK, + snd_soc_component_update_bits(component, AIC31XX_PLLPR, AIC31XX_PLL_MASK, (aic31xx->p_div << 4) | 0x01); - snd_soc_write(codec, AIC31XX_PLLJ, aic31xx_divs[i].pll_j); + snd_soc_component_write(component, AIC31XX_PLLJ, aic31xx_divs[i].pll_j); - snd_soc_write(codec, AIC31XX_PLLDMSB, + snd_soc_component_write(component, AIC31XX_PLLDMSB, aic31xx_divs[i].pll_d >> 8); - snd_soc_write(codec, AIC31XX_PLLDLSB, + snd_soc_component_write(component, AIC31XX_PLLDLSB, aic31xx_divs[i].pll_d & 0xff); /* DAC dividers configuration */ - snd_soc_update_bits(codec, AIC31XX_NDAC, AIC31XX_PLL_MASK, + snd_soc_component_update_bits(component, AIC31XX_NDAC, AIC31XX_PLL_MASK, aic31xx_divs[i].ndac); - snd_soc_update_bits(codec, AIC31XX_MDAC, AIC31XX_PLL_MASK, + snd_soc_component_update_bits(component, AIC31XX_MDAC, AIC31XX_PLL_MASK, aic31xx_divs[i].mdac); - snd_soc_write(codec, AIC31XX_DOSRMSB, aic31xx_divs[i].dosr >> 8); - snd_soc_write(codec, AIC31XX_DOSRLSB, aic31xx_divs[i].dosr & 0xff); + snd_soc_component_write(component, AIC31XX_DOSRMSB, aic31xx_divs[i].dosr >> 8); + snd_soc_component_write(component, AIC31XX_DOSRLSB, aic31xx_divs[i].dosr & 0xff); /* ADC dividers configuration. Write reset value 1 if not used. */ - snd_soc_update_bits(codec, AIC31XX_NADC, AIC31XX_PLL_MASK, + snd_soc_component_update_bits(component, AIC31XX_NADC, AIC31XX_PLL_MASK, aic31xx_divs[i].nadc ? aic31xx_divs[i].nadc : 1); - snd_soc_update_bits(codec, AIC31XX_MADC, AIC31XX_PLL_MASK, + snd_soc_component_update_bits(component, AIC31XX_MADC, AIC31XX_PLL_MASK, aic31xx_divs[i].madc ? aic31xx_divs[i].madc : 1); - snd_soc_write(codec, AIC31XX_AOSR, aic31xx_divs[i].aosr); + snd_soc_component_write(component, AIC31XX_AOSR, aic31xx_divs[i].aosr); /* Bit clock divider configuration. */ - snd_soc_update_bits(codec, AIC31XX_BCLKN, + snd_soc_component_update_bits(component, AIC31XX_BCLKN, AIC31XX_PLL_MASK, bclk_n); aic31xx->rate_div_line = i; - dev_dbg(codec->dev, + dev_dbg(component->dev, "pll %d.%04d/%d dosr %d n %d m %d aosr %d n %d m %d bclk_n %d\n", aic31xx_divs[i].pll_j, aic31xx_divs[i].pll_d, @@ -861,10 +897,10 @@ static int aic31xx_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; u8 data = 0; - dev_dbg(codec->dev, "## %s: width %d rate %d\n", + dev_dbg(component->dev, "## %s: width %d rate %d\n", __func__, params_width(params), params_rate(params)); @@ -884,43 +920,90 @@ static int aic31xx_hw_params(struct snd_pcm_substream *substream, AIC31XX_IFACE1_DATALEN_SHIFT); break; default: - dev_err(codec->dev, "%s: Unsupported width %d\n", + dev_err(component->dev, "%s: Unsupported width %d\n", __func__, params_width(params)); return -EINVAL; } - snd_soc_update_bits(codec, AIC31XX_IFACE1, + snd_soc_component_update_bits(component, AIC31XX_IFACE1, AIC31XX_IFACE1_DATALEN_MASK, data); - return aic31xx_setup_pll(codec, params); + return aic31xx_setup_pll(component, params); } static int aic31xx_dac_mute(struct snd_soc_dai *codec_dai, int mute) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; if (mute) { - snd_soc_update_bits(codec, AIC31XX_DACMUTE, + snd_soc_component_update_bits(component, AIC31XX_DACMUTE, AIC31XX_DACMUTE_MASK, AIC31XX_DACMUTE_MASK); } else { - snd_soc_update_bits(codec, AIC31XX_DACMUTE, + snd_soc_component_update_bits(component, AIC31XX_DACMUTE, AIC31XX_DACMUTE_MASK, 0x0); } return 0; } +static int aic31xx_clock_master_routes(struct snd_soc_component *component, + unsigned int fmt) +{ + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); + int ret; + + fmt &= SND_SOC_DAIFMT_MASTER_MASK; + if (fmt == SND_SOC_DAIFMT_CBS_CFS && + aic31xx->master_dapm_route_applied) { + /* + * Remove the DAPM route(s) for codec clock master modes, + * if applied + */ + ret = snd_soc_dapm_del_routes(dapm, common31xx_cm_audio_map, + ARRAY_SIZE(common31xx_cm_audio_map)); + if (!ret && !(aic31xx->codec_type & DAC31XX_BIT)) + ret = snd_soc_dapm_del_routes(dapm, + aic31xx_cm_audio_map, + ARRAY_SIZE(aic31xx_cm_audio_map)); + + if (ret) + return ret; + + aic31xx->master_dapm_route_applied = false; + } else if (fmt != SND_SOC_DAIFMT_CBS_CFS && + !aic31xx->master_dapm_route_applied) { + /* + * Add the needed DAPM route(s) for codec clock master modes, + * if it is not done already + */ + ret = snd_soc_dapm_add_routes(dapm, common31xx_cm_audio_map, + ARRAY_SIZE(common31xx_cm_audio_map)); + if (!ret && !(aic31xx->codec_type & DAC31XX_BIT)) + ret = snd_soc_dapm_add_routes(dapm, + aic31xx_cm_audio_map, + ARRAY_SIZE(aic31xx_cm_audio_map)); + + if (ret) + return ret; + + aic31xx->master_dapm_route_applied = true; + } + + return 0; +} + static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 iface_reg1 = 0; u8 iface_reg2 = 0; u8 dsp_a_val = 0; - dev_dbg(codec->dev, "## %s: fmt = 0x%x\n", __func__, fmt); + dev_dbg(component->dev, "## %s: fmt = 0x%x\n", __func__, fmt); /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -936,7 +1019,7 @@ static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFS: break; default: - dev_err(codec->dev, "Invalid DAI master/slave interface\n"); + dev_err(component->dev, "Invalid DAI master/slave interface\n"); return -EINVAL; } @@ -948,7 +1031,7 @@ static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai, iface_reg2 |= AIC31XX_BCLKINV_MASK; break; default: - dev_err(codec->dev, "Invalid DAI clock signal polarity\n"); + dev_err(component->dev, "Invalid DAI clock signal polarity\n"); return -EINVAL; } @@ -977,32 +1060,32 @@ static int aic31xx_set_dai_fmt(struct snd_soc_dai *codec_dai, AIC31XX_IFACE1_DATATYPE_SHIFT); break; default: - dev_err(codec->dev, "Invalid DAI interface format\n"); + dev_err(component->dev, "Invalid DAI interface format\n"); return -EINVAL; } - snd_soc_update_bits(codec, AIC31XX_IFACE1, + snd_soc_component_update_bits(component, AIC31XX_IFACE1, AIC31XX_IFACE1_DATATYPE_MASK | AIC31XX_IFACE1_MASTER_MASK, iface_reg1); - snd_soc_update_bits(codec, AIC31XX_DATA_OFFSET, + snd_soc_component_update_bits(component, AIC31XX_DATA_OFFSET, AIC31XX_DATA_OFFSET_MASK, dsp_a_val); - snd_soc_update_bits(codec, AIC31XX_IFACE2, + snd_soc_component_update_bits(component, AIC31XX_IFACE2, AIC31XX_BCLKINV_MASK, iface_reg2); - return 0; + return aic31xx_clock_master_routes(component, fmt); } static int aic31xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int i; - dev_dbg(codec->dev, "## %s: clk_id = %d, freq = %d, dir = %d\n", + dev_dbg(component->dev, "## %s: clk_id = %d, freq = %d, dir = %d\n", __func__, clk_id, freq, dir); for (i = 1; i < 8; i++) @@ -1025,7 +1108,7 @@ static int aic31xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, } /* set clock on MCLK, BCLK, or GPIO1 as PLL input */ - snd_soc_update_bits(codec, AIC31XX_CLKMUX, AIC31XX_PLL_CLKIN_MASK, + snd_soc_component_update_bits(component, AIC31XX_CLKMUX, AIC31XX_PLL_CLKIN_MASK, clk_id << AIC31XX_PLL_CLKIN_SHIFT); aic31xx->sysclk = freq; @@ -1071,42 +1154,42 @@ static int aic31xx_reset(struct aic31xx_priv *aic31xx) return ret; } -static void aic31xx_clk_on(struct snd_soc_codec *codec) +static void aic31xx_clk_on(struct snd_soc_component *component) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); u8 mask = AIC31XX_PM_MASK; u8 on = AIC31XX_PM_MASK; - dev_dbg(codec->dev, "codec clock -> on (rate %d)\n", + dev_dbg(component->dev, "codec clock -> on (rate %d)\n", aic31xx_divs[aic31xx->rate_div_line].rate); - snd_soc_update_bits(codec, AIC31XX_PLLPR, mask, on); + snd_soc_component_update_bits(component, AIC31XX_PLLPR, mask, on); mdelay(10); - snd_soc_update_bits(codec, AIC31XX_NDAC, mask, on); - snd_soc_update_bits(codec, AIC31XX_MDAC, mask, on); + snd_soc_component_update_bits(component, AIC31XX_NDAC, mask, on); + snd_soc_component_update_bits(component, AIC31XX_MDAC, mask, on); if (aic31xx_divs[aic31xx->rate_div_line].nadc) - snd_soc_update_bits(codec, AIC31XX_NADC, mask, on); + snd_soc_component_update_bits(component, AIC31XX_NADC, mask, on); if (aic31xx_divs[aic31xx->rate_div_line].madc) - snd_soc_update_bits(codec, AIC31XX_MADC, mask, on); - snd_soc_update_bits(codec, AIC31XX_BCLKN, mask, on); + snd_soc_component_update_bits(component, AIC31XX_MADC, mask, on); + snd_soc_component_update_bits(component, AIC31XX_BCLKN, mask, on); } -static void aic31xx_clk_off(struct snd_soc_codec *codec) +static void aic31xx_clk_off(struct snd_soc_component *component) { u8 mask = AIC31XX_PM_MASK; u8 off = 0; - dev_dbg(codec->dev, "codec clock -> off\n"); - snd_soc_update_bits(codec, AIC31XX_BCLKN, mask, off); - snd_soc_update_bits(codec, AIC31XX_MADC, mask, off); - snd_soc_update_bits(codec, AIC31XX_NADC, mask, off); - snd_soc_update_bits(codec, AIC31XX_MDAC, mask, off); - snd_soc_update_bits(codec, AIC31XX_NDAC, mask, off); - snd_soc_update_bits(codec, AIC31XX_PLLPR, mask, off); + dev_dbg(component->dev, "codec clock -> off\n"); + snd_soc_component_update_bits(component, AIC31XX_BCLKN, mask, off); + snd_soc_component_update_bits(component, AIC31XX_MADC, mask, off); + snd_soc_component_update_bits(component, AIC31XX_NADC, mask, off); + snd_soc_component_update_bits(component, AIC31XX_MDAC, mask, off); + snd_soc_component_update_bits(component, AIC31XX_NDAC, mask, off); + snd_soc_component_update_bits(component, AIC31XX_PLLPR, mask, off); } -static int aic31xx_power_on(struct snd_soc_codec *codec) +static int aic31xx_power_on(struct snd_soc_component *component) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(aic31xx->supplies), @@ -1123,7 +1206,7 @@ static int aic31xx_power_on(struct snd_soc_codec *codec) ret = regcache_sync(aic31xx->regmap); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to restore cache: %d\n", ret); regcache_cache_only(aic31xx->regmap, true); regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), @@ -1134,57 +1217,57 @@ static int aic31xx_power_on(struct snd_soc_codec *codec) return 0; } -static void aic31xx_power_off(struct snd_soc_codec *codec) +static void aic31xx_power_off(struct snd_soc_component *component) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); regcache_cache_only(aic31xx->regmap, true); regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), aic31xx->supplies); } -static int aic31xx_set_bias_level(struct snd_soc_codec *codec, +static int aic31xx_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - dev_dbg(codec->dev, "## %s: %d -> %d\n", __func__, - snd_soc_codec_get_bias_level(codec), level); + dev_dbg(component->dev, "## %s: %d -> %d\n", __func__, + snd_soc_component_get_bias_level(component), level); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) - aic31xx_clk_on(codec); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) + aic31xx_clk_on(component); break; case SND_SOC_BIAS_STANDBY: - switch (snd_soc_codec_get_bias_level(codec)) { + switch (snd_soc_component_get_bias_level(component)) { case SND_SOC_BIAS_OFF: - aic31xx_power_on(codec); + aic31xx_power_on(component); break; case SND_SOC_BIAS_PREPARE: - aic31xx_clk_off(codec); + aic31xx_clk_off(component); break; default: BUG(); } break; case SND_SOC_BIAS_OFF: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) - aic31xx_power_off(codec); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY) + aic31xx_power_off(component); break; } return 0; } -static int aic31xx_codec_probe(struct snd_soc_codec *codec) +static int aic31xx_codec_probe(struct snd_soc_component *component) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int i, ret; dev_dbg(aic31xx->dev, "## %s\n", __func__); - aic31xx->codec = codec; + aic31xx->component = component; for (i = 0; i < ARRAY_SIZE(aic31xx->supplies); i++) { aic31xx->disable_nb[i].nb.notifier_call = @@ -1193,7 +1276,7 @@ static int aic31xx_codec_probe(struct snd_soc_codec *codec) ret = regulator_register_notifier(aic31xx->supplies[i].consumer, &aic31xx->disable_nb[i].nb); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to request regulator notifier: %d\n", ret); return ret; @@ -1203,43 +1286,42 @@ static int aic31xx_codec_probe(struct snd_soc_codec *codec) regcache_cache_only(aic31xx->regmap, true); regcache_mark_dirty(aic31xx->regmap); - ret = aic31xx_add_controls(codec); + ret = aic31xx_add_controls(component); if (ret) return ret; - ret = aic31xx_add_widgets(codec); + ret = aic31xx_add_widgets(component); if (ret) return ret; return 0; } -static int aic31xx_codec_remove(struct snd_soc_codec *codec) +static void aic31xx_codec_remove(struct snd_soc_component *component) { - struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); + struct aic31xx_priv *aic31xx = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < ARRAY_SIZE(aic31xx->supplies); i++) regulator_unregister_notifier(aic31xx->supplies[i].consumer, &aic31xx->disable_nb[i].nb); - - return 0; } -static const struct snd_soc_codec_driver soc_codec_driver_aic31xx = { +static const struct snd_soc_component_driver soc_codec_driver_aic31xx = { .probe = aic31xx_codec_probe, .remove = aic31xx_codec_remove, .set_bias_level = aic31xx_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = common31xx_snd_controls, - .num_controls = ARRAY_SIZE(common31xx_snd_controls), - .dapm_widgets = common31xx_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(common31xx_dapm_widgets), - .dapm_routes = common31xx_audio_map, - .num_dapm_routes = ARRAY_SIZE(common31xx_audio_map), - }, + .controls = common31xx_snd_controls, + .num_controls = ARRAY_SIZE(common31xx_snd_controls), + .dapm_widgets = common31xx_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(common31xx_dapm_widgets), + .dapm_routes = common31xx_audio_map, + .num_dapm_routes = ARRAY_SIZE(common31xx_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct snd_soc_dai_ops aic31xx_dai_ops = { @@ -1375,23 +1457,17 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c, } if (aic31xx->codec_type & DAC31XX_BIT) - return snd_soc_register_codec(&i2c->dev, + return devm_snd_soc_register_component(&i2c->dev, &soc_codec_driver_aic31xx, dac31xx_dai_driver, ARRAY_SIZE(dac31xx_dai_driver)); else - return snd_soc_register_codec(&i2c->dev, + return devm_snd_soc_register_component(&i2c->dev, &soc_codec_driver_aic31xx, aic31xx_dai_driver, ARRAY_SIZE(aic31xx_dai_driver)); } -static int aic31xx_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - return 0; -} - static const struct i2c_device_id aic31xx_i2c_id[] = { { "tlv320aic310x", AIC3100 }, { "tlv320aic311x", AIC3110 }, @@ -1412,7 +1488,6 @@ static struct i2c_driver aic31xx_i2c_driver = { .acpi_match_table = ACPI_PTR(aic31xx_acpi_match), }, .probe = aic31xx_i2c_probe, - .remove = aic31xx_i2c_remove, .id_table = aic31xx_i2c_id, }; module_i2c_driver(aic31xx_i2c_driver); diff --git a/sound/soc/codecs/tlv320aic31xx.h b/sound/soc/codecs/tlv320aic31xx.h index 15ac7cba86fe..0b587585b38b 100644 --- a/sound/soc/codecs/tlv320aic31xx.h +++ b/sound/soc/codecs/tlv320aic31xx.h @@ -160,6 +160,7 @@ struct aic31xx_pdata { #define AIC31XX_DACMOD2BCLK 0x01 #define AIC31XX_ADC2BCLK 0x02 #define AIC31XX_ADCMOD2BCLK 0x03 +#define AIC31XX_KEEP_I2SCLK BIT(2) /* AIC31XX_ADCFLAG */ #define AIC31XX_ADCPWRSTATUS_MASK BIT(6) diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c index fea019343c3b..e2b5a11b16d1 100644 --- a/sound/soc/codecs/tlv320aic32x4.c +++ b/sound/soc/codecs/tlv320aic32x4.c @@ -82,10 +82,10 @@ struct aic32x4_priv { static int aic32x4_get_mfp1_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; - val = snd_soc_read(codec, AIC32X4_DINCTL); + val = snd_soc_component_read32(component, AIC32X4_DINCTL); ucontrol->value.integer.value[0] = (val & 0x01); @@ -95,11 +95,11 @@ static int aic32x4_get_mfp1_gpio(struct snd_kcontrol *kcontrol, static int aic32x4_set_mfp2_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; u8 gpio_check; - val = snd_soc_read(codec, AIC32X4_DOUTCTL); + val = snd_soc_component_read32(component, AIC32X4_DOUTCTL); gpio_check = (val & AIC32X4_MFP_GPIO_ENABLED); if (gpio_check != AIC32X4_MFP_GPIO_ENABLED) { printk(KERN_ERR "%s: MFP2 is not configure as a GPIO output\n", @@ -115,7 +115,7 @@ static int aic32x4_set_mfp2_gpio(struct snd_kcontrol *kcontrol, else val &= ~AIC32X4_MFP2_GPIO_OUT_HIGH; - snd_soc_write(codec, AIC32X4_DOUTCTL, val); + snd_soc_component_write(component, AIC32X4_DOUTCTL, val); return 0; }; @@ -123,10 +123,10 @@ static int aic32x4_set_mfp2_gpio(struct snd_kcontrol *kcontrol, static int aic32x4_get_mfp3_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; - val = snd_soc_read(codec, AIC32X4_SCLKCTL); + val = snd_soc_component_read32(component, AIC32X4_SCLKCTL); ucontrol->value.integer.value[0] = (val & 0x01); @@ -136,11 +136,11 @@ static int aic32x4_get_mfp3_gpio(struct snd_kcontrol *kcontrol, static int aic32x4_set_mfp4_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; u8 gpio_check; - val = snd_soc_read(codec, AIC32X4_MISOCTL); + val = snd_soc_component_read32(component, AIC32X4_MISOCTL); gpio_check = (val & AIC32X4_MFP_GPIO_ENABLED); if (gpio_check != AIC32X4_MFP_GPIO_ENABLED) { printk(KERN_ERR "%s: MFP4 is not configure as a GPIO output\n", @@ -156,7 +156,7 @@ static int aic32x4_set_mfp4_gpio(struct snd_kcontrol *kcontrol, else val &= ~AIC32X4_MFP5_GPIO_OUT_HIGH; - snd_soc_write(codec, AIC32X4_MISOCTL, val); + snd_soc_component_write(component, AIC32X4_MISOCTL, val); return 0; }; @@ -164,10 +164,10 @@ static int aic32x4_set_mfp4_gpio(struct snd_kcontrol *kcontrol, static int aic32x4_get_mfp5_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; - val = snd_soc_read(codec, AIC32X4_GPIOCTL); + val = snd_soc_component_read32(component, AIC32X4_GPIOCTL); ucontrol->value.integer.value[0] = ((val & 0x2) >> 1); return 0; @@ -176,11 +176,11 @@ static int aic32x4_get_mfp5_gpio(struct snd_kcontrol *kcontrol, static int aic32x4_set_mfp5_gpio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); u8 val; u8 gpio_check; - val = snd_soc_read(codec, AIC32X4_GPIOCTL); + val = snd_soc_component_read32(component, AIC32X4_GPIOCTL); gpio_check = (val & AIC32X4_MFP5_GPIO_OUTPUT); if (gpio_check != AIC32X4_MFP5_GPIO_OUTPUT) { printk(KERN_ERR "%s: MFP5 is not configure as a GPIO output\n", @@ -196,7 +196,7 @@ static int aic32x4_set_mfp5_gpio(struct snd_kcontrol *kcontrol, else val &= 0xfe; - snd_soc_write(codec, AIC32X4_GPIOCTL, val); + snd_soc_component_write(component, AIC32X4_GPIOCTL, val); return 0; }; @@ -597,8 +597,8 @@ static inline int aic32x4_get_divs(int mclk, int rate) static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component); switch (freq) { case 12000000: @@ -613,7 +613,7 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; u8 iface_reg_1 = 0; u8 iface_reg_2 = 0; u8 iface_reg_3 = 0; @@ -657,12 +657,12 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) return -EINVAL; } - snd_soc_update_bits(codec, AIC32X4_IFACE1, + snd_soc_component_update_bits(component, AIC32X4_IFACE1, AIC32X4_IFACE1_DATATYPE_MASK | AIC32X4_IFACE1_MASTER_MASK, iface_reg_1); - snd_soc_update_bits(codec, AIC32X4_IFACE2, + snd_soc_component_update_bits(component, AIC32X4_IFACE2, AIC32X4_DATA_OFFSET_MASK, iface_reg_2); - snd_soc_update_bits(codec, AIC32X4_IFACE3, + snd_soc_component_update_bits(component, AIC32X4_IFACE3, AIC32X4_BCLKINV_MASK, iface_reg_3); return 0; @@ -672,8 +672,8 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component); u8 iface1_reg = 0; u8 dacsetup_reg = 0; int i; @@ -685,54 +685,54 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, } /* MCLK as PLL_CLKIN */ - snd_soc_update_bits(codec, AIC32X4_CLKMUX, AIC32X4_PLL_CLKIN_MASK, + snd_soc_component_update_bits(component, AIC32X4_CLKMUX, AIC32X4_PLL_CLKIN_MASK, AIC32X4_PLL_CLKIN_MCLK << AIC32X4_PLL_CLKIN_SHIFT); /* PLL as CODEC_CLKIN */ - snd_soc_update_bits(codec, AIC32X4_CLKMUX, AIC32X4_CODEC_CLKIN_MASK, + snd_soc_component_update_bits(component, AIC32X4_CLKMUX, AIC32X4_CODEC_CLKIN_MASK, AIC32X4_CODEC_CLKIN_PLL << AIC32X4_CODEC_CLKIN_SHIFT); /* DAC_MOD_CLK as BDIV_CLKIN */ - snd_soc_update_bits(codec, AIC32X4_IFACE3, AIC32X4_BDIVCLK_MASK, + snd_soc_component_update_bits(component, AIC32X4_IFACE3, AIC32X4_BDIVCLK_MASK, AIC32X4_DACMOD2BCLK << AIC32X4_BDIVCLK_SHIFT); /* We will fix R value to 1 and will make P & J=K.D as variable */ - snd_soc_update_bits(codec, AIC32X4_PLLPR, AIC32X4_PLL_R_MASK, 0x01); + snd_soc_component_update_bits(component, AIC32X4_PLLPR, AIC32X4_PLL_R_MASK, 0x01); /* PLL P value */ - snd_soc_update_bits(codec, AIC32X4_PLLPR, AIC32X4_PLL_P_MASK, + snd_soc_component_update_bits(component, AIC32X4_PLLPR, AIC32X4_PLL_P_MASK, aic32x4_divs[i].p_val << AIC32X4_PLL_P_SHIFT); /* PLL J value */ - snd_soc_write(codec, AIC32X4_PLLJ, aic32x4_divs[i].pll_j); + snd_soc_component_write(component, AIC32X4_PLLJ, aic32x4_divs[i].pll_j); /* PLL D value */ - snd_soc_write(codec, AIC32X4_PLLDMSB, (aic32x4_divs[i].pll_d >> 8)); - snd_soc_write(codec, AIC32X4_PLLDLSB, (aic32x4_divs[i].pll_d & 0xff)); + snd_soc_component_write(component, AIC32X4_PLLDMSB, (aic32x4_divs[i].pll_d >> 8)); + snd_soc_component_write(component, AIC32X4_PLLDLSB, (aic32x4_divs[i].pll_d & 0xff)); /* NDAC divider value */ - snd_soc_update_bits(codec, AIC32X4_NDAC, + snd_soc_component_update_bits(component, AIC32X4_NDAC, AIC32X4_NDAC_MASK, aic32x4_divs[i].ndac); /* MDAC divider value */ - snd_soc_update_bits(codec, AIC32X4_MDAC, + snd_soc_component_update_bits(component, AIC32X4_MDAC, AIC32X4_MDAC_MASK, aic32x4_divs[i].mdac); /* DOSR MSB & LSB values */ - snd_soc_write(codec, AIC32X4_DOSRMSB, aic32x4_divs[i].dosr >> 8); - snd_soc_write(codec, AIC32X4_DOSRLSB, (aic32x4_divs[i].dosr & 0xff)); + snd_soc_component_write(component, AIC32X4_DOSRMSB, aic32x4_divs[i].dosr >> 8); + snd_soc_component_write(component, AIC32X4_DOSRLSB, (aic32x4_divs[i].dosr & 0xff)); /* NADC divider value */ - snd_soc_update_bits(codec, AIC32X4_NADC, + snd_soc_component_update_bits(component, AIC32X4_NADC, AIC32X4_NADC_MASK, aic32x4_divs[i].nadc); /* MADC divider value */ - snd_soc_update_bits(codec, AIC32X4_MADC, + snd_soc_component_update_bits(component, AIC32X4_MADC, AIC32X4_MADC_MASK, aic32x4_divs[i].madc); /* AOSR value */ - snd_soc_write(codec, AIC32X4_AOSR, aic32x4_divs[i].aosr); + snd_soc_component_write(component, AIC32X4_AOSR, aic32x4_divs[i].aosr); /* BCLK N divider */ - snd_soc_update_bits(codec, AIC32X4_BCLKN, + snd_soc_component_update_bits(component, AIC32X4_BCLKN, AIC32X4_BCLK_MASK, aic32x4_divs[i].blck_N); switch (params_width(params)) { @@ -753,7 +753,7 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, AIC32X4_IFACE1_DATALEN_SHIFT); break; } - snd_soc_update_bits(codec, AIC32X4_IFACE1, + snd_soc_component_update_bits(component, AIC32X4_IFACE1, AIC32X4_IFACE1_DATALEN_MASK, iface1_reg); if (params_channels(params) == 1) { @@ -764,7 +764,7 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, else dacsetup_reg = AIC32X4_LDAC2LCHN | AIC32X4_RDAC2RCHN; } - snd_soc_update_bits(codec, AIC32X4_DACSETUP, + snd_soc_component_update_bits(component, AIC32X4_DACSETUP, AIC32X4_DAC_CHAN_MASK, dacsetup_reg); return 0; @@ -772,18 +772,18 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream, static int aic32x4_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; - snd_soc_update_bits(codec, AIC32X4_DACMUTE, + snd_soc_component_update_bits(component, AIC32X4_DACMUTE, AIC32X4_MUTEON, mute ? AIC32X4_MUTEON : 0); return 0; } -static int aic32x4_set_bias_level(struct snd_soc_codec *codec, +static int aic32x4_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component); int ret; switch (level) { @@ -791,59 +791,59 @@ static int aic32x4_set_bias_level(struct snd_soc_codec *codec, /* Switch on master clock */ ret = clk_prepare_enable(aic32x4->mclk); if (ret) { - dev_err(codec->dev, "Failed to enable master clock\n"); + dev_err(component->dev, "Failed to enable master clock\n"); return ret; } /* Switch on PLL */ - snd_soc_update_bits(codec, AIC32X4_PLLPR, + snd_soc_component_update_bits(component, AIC32X4_PLLPR, AIC32X4_PLLEN, AIC32X4_PLLEN); /* Switch on NDAC Divider */ - snd_soc_update_bits(codec, AIC32X4_NDAC, + snd_soc_component_update_bits(component, AIC32X4_NDAC, AIC32X4_NDACEN, AIC32X4_NDACEN); /* Switch on MDAC Divider */ - snd_soc_update_bits(codec, AIC32X4_MDAC, + snd_soc_component_update_bits(component, AIC32X4_MDAC, AIC32X4_MDACEN, AIC32X4_MDACEN); /* Switch on NADC Divider */ - snd_soc_update_bits(codec, AIC32X4_NADC, + snd_soc_component_update_bits(component, AIC32X4_NADC, AIC32X4_NADCEN, AIC32X4_NADCEN); /* Switch on MADC Divider */ - snd_soc_update_bits(codec, AIC32X4_MADC, + snd_soc_component_update_bits(component, AIC32X4_MADC, AIC32X4_MADCEN, AIC32X4_MADCEN); /* Switch on BCLK_N Divider */ - snd_soc_update_bits(codec, AIC32X4_BCLKN, + snd_soc_component_update_bits(component, AIC32X4_BCLKN, AIC32X4_BCLKEN, AIC32X4_BCLKEN); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* Switch off BCLK_N Divider */ - snd_soc_update_bits(codec, AIC32X4_BCLKN, + snd_soc_component_update_bits(component, AIC32X4_BCLKN, AIC32X4_BCLKEN, 0); /* Switch off MADC Divider */ - snd_soc_update_bits(codec, AIC32X4_MADC, + snd_soc_component_update_bits(component, AIC32X4_MADC, AIC32X4_MADCEN, 0); /* Switch off NADC Divider */ - snd_soc_update_bits(codec, AIC32X4_NADC, + snd_soc_component_update_bits(component, AIC32X4_NADC, AIC32X4_NADCEN, 0); /* Switch off MDAC Divider */ - snd_soc_update_bits(codec, AIC32X4_MDAC, + snd_soc_component_update_bits(component, AIC32X4_MDAC, AIC32X4_MDACEN, 0); /* Switch off NDAC Divider */ - snd_soc_update_bits(codec, AIC32X4_NDAC, + snd_soc_component_update_bits(component, AIC32X4_NDAC, AIC32X4_NDACEN, 0); /* Switch off PLL */ - snd_soc_update_bits(codec, AIC32X4_PLLPR, + snd_soc_component_update_bits(component, AIC32X4_PLLPR, AIC32X4_PLLEN, 0); /* Switch off master clock */ @@ -884,55 +884,55 @@ static struct snd_soc_dai_driver aic32x4_dai = { .symmetric_rates = 1, }; -static void aic32x4_setup_gpios(struct snd_soc_codec *codec) +static void aic32x4_setup_gpios(struct snd_soc_component *component) { - struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component); /* setup GPIO functions */ /* MFP1 */ if (aic32x4->setup->gpio_func[0] != AIC32X4_MFPX_DEFAULT_VALUE) { - snd_soc_write(codec, AIC32X4_DINCTL, + snd_soc_component_write(component, AIC32X4_DINCTL, aic32x4->setup->gpio_func[0]); - snd_soc_add_codec_controls(codec, aic32x4_mfp1, + snd_soc_add_component_controls(component, aic32x4_mfp1, ARRAY_SIZE(aic32x4_mfp1)); } /* MFP2 */ if (aic32x4->setup->gpio_func[1] != AIC32X4_MFPX_DEFAULT_VALUE) { - snd_soc_write(codec, AIC32X4_DOUTCTL, + snd_soc_component_write(component, AIC32X4_DOUTCTL, aic32x4->setup->gpio_func[1]); - snd_soc_add_codec_controls(codec, aic32x4_mfp2, + snd_soc_add_component_controls(component, aic32x4_mfp2, ARRAY_SIZE(aic32x4_mfp2)); } /* MFP3 */ if (aic32x4->setup->gpio_func[2] != AIC32X4_MFPX_DEFAULT_VALUE) { - snd_soc_write(codec, AIC32X4_SCLKCTL, + snd_soc_component_write(component, AIC32X4_SCLKCTL, aic32x4->setup->gpio_func[2]); - snd_soc_add_codec_controls(codec, aic32x4_mfp3, + snd_soc_add_component_controls(component, aic32x4_mfp3, ARRAY_SIZE(aic32x4_mfp3)); } /* MFP4 */ if (aic32x4->setup->gpio_func[3] != AIC32X4_MFPX_DEFAULT_VALUE) { - snd_soc_write(codec, AIC32X4_MISOCTL, + snd_soc_component_write(component, AIC32X4_MISOCTL, aic32x4->setup->gpio_func[3]); - snd_soc_add_codec_controls(codec, aic32x4_mfp4, + snd_soc_add_component_controls(component, aic32x4_mfp4, ARRAY_SIZE(aic32x4_mfp4)); } /* MFP5 */ if (aic32x4->setup->gpio_func[4] != AIC32X4_MFPX_DEFAULT_VALUE) { - snd_soc_write(codec, AIC32X4_GPIOCTL, + snd_soc_component_write(component, AIC32X4_GPIOCTL, aic32x4->setup->gpio_func[4]); - snd_soc_add_codec_controls(codec, aic32x4_mfp5, + snd_soc_add_component_controls(component, aic32x4_mfp5, ARRAY_SIZE(aic32x4_mfp5)); } } -static int aic32x4_codec_probe(struct snd_soc_codec *codec) +static int aic32x4_component_probe(struct snd_soc_component *component) { - struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec); + struct aic32x4_priv *aic32x4 = snd_soc_component_get_drvdata(component); u32 tmp_reg; if (gpio_is_valid(aic32x4->rstn_gpio)) { @@ -940,42 +940,42 @@ static int aic32x4_codec_probe(struct snd_soc_codec *codec) gpio_set_value(aic32x4->rstn_gpio, 1); } - snd_soc_write(codec, AIC32X4_RESET, 0x01); + snd_soc_component_write(component, AIC32X4_RESET, 0x01); if (aic32x4->setup) - aic32x4_setup_gpios(codec); + aic32x4_setup_gpios(component); /* Power platform configuration */ if (aic32x4->power_cfg & AIC32X4_PWR_MICBIAS_2075_LDOIN) { - snd_soc_write(codec, AIC32X4_MICBIAS, AIC32X4_MICBIAS_LDOIN | + snd_soc_component_write(component, AIC32X4_MICBIAS, AIC32X4_MICBIAS_LDOIN | AIC32X4_MICBIAS_2075V); } if (aic32x4->power_cfg & AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE) - snd_soc_write(codec, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE); + snd_soc_component_write(component, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE); tmp_reg = (aic32x4->power_cfg & AIC32X4_PWR_AIC32X4_LDO_ENABLE) ? AIC32X4_LDOCTLEN : 0; - snd_soc_write(codec, AIC32X4_LDOCTL, tmp_reg); + snd_soc_component_write(component, AIC32X4_LDOCTL, tmp_reg); - tmp_reg = snd_soc_read(codec, AIC32X4_CMMODE); + tmp_reg = snd_soc_component_read32(component, AIC32X4_CMMODE); if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36) tmp_reg |= AIC32X4_LDOIN_18_36; if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_HP_LDOIN_POWERED) tmp_reg |= AIC32X4_LDOIN2HP; - snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg); + snd_soc_component_write(component, AIC32X4_CMMODE, tmp_reg); /* Mic PGA routing */ if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) - snd_soc_write(codec, AIC32X4_LMICPGANIN, + snd_soc_component_write(component, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K); else - snd_soc_write(codec, AIC32X4_LMICPGANIN, + snd_soc_component_write(component, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_CM1L_10K); if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K) - snd_soc_write(codec, AIC32X4_RMICPGANIN, + snd_soc_component_write(component, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_IN1L_10K); else - snd_soc_write(codec, AIC32X4_RMICPGANIN, + snd_soc_component_write(component, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_CM1R_10K); /* @@ -983,27 +983,28 @@ static int aic32x4_codec_probe(struct snd_soc_codec *codec) * and down for the first capture to work properly. It seems related to * a HW BUG or some kind of behavior not documented in the datasheet. */ - tmp_reg = snd_soc_read(codec, AIC32X4_ADCSETUP); - snd_soc_write(codec, AIC32X4_ADCSETUP, tmp_reg | + tmp_reg = snd_soc_component_read32(component, AIC32X4_ADCSETUP); + snd_soc_component_write(component, AIC32X4_ADCSETUP, tmp_reg | AIC32X4_LADC_EN | AIC32X4_RADC_EN); - snd_soc_write(codec, AIC32X4_ADCSETUP, tmp_reg); + snd_soc_component_write(component, AIC32X4_ADCSETUP, tmp_reg); return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_aic32x4 = { - .probe = aic32x4_codec_probe, - .set_bias_level = aic32x4_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = aic32x4_snd_controls, - .num_controls = ARRAY_SIZE(aic32x4_snd_controls), - .dapm_widgets = aic32x4_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(aic32x4_dapm_widgets), - .dapm_routes = aic32x4_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(aic32x4_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_aic32x4 = { + .probe = aic32x4_component_probe, + .set_bias_level = aic32x4_set_bias_level, + .controls = aic32x4_snd_controls, + .num_controls = ARRAY_SIZE(aic32x4_snd_controls), + .dapm_widgets = aic32x4_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(aic32x4_dapm_widgets), + .dapm_routes = aic32x4_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(aic32x4_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int aic32x4_parse_dt(struct aic32x4_priv *aic32x4, @@ -1181,10 +1182,10 @@ int aic32x4_probe(struct device *dev, struct regmap *regmap) return ret; } - ret = snd_soc_register_codec(dev, - &soc_codec_dev_aic32x4, &aic32x4_dai, 1); + ret = devm_snd_soc_register_component(dev, + &soc_component_dev_aic32x4, &aic32x4_dai, 1); if (ret) { - dev_err(dev, "Failed to register codec\n"); + dev_err(dev, "Failed to register component\n"); aic32x4_disable_regulators(aic32x4); return ret; } @@ -1199,8 +1200,6 @@ int aic32x4_remove(struct device *dev) aic32x4_disable_regulators(aic32x4); - snd_soc_unregister_codec(dev); - return 0; } EXPORT_SYMBOL(aic32x4_remove); diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index b751cad545da..6a271e6e6b8f 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -72,7 +72,7 @@ struct aic3x_disable_nb { /* codec private data */ struct aic3x_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regmap *regmap; struct regulator_bulk_data supplies[AIC3X_NUM_SUPPLIES]; struct aic3x_disable_nb disable_nb[AIC3X_NUM_SUPPLIES]; @@ -162,8 +162,8 @@ static const struct regmap_config aic3x_regmap = { static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int reg = mc->reg; @@ -172,7 +172,7 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol, unsigned int mask = (1 << fls(max)) - 1; unsigned int invert = mc->invert; unsigned short val; - struct snd_soc_dapm_update update = { 0 }; + struct snd_soc_dapm_update update = {}; int connect, change; val = (ucontrol->value.integer.value[0] & mask); @@ -189,7 +189,7 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol, mask <<= shift; val <<= shift; - change = snd_soc_test_bits(codec, reg, mask, val); + change = snd_soc_component_test_bits(component, reg, mask, val); if (change) { update.kcontrol = kcontrol; update.reg = reg; @@ -215,19 +215,19 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol, static int mic_bias_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: /* change mic bias voltage to user defined */ - snd_soc_update_bits(codec, MICBIAS_CTRL, + snd_soc_component_update_bits(component, MICBIAS_CTRL, MICBIAS_LEVEL_MASK, aic3x->micbias_vg << MICBIAS_LEVEL_SHIFT); break; case SND_SOC_DAPM_PRE_PMD: - snd_soc_update_bits(codec, MICBIAS_CTRL, + snd_soc_component_update_bits(component, MICBIAS_CTRL, MICBIAS_LEVEL_MASK, 0); break; } @@ -993,10 +993,10 @@ static const struct snd_soc_dapm_route intercon_3007[] = { {"SPOM", NULL, "Right Class-D Out"}, }; -static int aic3x_add_widgets(struct snd_soc_codec *codec) +static int aic3x_add_widgets(struct snd_soc_component *component) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); switch (aic3x->model) { case AIC3X_MODEL_3X: @@ -1035,8 +1035,8 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0; u8 data, j, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1; u16 d, pll_d = 1; @@ -1047,7 +1047,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, width = params_width(params); /* select data word length */ - data = snd_soc_read(codec, AIC3X_ASD_INTF_CTRLB) & (~(0x3 << 4)); + data = snd_soc_component_read32(component, AIC3X_ASD_INTF_CTRLB) & (~(0x3 << 4)); switch (width) { case 16: break; @@ -1061,7 +1061,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, data |= (0x03 << 4); break; } - snd_soc_write(codec, AIC3X_ASD_INTF_CTRLB, data); + snd_soc_component_write(component, AIC3X_ASD_INTF_CTRLB, data); /* Fsref can be 44100 or 48000 */ fsref = (params_rate(params) % 11025 == 0) ? 44100 : 48000; @@ -1076,15 +1076,15 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, if (bypass_pll) { pll_q &= 0xf; - snd_soc_write(codec, AIC3X_PLL_PROGA_REG, pll_q << PLLQ_SHIFT); - snd_soc_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_CLKDIV); + snd_soc_component_write(component, AIC3X_PLL_PROGA_REG, pll_q << PLLQ_SHIFT); + snd_soc_component_write(component, AIC3X_GPIOB_REG, CODEC_CLKIN_CLKDIV); /* disable PLL if it is bypassed */ - snd_soc_update_bits(codec, AIC3X_PLL_PROGA_REG, PLL_ENABLE, 0); + snd_soc_component_update_bits(component, AIC3X_PLL_PROGA_REG, PLL_ENABLE, 0); } else { - snd_soc_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_PLLDIV); + snd_soc_component_write(component, AIC3X_GPIOB_REG, CODEC_CLKIN_PLLDIV); /* enable PLL when it is used */ - snd_soc_update_bits(codec, AIC3X_PLL_PROGA_REG, + snd_soc_component_update_bits(component, AIC3X_PLL_PROGA_REG, PLL_ENABLE, PLL_ENABLE); } @@ -1094,7 +1094,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, data |= (fsref == 44100) ? FSREF_44100 : FSREF_48000; if (params_rate(params) >= 64000) data |= DUAL_RATE_MODE; - snd_soc_write(codec, AIC3X_CODEC_DATAPATH_REG, data); + snd_soc_component_write(component, AIC3X_CODEC_DATAPATH_REG, data); /* codec sample rate select */ data = (fsref * 20) / params_rate(params); @@ -1103,7 +1103,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, data /= 5; data -= 2; data |= (data << 4); - snd_soc_write(codec, AIC3X_SAMPLE_RATE_SEL_REG, data); + snd_soc_component_write(component, AIC3X_SAMPLE_RATE_SEL_REG, data); if (bypass_pll) return 0; @@ -1172,13 +1172,13 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream, } found: - snd_soc_update_bits(codec, AIC3X_PLL_PROGA_REG, PLLP_MASK, pll_p); - snd_soc_write(codec, AIC3X_OVRF_STATUS_AND_PLLR_REG, + snd_soc_component_update_bits(component, AIC3X_PLL_PROGA_REG, PLLP_MASK, pll_p); + snd_soc_component_write(component, AIC3X_OVRF_STATUS_AND_PLLR_REG, pll_r << PLLR_SHIFT); - snd_soc_write(codec, AIC3X_PLL_PROGB_REG, pll_j << PLLJ_SHIFT); - snd_soc_write(codec, AIC3X_PLL_PROGC_REG, + snd_soc_component_write(component, AIC3X_PLL_PROGB_REG, pll_j << PLLJ_SHIFT); + snd_soc_component_write(component, AIC3X_PLL_PROGC_REG, (pll_d >> 6) << PLLD_MSB_SHIFT); - snd_soc_write(codec, AIC3X_PLL_PROGD_REG, + snd_soc_component_write(component, AIC3X_PLL_PROGD_REG, (pll_d & 0x3F) << PLLD_LSB_SHIFT); return 0; @@ -1187,8 +1187,8 @@ found: static int aic3x_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); int delay = 0; int width = aic3x->slot_width; @@ -1202,23 +1202,23 @@ static int aic3x_prepare(struct snd_pcm_substream *substream, delay += aic3x->tdm_delay*width; /* Configure data delay */ - snd_soc_write(codec, AIC3X_ASD_INTF_CTRLC, delay); + snd_soc_component_write(component, AIC3X_ASD_INTF_CTRLC, delay); return 0; } static int aic3x_mute(struct snd_soc_dai *dai, int mute) { - struct snd_soc_codec *codec = dai->codec; - u8 ldac_reg = snd_soc_read(codec, LDAC_VOL) & ~MUTE_ON; - u8 rdac_reg = snd_soc_read(codec, RDAC_VOL) & ~MUTE_ON; + struct snd_soc_component *component = dai->component; + u8 ldac_reg = snd_soc_component_read32(component, LDAC_VOL) & ~MUTE_ON; + u8 rdac_reg = snd_soc_component_read32(component, RDAC_VOL) & ~MUTE_ON; if (mute) { - snd_soc_write(codec, LDAC_VOL, ldac_reg | MUTE_ON); - snd_soc_write(codec, RDAC_VOL, rdac_reg | MUTE_ON); + snd_soc_component_write(component, LDAC_VOL, ldac_reg | MUTE_ON); + snd_soc_component_write(component, RDAC_VOL, rdac_reg | MUTE_ON); } else { - snd_soc_write(codec, LDAC_VOL, ldac_reg); - snd_soc_write(codec, RDAC_VOL, rdac_reg); + snd_soc_component_write(component, LDAC_VOL, ldac_reg); + snd_soc_component_write(component, RDAC_VOL, rdac_reg); } return 0; @@ -1227,13 +1227,13 @@ static int aic3x_mute(struct snd_soc_dai *dai, int mute) static int aic3x_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); /* set clock on MCLK or GPIO2 or BCLK */ - snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, PLLCLK_IN_MASK, + snd_soc_component_update_bits(component, AIC3X_CLKGEN_CTRL_REG, PLLCLK_IN_MASK, clk_id << PLLCLK_IN_SHIFT); - snd_soc_update_bits(codec, AIC3X_CLKGEN_CTRL_REG, CLKDIV_IN_MASK, + snd_soc_component_update_bits(component, AIC3X_CLKGEN_CTRL_REG, CLKDIV_IN_MASK, clk_id << CLKDIV_IN_SHIFT); aic3x->sysclk = freq; @@ -1243,12 +1243,12 @@ static int aic3x_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int aic3x_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); u8 iface_areg, iface_breg; - iface_areg = snd_soc_read(codec, AIC3X_ASD_INTF_CTRLA) & 0x3f; - iface_breg = snd_soc_read(codec, AIC3X_ASD_INTF_CTRLB) & 0x3f; + iface_areg = snd_soc_component_read32(component, AIC3X_ASD_INTF_CTRLA) & 0x3f; + iface_breg = snd_soc_component_read32(component, AIC3X_ASD_INTF_CTRLB) & 0x3f; /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { @@ -1289,8 +1289,8 @@ static int aic3x_set_dai_fmt(struct snd_soc_dai *codec_dai, aic3x->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; /* set iface */ - snd_soc_write(codec, AIC3X_ASD_INTF_CTRLA, iface_areg); - snd_soc_write(codec, AIC3X_ASD_INTF_CTRLB, iface_breg); + snd_soc_component_write(component, AIC3X_ASD_INTF_CTRLA, iface_areg); + snd_soc_component_write(component, AIC3X_ASD_INTF_CTRLB, iface_breg); return 0; } @@ -1299,24 +1299,24 @@ static int aic3x_set_dai_tdm_slot(struct snd_soc_dai *codec_dai, unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) { - struct snd_soc_codec *codec = codec_dai->codec; - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); unsigned int lsb; if (tx_mask != rx_mask) { - dev_err(codec->dev, "tx and rx masks must be symmetric\n"); + dev_err(component->dev, "tx and rx masks must be symmetric\n"); return -EINVAL; } if (unlikely(!tx_mask)) { - dev_err(codec->dev, "tx and rx masks need to be non 0\n"); + dev_err(component->dev, "tx and rx masks need to be non 0\n"); return -EINVAL; } /* TDM based on DSP mode requires slots to be adjacent */ lsb = __ffs(tx_mask); if ((lsb + 1) != __fls(tx_mask)) { - dev_err(codec->dev, "Invalid mask, slots must be adjacent\n"); + dev_err(component->dev, "Invalid mask, slots must be adjacent\n"); return -EINVAL; } @@ -1327,7 +1327,7 @@ static int aic3x_set_dai_tdm_slot(struct snd_soc_dai *codec_dai, case 32: break; default: - dev_err(codec->dev, "Unsupported slot width %d\n", slot_width); + dev_err(component->dev, "Unsupported slot width %d\n", slot_width); return -EINVAL; } @@ -1336,7 +1336,7 @@ static int aic3x_set_dai_tdm_slot(struct snd_soc_dai *codec_dai, aic3x->slot_width = slot_width; /* DOUT in high-impedance on inactive bit clocks */ - snd_soc_update_bits(codec, AIC3X_ASD_INTF_CTRLA, + snd_soc_component_update_bits(component, AIC3X_ASD_INTF_CTRLA, DOUT_TRISTATE, DOUT_TRISTATE); return 0; @@ -1362,9 +1362,9 @@ static int aic3x_regulator_event(struct notifier_block *nb, return 0; } -static int aic3x_set_power(struct snd_soc_codec *codec, int power) +static int aic3x_set_power(struct snd_soc_component *component, int power) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); unsigned int pll_c, pll_d; int ret; @@ -1388,12 +1388,12 @@ static int aic3x_set_power(struct snd_soc_codec *codec, int power) * writing one of them and thus caused other one also not * being written */ - pll_c = snd_soc_read(codec, AIC3X_PLL_PROGC_REG); - pll_d = snd_soc_read(codec, AIC3X_PLL_PROGD_REG); + pll_c = snd_soc_component_read32(component, AIC3X_PLL_PROGC_REG); + pll_d = snd_soc_component_read32(component, AIC3X_PLL_PROGD_REG); if (pll_c == aic3x_reg[AIC3X_PLL_PROGC_REG].def || pll_d == aic3x_reg[AIC3X_PLL_PROGD_REG].def) { - snd_soc_write(codec, AIC3X_PLL_PROGC_REG, pll_c); - snd_soc_write(codec, AIC3X_PLL_PROGD_REG, pll_d); + snd_soc_component_write(component, AIC3X_PLL_PROGC_REG, pll_c); + snd_soc_component_write(component, AIC3X_PLL_PROGD_REG, pll_d); } /* @@ -1407,7 +1407,7 @@ static int aic3x_set_power(struct snd_soc_codec *codec, int power) * possible VDD leakage currents in case the supply regulators * remain on */ - snd_soc_write(codec, AIC3X_RESET, SOFT_RESET); + snd_soc_component_write(component, AIC3X_RESET, SOFT_RESET); regcache_mark_dirty(aic3x->regmap); aic3x->power = 0; /* HW writes are needless when bias is off */ @@ -1419,35 +1419,35 @@ out: return ret; } -static int aic3x_set_bias_level(struct snd_soc_codec *codec, +static int aic3x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY && + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY && aic3x->master) { /* enable pll */ - snd_soc_update_bits(codec, AIC3X_PLL_PROGA_REG, + snd_soc_component_update_bits(component, AIC3X_PLL_PROGA_REG, PLL_ENABLE, PLL_ENABLE); } break; case SND_SOC_BIAS_STANDBY: if (!aic3x->power) - aic3x_set_power(codec, 1); - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_PREPARE && + aic3x_set_power(component, 1); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_PREPARE && aic3x->master) { /* disable pll */ - snd_soc_update_bits(codec, AIC3X_PLL_PROGA_REG, + snd_soc_component_update_bits(component, AIC3X_PLL_PROGA_REG, PLL_ENABLE, 0); } break; case SND_SOC_BIAS_OFF: if (aic3x->power) - aic3x_set_power(codec, 0); + aic3x_set_power(component, 0); break; } @@ -1486,96 +1486,96 @@ static struct snd_soc_dai_driver aic3x_dai = { .symmetric_rates = 1, }; -static void aic3x_mono_init(struct snd_soc_codec *codec) +static void aic3x_mono_init(struct snd_soc_component *component) { /* DAC to Mono Line Out default volume and route to Output mixer */ - snd_soc_write(codec, DACL1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON); - snd_soc_write(codec, DACR1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACL1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACR1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON); /* unmute all outputs */ - snd_soc_update_bits(codec, MONOLOPM_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, MONOLOPM_CTRL, UNMUTE, UNMUTE); /* PGA to Mono Line Out default volume, disconnect from Output Mixer */ - snd_soc_write(codec, PGAL_2_MONOLOPM_VOL, DEFAULT_VOL); - snd_soc_write(codec, PGAR_2_MONOLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAL_2_MONOLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAR_2_MONOLOPM_VOL, DEFAULT_VOL); /* Line2 to Mono Out default volume, disconnect from Output Mixer */ - snd_soc_write(codec, LINE2L_2_MONOLOPM_VOL, DEFAULT_VOL); - snd_soc_write(codec, LINE2R_2_MONOLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2L_2_MONOLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2R_2_MONOLOPM_VOL, DEFAULT_VOL); } /* * initialise the AIC3X driver * register the mixer and dsp interfaces with the kernel */ -static int aic3x_init(struct snd_soc_codec *codec) +static int aic3x_init(struct snd_soc_component *component) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); - snd_soc_write(codec, AIC3X_PAGE_SELECT, PAGE0_SELECT); - snd_soc_write(codec, AIC3X_RESET, SOFT_RESET); + snd_soc_component_write(component, AIC3X_PAGE_SELECT, PAGE0_SELECT); + snd_soc_component_write(component, AIC3X_RESET, SOFT_RESET); /* DAC default volume and mute */ - snd_soc_write(codec, LDAC_VOL, DEFAULT_VOL | MUTE_ON); - snd_soc_write(codec, RDAC_VOL, DEFAULT_VOL | MUTE_ON); + snd_soc_component_write(component, LDAC_VOL, DEFAULT_VOL | MUTE_ON); + snd_soc_component_write(component, RDAC_VOL, DEFAULT_VOL | MUTE_ON); /* DAC to HP default volume and route to Output mixer */ - snd_soc_write(codec, DACL1_2_HPLOUT_VOL, DEFAULT_VOL | ROUTE_ON); - snd_soc_write(codec, DACR1_2_HPROUT_VOL, DEFAULT_VOL | ROUTE_ON); - snd_soc_write(codec, DACL1_2_HPLCOM_VOL, DEFAULT_VOL | ROUTE_ON); - snd_soc_write(codec, DACR1_2_HPRCOM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACL1_2_HPLOUT_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACR1_2_HPROUT_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACL1_2_HPLCOM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACR1_2_HPRCOM_VOL, DEFAULT_VOL | ROUTE_ON); /* DAC to Line Out default volume and route to Output mixer */ - snd_soc_write(codec, DACL1_2_LLOPM_VOL, DEFAULT_VOL | ROUTE_ON); - snd_soc_write(codec, DACR1_2_RLOPM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACL1_2_LLOPM_VOL, DEFAULT_VOL | ROUTE_ON); + snd_soc_component_write(component, DACR1_2_RLOPM_VOL, DEFAULT_VOL | ROUTE_ON); /* unmute all outputs */ - snd_soc_update_bits(codec, LLOPM_CTRL, UNMUTE, UNMUTE); - snd_soc_update_bits(codec, RLOPM_CTRL, UNMUTE, UNMUTE); - snd_soc_update_bits(codec, HPLOUT_CTRL, UNMUTE, UNMUTE); - snd_soc_update_bits(codec, HPROUT_CTRL, UNMUTE, UNMUTE); - snd_soc_update_bits(codec, HPLCOM_CTRL, UNMUTE, UNMUTE); - snd_soc_update_bits(codec, HPRCOM_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, LLOPM_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, RLOPM_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, HPLOUT_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, HPROUT_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, HPLCOM_CTRL, UNMUTE, UNMUTE); + snd_soc_component_update_bits(component, HPRCOM_CTRL, UNMUTE, UNMUTE); /* ADC default volume and unmute */ - snd_soc_write(codec, LADC_VOL, DEFAULT_GAIN); - snd_soc_write(codec, RADC_VOL, DEFAULT_GAIN); + snd_soc_component_write(component, LADC_VOL, DEFAULT_GAIN); + snd_soc_component_write(component, RADC_VOL, DEFAULT_GAIN); /* By default route Line1 to ADC PGA mixer */ - snd_soc_write(codec, LINE1L_2_LADC_CTRL, 0x0); - snd_soc_write(codec, LINE1R_2_RADC_CTRL, 0x0); + snd_soc_component_write(component, LINE1L_2_LADC_CTRL, 0x0); + snd_soc_component_write(component, LINE1R_2_RADC_CTRL, 0x0); /* PGA to HP Bypass default volume, disconnect from Output Mixer */ - snd_soc_write(codec, PGAL_2_HPLOUT_VOL, DEFAULT_VOL); - snd_soc_write(codec, PGAR_2_HPROUT_VOL, DEFAULT_VOL); - snd_soc_write(codec, PGAL_2_HPLCOM_VOL, DEFAULT_VOL); - snd_soc_write(codec, PGAR_2_HPRCOM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAL_2_HPLOUT_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAR_2_HPROUT_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAL_2_HPLCOM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAR_2_HPRCOM_VOL, DEFAULT_VOL); /* PGA to Line Out default volume, disconnect from Output Mixer */ - snd_soc_write(codec, PGAL_2_LLOPM_VOL, DEFAULT_VOL); - snd_soc_write(codec, PGAR_2_RLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAL_2_LLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, PGAR_2_RLOPM_VOL, DEFAULT_VOL); /* On tlv320aic3104, these registers are reserved and must not be written */ if (aic3x->model != AIC3X_MODEL_3104) { /* Line2 to HP Bypass default volume, disconnect from Output Mixer */ - snd_soc_write(codec, LINE2L_2_HPLOUT_VOL, DEFAULT_VOL); - snd_soc_write(codec, LINE2R_2_HPROUT_VOL, DEFAULT_VOL); - snd_soc_write(codec, LINE2L_2_HPLCOM_VOL, DEFAULT_VOL); - snd_soc_write(codec, LINE2R_2_HPRCOM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2L_2_HPLOUT_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2R_2_HPROUT_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2L_2_HPLCOM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2R_2_HPRCOM_VOL, DEFAULT_VOL); /* Line2 Line Out default volume, disconnect from Output Mixer */ - snd_soc_write(codec, LINE2L_2_LLOPM_VOL, DEFAULT_VOL); - snd_soc_write(codec, LINE2R_2_RLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2L_2_LLOPM_VOL, DEFAULT_VOL); + snd_soc_component_write(component, LINE2R_2_RLOPM_VOL, DEFAULT_VOL); } switch (aic3x->model) { case AIC3X_MODEL_3X: case AIC3X_MODEL_33: - aic3x_mono_init(codec); + aic3x_mono_init(component); break; case AIC3X_MODEL_3007: - snd_soc_write(codec, CLASSD_CTRL, 0); + snd_soc_component_write(component, CLASSD_CTRL, 0); break; } /* Output common-mode voltage = 1.5 V */ - snd_soc_update_bits(codec, HPOUT_SC, HPOUT_SC_OCMV_MASK, + snd_soc_component_update_bits(component, HPOUT_SC, HPOUT_SC_OCMV_MASK, aic3x->ocmv << HPOUT_SC_OCMV_SHIFT); return 0; @@ -1594,13 +1594,13 @@ static bool aic3x_is_shared_reset(struct aic3x_priv *aic3x) return false; } -static int aic3x_probe(struct snd_soc_codec *codec) +static int aic3x_probe(struct snd_soc_component *component) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); int ret, i; INIT_LIST_HEAD(&aic3x->list); - aic3x->codec = codec; + aic3x->component = component; for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) { aic3x->disable_nb[i].nb.notifier_call = aic3x_regulator_event; @@ -1608,7 +1608,7 @@ static int aic3x_probe(struct snd_soc_codec *codec) ret = regulator_register_notifier(aic3x->supplies[i].consumer, &aic3x->disable_nb[i].nb); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to request regulator notifier: %d\n", ret); goto err_notif; @@ -1616,32 +1616,32 @@ static int aic3x_probe(struct snd_soc_codec *codec) } regcache_mark_dirty(aic3x->regmap); - aic3x_init(codec); + aic3x_init(component); if (aic3x->setup) { if (aic3x->model != AIC3X_MODEL_3104) { /* setup GPIO functions */ - snd_soc_write(codec, AIC3X_GPIO1_REG, + snd_soc_component_write(component, AIC3X_GPIO1_REG, (aic3x->setup->gpio_func[0] & 0xf) << 4); - snd_soc_write(codec, AIC3X_GPIO2_REG, + snd_soc_component_write(component, AIC3X_GPIO2_REG, (aic3x->setup->gpio_func[1] & 0xf) << 4); } else { - dev_warn(codec->dev, "GPIO functionality is not supported on tlv320aic3104\n"); + dev_warn(component->dev, "GPIO functionality is not supported on tlv320aic3104\n"); } } switch (aic3x->model) { case AIC3X_MODEL_3X: case AIC3X_MODEL_33: - snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls, + snd_soc_add_component_controls(component, aic3x_extra_snd_controls, ARRAY_SIZE(aic3x_extra_snd_controls)); - snd_soc_add_codec_controls(codec, aic3x_mono_controls, + snd_soc_add_component_controls(component, aic3x_mono_controls, ARRAY_SIZE(aic3x_mono_controls)); break; case AIC3X_MODEL_3007: - snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls, + snd_soc_add_component_controls(component, aic3x_extra_snd_controls, ARRAY_SIZE(aic3x_extra_snd_controls)); - snd_soc_add_codec_controls(codec, + snd_soc_add_component_controls(component, &aic3x_classd_amp_gain_ctrl, 1); break; case AIC3X_MODEL_3104: @@ -1653,7 +1653,7 @@ static int aic3x_probe(struct snd_soc_codec *codec) case AIC3X_MICBIAS_2_0V: case AIC3X_MICBIAS_2_5V: case AIC3X_MICBIAS_AVDDV: - snd_soc_update_bits(codec, MICBIAS_CTRL, + snd_soc_component_update_bits(component, MICBIAS_CTRL, MICBIAS_LEVEL_MASK, (aic3x->micbias_vg) << MICBIAS_LEVEL_SHIFT); break; @@ -1666,7 +1666,7 @@ static int aic3x_probe(struct snd_soc_codec *codec) break; } - aic3x_add_widgets(codec); + aic3x_add_widgets(component); return 0; @@ -1677,32 +1677,30 @@ err_notif: return ret; } -static int aic3x_remove(struct snd_soc_codec *codec) +static void aic3x_remove(struct snd_soc_component *component) { - struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); + struct aic3x_priv *aic3x = snd_soc_component_get_drvdata(component); int i; list_del(&aic3x->list); for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) regulator_unregister_notifier(aic3x->supplies[i].consumer, &aic3x->disable_nb[i].nb); - - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_aic3x = { - .set_bias_level = aic3x_set_bias_level, - .idle_bias_off = true, - .probe = aic3x_probe, - .remove = aic3x_remove, - .component_driver = { - .controls = aic3x_snd_controls, - .num_controls = ARRAY_SIZE(aic3x_snd_controls), - .dapm_widgets = aic3x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(aic3x_dapm_widgets), - .dapm_routes = intercon, - .num_dapm_routes = ARRAY_SIZE(intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_aic3x = { + .set_bias_level = aic3x_set_bias_level, + .probe = aic3x_probe, + .remove = aic3x_remove, + .controls = aic3x_snd_controls, + .num_controls = ARRAY_SIZE(aic3x_snd_controls), + .dapm_widgets = aic3x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(aic3x_dapm_widgets), + .dapm_routes = intercon, + .num_dapm_routes = ARRAY_SIZE(intercon), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static void aic3x_configure_ocmv(struct i2c_client *client) @@ -1876,8 +1874,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, ret); } - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_aic3x, &aic3x_dai, 1); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_aic3x, &aic3x_dai, 1); if (ret != 0) goto err_gpio; @@ -1898,7 +1896,6 @@ static int aic3x_i2c_remove(struct i2c_client *client) { struct aic3x_priv *aic3x = i2c_get_clientdata(client); - snd_soc_unregister_codec(&client->dev); if (gpio_is_valid(aic3x->gpio_reset) && !aic3x_is_shared_reset(aic3x)) { gpio_set_value(aic3x->gpio_reset, 0); diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c index 8c71d2f876ff..a957eaeb7bc1 100644 --- a/sound/soc/codecs/tlv320dac33.c +++ b/sound/soc/codecs/tlv320dac33.c @@ -63,9 +63,9 @@ (((samples)*5000) / (((burstrate)*5000) / ((burstrate) - (playrate)))) static void dac33_calculate_times(struct snd_pcm_substream *substream, - struct snd_soc_codec *codec); + struct snd_soc_component *component); static int dac33_prepare_chip(struct snd_pcm_substream *substream, - struct snd_soc_codec *codec); + struct snd_soc_component *component); enum dac33_state { DAC33_IDLE = 0, @@ -91,7 +91,7 @@ static const char *dac33_supply_names[DAC33_NUM_SUPPLIES] = { struct tlv320dac33_priv { struct mutex mutex; struct work_struct work; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct regulator_bulk_data supplies[DAC33_NUM_SUPPLIES]; struct snd_pcm_substream *substream; int power_gpio; @@ -171,10 +171,10 @@ static const u8 dac33_reg[DAC33_CACHEREGNUM] = { }; /* Register read and write */ -static inline unsigned int dac33_read_reg_cache(struct snd_soc_codec *codec, +static inline unsigned int dac33_read_reg_cache(struct snd_soc_component *component, unsigned reg) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 *cache = dac33->reg_cache; if (reg >= DAC33_CACHEREGNUM) return 0; @@ -182,10 +182,10 @@ static inline unsigned int dac33_read_reg_cache(struct snd_soc_codec *codec, return cache[reg]; } -static inline void dac33_write_reg_cache(struct snd_soc_codec *codec, +static inline void dac33_write_reg_cache(struct snd_soc_component *component, u8 reg, u8 value) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 *cache = dac33->reg_cache; if (reg >= DAC33_CACHEREGNUM) return; @@ -193,10 +193,10 @@ static inline void dac33_write_reg_cache(struct snd_soc_codec *codec, cache[reg] = value; } -static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, +static int dac33_read(struct snd_soc_component *component, unsigned int reg, u8 *value) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int val, ret = 0; *value = reg & 0xff; @@ -205,24 +205,24 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, if (dac33->chip_power) { val = i2c_smbus_read_byte_data(dac33->i2c, value[0]); if (val < 0) { - dev_err(codec->dev, "Read failed (%d)\n", val); - value[0] = dac33_read_reg_cache(codec, reg); + dev_err(component->dev, "Read failed (%d)\n", val); + value[0] = dac33_read_reg_cache(component, reg); ret = val; } else { value[0] = val; - dac33_write_reg_cache(codec, reg, val); + dac33_write_reg_cache(component, reg, val); } } else { - value[0] = dac33_read_reg_cache(codec, reg); + value[0] = dac33_read_reg_cache(component, reg); } return ret; } -static int dac33_write(struct snd_soc_codec *codec, unsigned int reg, +static int dac33_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 data[2]; int ret = 0; @@ -234,11 +234,11 @@ static int dac33_write(struct snd_soc_codec *codec, unsigned int reg, data[0] = reg & 0xff; data[1] = value & 0xff; - dac33_write_reg_cache(codec, data[0], data[1]); + dac33_write_reg_cache(component, data[0], data[1]); if (dac33->chip_power) { ret = i2c_master_send(dac33->i2c, data, 2); if (ret != 2) - dev_err(codec->dev, "Write failed (%d)\n", ret); + dev_err(component->dev, "Write failed (%d)\n", ret); else ret = 0; } @@ -246,24 +246,24 @@ static int dac33_write(struct snd_soc_codec *codec, unsigned int reg, return ret; } -static int dac33_write_locked(struct snd_soc_codec *codec, unsigned int reg, +static int dac33_write_locked(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&dac33->mutex); - ret = dac33_write(codec, reg, value); + ret = dac33_write(component, reg, value); mutex_unlock(&dac33->mutex); return ret; } #define DAC33_I2C_ADDR_AUTOINC 0x80 -static int dac33_write16(struct snd_soc_codec *codec, unsigned int reg, +static int dac33_write16(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 data[3]; int ret = 0; @@ -277,15 +277,15 @@ static int dac33_write16(struct snd_soc_codec *codec, unsigned int reg, data[1] = (value >> 8) & 0xff; data[2] = value & 0xff; - dac33_write_reg_cache(codec, data[0], data[1]); - dac33_write_reg_cache(codec, data[0] + 1, data[2]); + dac33_write_reg_cache(component, data[0], data[1]); + dac33_write_reg_cache(component, data[0] + 1, data[2]); if (dac33->chip_power) { /* We need to set autoincrement mode for 16 bit writes */ data[0] |= DAC33_I2C_ADDR_AUTOINC; ret = i2c_master_send(dac33->i2c, data, 3); if (ret != 3) - dev_err(codec->dev, "Write failed (%d)\n", ret); + dev_err(component->dev, "Write failed (%d)\n", ret); else ret = 0; } @@ -293,52 +293,52 @@ static int dac33_write16(struct snd_soc_codec *codec, unsigned int reg, return ret; } -static void dac33_init_chip(struct snd_soc_codec *codec) +static void dac33_init_chip(struct snd_soc_component *component) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); if (unlikely(!dac33->chip_power)) return; /* A : DAC sample rate Fsref/1.5 */ - dac33_write(codec, DAC33_DAC_CTRL_A, DAC33_DACRATE(0)); + dac33_write(component, DAC33_DAC_CTRL_A, DAC33_DACRATE(0)); /* B : DAC src=normal, not muted */ - dac33_write(codec, DAC33_DAC_CTRL_B, DAC33_DACSRCR_RIGHT | + dac33_write(component, DAC33_DAC_CTRL_B, DAC33_DACSRCR_RIGHT | DAC33_DACSRCL_LEFT); /* C : (defaults) */ - dac33_write(codec, DAC33_DAC_CTRL_C, 0x00); + dac33_write(component, DAC33_DAC_CTRL_C, 0x00); /* 73 : volume soft stepping control, clock source = internal osc (?) */ - dac33_write(codec, DAC33_ANA_VOL_SOFT_STEP_CTRL, DAC33_VOLCLKEN); + dac33_write(component, DAC33_ANA_VOL_SOFT_STEP_CTRL, DAC33_VOLCLKEN); /* Restore only selected registers (gains mostly) */ - dac33_write(codec, DAC33_LDAC_DIG_VOL_CTRL, - dac33_read_reg_cache(codec, DAC33_LDAC_DIG_VOL_CTRL)); - dac33_write(codec, DAC33_RDAC_DIG_VOL_CTRL, - dac33_read_reg_cache(codec, DAC33_RDAC_DIG_VOL_CTRL)); - - dac33_write(codec, DAC33_LINEL_TO_LLO_VOL, - dac33_read_reg_cache(codec, DAC33_LINEL_TO_LLO_VOL)); - dac33_write(codec, DAC33_LINER_TO_RLO_VOL, - dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL)); - - dac33_write(codec, DAC33_OUT_AMP_CTRL, - dac33_read_reg_cache(codec, DAC33_OUT_AMP_CTRL)); - - dac33_write(codec, DAC33_LDAC_PWR_CTRL, - dac33_read_reg_cache(codec, DAC33_LDAC_PWR_CTRL)); - dac33_write(codec, DAC33_RDAC_PWR_CTRL, - dac33_read_reg_cache(codec, DAC33_RDAC_PWR_CTRL)); + dac33_write(component, DAC33_LDAC_DIG_VOL_CTRL, + dac33_read_reg_cache(component, DAC33_LDAC_DIG_VOL_CTRL)); + dac33_write(component, DAC33_RDAC_DIG_VOL_CTRL, + dac33_read_reg_cache(component, DAC33_RDAC_DIG_VOL_CTRL)); + + dac33_write(component, DAC33_LINEL_TO_LLO_VOL, + dac33_read_reg_cache(component, DAC33_LINEL_TO_LLO_VOL)); + dac33_write(component, DAC33_LINER_TO_RLO_VOL, + dac33_read_reg_cache(component, DAC33_LINER_TO_RLO_VOL)); + + dac33_write(component, DAC33_OUT_AMP_CTRL, + dac33_read_reg_cache(component, DAC33_OUT_AMP_CTRL)); + + dac33_write(component, DAC33_LDAC_PWR_CTRL, + dac33_read_reg_cache(component, DAC33_LDAC_PWR_CTRL)); + dac33_write(component, DAC33_RDAC_PWR_CTRL, + dac33_read_reg_cache(component, DAC33_RDAC_PWR_CTRL)); } -static inline int dac33_read_id(struct snd_soc_codec *codec) +static inline int dac33_read_id(struct snd_soc_component *component) { int i, ret = 0; u8 reg; for (i = 0; i < 3; i++) { - ret = dac33_read(codec, DAC33_DEVICE_ID_MSB + i, ®); + ret = dac33_read(component, DAC33_DEVICE_ID_MSB + i, ®); if (ret < 0) break; } @@ -346,44 +346,44 @@ static inline int dac33_read_id(struct snd_soc_codec *codec) return ret; } -static inline void dac33_soft_power(struct snd_soc_codec *codec, int power) +static inline void dac33_soft_power(struct snd_soc_component *component, int power) { u8 reg; - reg = dac33_read_reg_cache(codec, DAC33_PWR_CTRL); + reg = dac33_read_reg_cache(component, DAC33_PWR_CTRL); if (power) reg |= DAC33_PDNALLB; else reg &= ~(DAC33_PDNALLB | DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB); - dac33_write(codec, DAC33_PWR_CTRL, reg); + dac33_write(component, DAC33_PWR_CTRL, reg); } -static inline void dac33_disable_digital(struct snd_soc_codec *codec) +static inline void dac33_disable_digital(struct snd_soc_component *component) { u8 reg; /* Stop the DAI clock */ - reg = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B); + reg = dac33_read_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_B); reg &= ~DAC33_BCLKON; - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, reg); + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_B, reg); /* Power down the Oscillator, and DACs */ - reg = dac33_read_reg_cache(codec, DAC33_PWR_CTRL); + reg = dac33_read_reg_cache(component, DAC33_PWR_CTRL); reg &= ~(DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB); - dac33_write(codec, DAC33_PWR_CTRL, reg); + dac33_write(component, DAC33_PWR_CTRL, reg); } -static int dac33_hard_power(struct snd_soc_codec *codec, int power) +static int dac33_hard_power(struct snd_soc_component *component, int power) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int ret = 0; mutex_lock(&dac33->mutex); /* Safety check */ if (unlikely(power == dac33->chip_power)) { - dev_dbg(codec->dev, "Trying to set the same power state: %s\n", + dev_dbg(component->dev, "Trying to set the same power state: %s\n", power ? "ON" : "OFF"); goto exit; } @@ -392,7 +392,7 @@ static int dac33_hard_power(struct snd_soc_codec *codec, int power) ret = regulator_bulk_enable(ARRAY_SIZE(dac33->supplies), dac33->supplies); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to enable supplies: %d\n", ret); goto exit; } @@ -402,14 +402,14 @@ static int dac33_hard_power(struct snd_soc_codec *codec, int power) dac33->chip_power = 1; } else { - dac33_soft_power(codec, 0); + dac33_soft_power(component, 0); if (dac33->power_gpio >= 0) gpio_set_value(dac33->power_gpio, 0); ret = regulator_bulk_disable(ARRAY_SIZE(dac33->supplies), dac33->supplies); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to disable supplies: %d\n", ret); goto exit; } @@ -425,18 +425,18 @@ exit: static int dac33_playback_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_PRE_PMU: if (likely(dac33->substream)) { - dac33_calculate_times(dac33->substream, codec); - dac33_prepare_chip(dac33->substream, codec); + dac33_calculate_times(dac33->substream, component); + dac33_prepare_chip(dac33->substream, component); } break; case SND_SOC_DAPM_POST_PMD: - dac33_disable_digital(codec); + dac33_disable_digital(component); break; } return 0; @@ -445,8 +445,8 @@ static int dac33_playback_event(struct snd_soc_dapm_widget *w, static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); ucontrol->value.enumerated.item[0] = dac33->fifo_mode; @@ -456,14 +456,14 @@ static int dac33_get_fifo_mode(struct snd_kcontrol *kcontrol, static int dac33_set_fifo_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int ret = 0; if (dac33->fifo_mode == ucontrol->value.enumerated.item[0]) return 0; /* Do not allow changes while stream is running*/ - if (snd_soc_codec_is_active(codec)) + if (snd_soc_component_is_active(component)) return -EPERM; if (ucontrol->value.enumerated.item[0] >= DAC33_FIFO_LAST_MODE) @@ -623,7 +623,7 @@ static const struct snd_soc_dapm_route audio_map[] = { {"RIGHT_LO", NULL, "Codec Power"}, }; -static int dac33_set_bias_level(struct snd_soc_codec *codec, +static int dac33_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { int ret; @@ -634,20 +634,20 @@ static int dac33_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { - /* Coming from OFF, switch on the codec */ - ret = dac33_hard_power(codec, 1); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { + /* Coming from OFF, switch on the component */ + ret = dac33_hard_power(component, 1); if (ret != 0) return ret; - dac33_init_chip(codec); + dac33_init_chip(component); } break; case SND_SOC_BIAS_OFF: - /* Do not power off, when the codec is already off */ - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) + /* Do not power off, when the component is already off */ + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) return 0; - ret = dac33_hard_power(codec, 0); + ret = dac33_hard_power(component, 0); if (ret != 0) return ret; break; @@ -658,13 +658,13 @@ static int dac33_set_bias_level(struct snd_soc_codec *codec, static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) { - struct snd_soc_codec *codec = dac33->codec; + struct snd_soc_component *component = dac33->component; unsigned int delay; unsigned long flags; switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: - dac33_write16(codec, DAC33_NSAMPLE_MSB, + dac33_write16(component, DAC33_NSAMPLE_MSB, DAC33_THRREG(dac33->nsample)); /* Take the timestamps */ @@ -673,13 +673,13 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) dac33->t_stamp1 = dac33->t_stamp2; spin_unlock_irqrestore(&dac33->lock, flags); - dac33_write16(codec, DAC33_PREFILL_MSB, + dac33_write16(component, DAC33_PREFILL_MSB, DAC33_THRREG(dac33->alarm_threshold)); /* Enable Alarm Threshold IRQ with a delay */ delay = SAMPLES_TO_US(dac33->burst_rate, dac33->alarm_threshold) + 1000; usleep_range(delay, delay + 500); - dac33_write(codec, DAC33_FIFO_IRQ_MASK, DAC33_MAT); + dac33_write(component, DAC33_FIFO_IRQ_MASK, DAC33_MAT); break; case DAC33_FIFO_MODE7: /* Take the timestamp */ @@ -689,14 +689,14 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) dac33->t_stamp1 -= dac33->mode7_us_to_lthr; spin_unlock_irqrestore(&dac33->lock, flags); - dac33_write16(codec, DAC33_PREFILL_MSB, + dac33_write16(component, DAC33_PREFILL_MSB, DAC33_THRREG(DAC33_MODE7_MARGIN)); /* Enable Upper Threshold IRQ */ - dac33_write(codec, DAC33_FIFO_IRQ_MASK, DAC33_MUT); + dac33_write(component, DAC33_FIFO_IRQ_MASK, DAC33_MUT); break; default: - dev_warn(codec->dev, "Unhandled FIFO mode: %d\n", + dev_warn(component->dev, "Unhandled FIFO mode: %d\n", dac33->fifo_mode); break; } @@ -704,7 +704,7 @@ static inline void dac33_prefill_handler(struct tlv320dac33_priv *dac33) static inline void dac33_playback_handler(struct tlv320dac33_priv *dac33) { - struct snd_soc_codec *codec = dac33->codec; + struct snd_soc_component *component = dac33->component; unsigned long flags; switch (dac33->fifo_mode) { @@ -714,14 +714,14 @@ static inline void dac33_playback_handler(struct tlv320dac33_priv *dac33) dac33->t_stamp2 = ktime_to_us(ktime_get()); spin_unlock_irqrestore(&dac33->lock, flags); - dac33_write16(codec, DAC33_NSAMPLE_MSB, + dac33_write16(component, DAC33_NSAMPLE_MSB, DAC33_THRREG(dac33->nsample)); break; case DAC33_FIFO_MODE7: /* At the moment we are not using interrupts in mode7 */ break; default: - dev_warn(codec->dev, "Unhandled FIFO mode: %d\n", + dev_warn(component->dev, "Unhandled FIFO mode: %d\n", dac33->fifo_mode); break; } @@ -729,12 +729,12 @@ static inline void dac33_playback_handler(struct tlv320dac33_priv *dac33) static void dac33_work(struct work_struct *work) { - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct tlv320dac33_priv *dac33; u8 reg; dac33 = container_of(work, struct tlv320dac33_priv, work); - codec = dac33->codec; + component = dac33->component; mutex_lock(&dac33->mutex); switch (dac33->state) { @@ -750,12 +750,12 @@ static void dac33_work(struct work_struct *work) case DAC33_FLUSH: dac33->state = DAC33_IDLE; /* Mask all interrupts from dac33 */ - dac33_write(codec, DAC33_FIFO_IRQ_MASK, 0); + dac33_write(component, DAC33_FIFO_IRQ_MASK, 0); /* flush fifo */ - reg = dac33_read_reg_cache(codec, DAC33_FIFO_CTRL_A); + reg = dac33_read_reg_cache(component, DAC33_FIFO_CTRL_A); reg |= DAC33_FIFOFLUSH; - dac33_write(codec, DAC33_FIFO_CTRL_A, reg); + dac33_write(component, DAC33_FIFO_CTRL_A, reg); break; } mutex_unlock(&dac33->mutex); @@ -763,8 +763,8 @@ static void dac33_work(struct work_struct *work) static irqreturn_t dac33_interrupt_handler(int irq, void *dev) { - struct snd_soc_codec *codec = dev; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dev; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); unsigned long flags; spin_lock_irqsave(&dac33->lock, flags); @@ -778,25 +778,25 @@ static irqreturn_t dac33_interrupt_handler(int irq, void *dev) return IRQ_HANDLED; } -static void dac33_oscwait(struct snd_soc_codec *codec) +static void dac33_oscwait(struct snd_soc_component *component) { int timeout = 60; u8 reg; do { usleep_range(1000, 2000); - dac33_read(codec, DAC33_INT_OSC_STATUS, ®); + dac33_read(component, DAC33_INT_OSC_STATUS, ®); } while (((reg & 0x03) != DAC33_OSCSTATUS_NORMAL) && timeout--); if ((reg & 0x03) != DAC33_OSCSTATUS_NORMAL) - dev_err(codec->dev, + dev_err(component->dev, "internal oscillator calibration failed\n"); } static int dac33_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); /* Stream started, save the substream pointer */ dac33->substream = substream; @@ -807,8 +807,8 @@ static int dac33_startup(struct snd_pcm_substream *substream, static void dac33_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); dac33->substream = NULL; } @@ -819,8 +819,8 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); /* Check parameters for validity */ switch (params_rate(params)) { @@ -828,7 +828,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, case 48000: break; default: - dev_err(codec->dev, "unsupported rate %d\n", + dev_err(component->dev, "unsupported rate %d\n", params_rate(params)); return -EINVAL; } @@ -843,7 +843,7 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, dac33->burst_rate = CALC_BURST_RATE(dac33->burst_bclkdiv, 64); break; default: - dev_err(codec->dev, "unsupported width %d\n", + dev_err(component->dev, "unsupported width %d\n", params_width(params)); return -EINVAL; } @@ -862,9 +862,9 @@ static int dac33_hw_params(struct snd_pcm_substream *substream, * Use the known, working sequence of register writes to initialize the dac33. */ static int dac33_prepare_chip(struct snd_pcm_substream *substream, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); unsigned int oscset, ratioset, pwr_ctrl, reg_tmp; u8 aictrl_a, aictrl_b, fifoctrl_a; @@ -876,16 +876,16 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, dac33->refclk); break; default: - dev_err(codec->dev, "unsupported rate %d\n", + dev_err(component->dev, "unsupported rate %d\n", substream->runtime->rate); return -EINVAL; } - aictrl_a = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_A); + aictrl_a = dac33_read_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_A); aictrl_a &= ~(DAC33_NCYCL_MASK | DAC33_WLEN_MASK); /* Read FIFO control A, and clear FIFO flush bit */ - fifoctrl_a = dac33_read_reg_cache(codec, DAC33_FIFO_CTRL_A); + fifoctrl_a = dac33_read_reg_cache(component, DAC33_FIFO_CTRL_A); fifoctrl_a &= ~DAC33_FIFOFLUSH; fifoctrl_a &= ~DAC33_WIDTH; @@ -898,7 +898,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, aictrl_a |= (DAC33_NCYCL_32 | DAC33_WLEN_24); break; default: - dev_err(codec->dev, "unsupported format %d\n", + dev_err(component->dev, "unsupported format %d\n", substream->runtime->format); return -EINVAL; } @@ -914,57 +914,57 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, return 0; } - dac33_soft_power(codec, 0); - dac33_soft_power(codec, 1); + dac33_soft_power(component, 0); + dac33_soft_power(component, 1); - reg_tmp = dac33_read_reg_cache(codec, DAC33_INT_OSC_CTRL); - dac33_write(codec, DAC33_INT_OSC_CTRL, reg_tmp); + reg_tmp = dac33_read_reg_cache(component, DAC33_INT_OSC_CTRL); + dac33_write(component, DAC33_INT_OSC_CTRL, reg_tmp); /* Write registers 0x08 and 0x09 (MSB, LSB) */ - dac33_write16(codec, DAC33_INT_OSC_FREQ_RAT_A, oscset); + dac33_write16(component, DAC33_INT_OSC_FREQ_RAT_A, oscset); /* OSC calibration time */ - dac33_write(codec, DAC33_CALIB_TIME, 96); + dac33_write(component, DAC33_CALIB_TIME, 96); /* adjustment treshold & step */ - dac33_write(codec, DAC33_INT_OSC_CTRL_B, DAC33_ADJTHRSHLD(2) | + dac33_write(component, DAC33_INT_OSC_CTRL_B, DAC33_ADJTHRSHLD(2) | DAC33_ADJSTEP(1)); /* div=4 / gain=1 / div */ - dac33_write(codec, DAC33_INT_OSC_CTRL_C, DAC33_REFDIV(4)); + dac33_write(component, DAC33_INT_OSC_CTRL_C, DAC33_REFDIV(4)); - pwr_ctrl = dac33_read_reg_cache(codec, DAC33_PWR_CTRL); + pwr_ctrl = dac33_read_reg_cache(component, DAC33_PWR_CTRL); pwr_ctrl |= DAC33_OSCPDNB | DAC33_DACRPDNB | DAC33_DACLPDNB; - dac33_write(codec, DAC33_PWR_CTRL, pwr_ctrl); + dac33_write(component, DAC33_PWR_CTRL, pwr_ctrl); - dac33_oscwait(codec); + dac33_oscwait(component); if (dac33->fifo_mode) { /* Generic for all FIFO modes */ /* 50-51 : ASRC Control registers */ - dac33_write(codec, DAC33_ASRC_CTRL_A, DAC33_SRCLKDIV(1)); - dac33_write(codec, DAC33_ASRC_CTRL_B, 1); /* ??? */ + dac33_write(component, DAC33_ASRC_CTRL_A, DAC33_SRCLKDIV(1)); + dac33_write(component, DAC33_ASRC_CTRL_B, 1); /* ??? */ /* Write registers 0x34 and 0x35 (MSB, LSB) */ - dac33_write16(codec, DAC33_SRC_REF_CLK_RATIO_A, ratioset); + dac33_write16(component, DAC33_SRC_REF_CLK_RATIO_A, ratioset); /* Set interrupts to high active */ - dac33_write(codec, DAC33_INTP_CTRL_A, DAC33_INTPM_AHIGH); + dac33_write(component, DAC33_INTP_CTRL_A, DAC33_INTPM_AHIGH); } else { /* FIFO bypass mode */ /* 50-51 : ASRC Control registers */ - dac33_write(codec, DAC33_ASRC_CTRL_A, DAC33_SRCBYP); - dac33_write(codec, DAC33_ASRC_CTRL_B, 0); /* ??? */ + dac33_write(component, DAC33_ASRC_CTRL_A, DAC33_SRCBYP); + dac33_write(component, DAC33_ASRC_CTRL_B, 0); /* ??? */ } /* Interrupt behaviour configuration */ switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: - dac33_write(codec, DAC33_FIFO_IRQ_MODE_B, + dac33_write(component, DAC33_FIFO_IRQ_MODE_B, DAC33_ATM(DAC33_FIFO_IRQ_MODE_LEVEL)); break; case DAC33_FIFO_MODE7: - dac33_write(codec, DAC33_FIFO_IRQ_MODE_A, + dac33_write(component, DAC33_FIFO_IRQ_MODE_A, DAC33_UTM(DAC33_FIFO_IRQ_MODE_LEVEL)); break; default: @@ -972,7 +972,7 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, break; } - aictrl_b = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B); + aictrl_b = dac33_read_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_B); switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: @@ -1014,9 +1014,9 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, break; } - dac33_write(codec, DAC33_FIFO_CTRL_A, fifoctrl_a); - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a); - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_B, aictrl_b); + dac33_write(component, DAC33_FIFO_CTRL_A, fifoctrl_a); + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a); + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_B, aictrl_b); /* * BCLK divide ratio @@ -1028,17 +1028,17 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, * 255: 255 */ if (dac33->fifo_mode) - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_C, dac33->burst_bclkdiv); else if (substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE) - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, 32); + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_C, 32); else - dac33_write(codec, DAC33_SER_AUDIOIF_CTRL_C, 16); + dac33_write(component, DAC33_SER_AUDIOIF_CTRL_C, 16); switch (dac33->fifo_mode) { case DAC33_FIFO_MODE1: - dac33_write16(codec, DAC33_ATHR_MSB, + dac33_write16(component, DAC33_ATHR_MSB, DAC33_THRREG(dac33->alarm_threshold)); break; case DAC33_FIFO_MODE7: @@ -1046,8 +1046,8 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, * Configure the threshold levels, and leave 10 sample space * at the bottom, and also at the top of the FIFO */ - dac33_write16(codec, DAC33_UTHR_MSB, DAC33_THRREG(dac33->uthr)); - dac33_write16(codec, DAC33_LTHR_MSB, + dac33_write16(component, DAC33_UTHR_MSB, DAC33_THRREG(dac33->uthr)); + dac33_write16(component, DAC33_LTHR_MSB, DAC33_THRREG(DAC33_MODE7_MARGIN)); break; default: @@ -1060,9 +1060,9 @@ static int dac33_prepare_chip(struct snd_pcm_substream *substream, } static void dac33_calculate_times(struct snd_pcm_substream *substream, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); unsigned int period_size = substream->runtime->period_size; unsigned int rate = substream->runtime->rate; unsigned int nsample_limit; @@ -1119,8 +1119,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream, static int dac33_pcm_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int ret = 0; switch (cmd) { @@ -1151,8 +1151,8 @@ static snd_pcm_sframes_t dac33_dai_delay( struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); unsigned long long t0, t1, t_now; unsigned int time_delta, uthr; int samples_out, samples_in, samples; @@ -1284,7 +1284,7 @@ static snd_pcm_sframes_t dac33_dai_delay( } break; default: - dev_warn(codec->dev, "Unhandled FIFO mode: %d\n", + dev_warn(component->dev, "Unhandled FIFO mode: %d\n", dac33->fifo_mode); break; } @@ -1295,12 +1295,12 @@ out: static int dac33_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 ioc_reg, asrcb_reg; - ioc_reg = dac33_read_reg_cache(codec, DAC33_INT_OSC_CTRL); - asrcb_reg = dac33_read_reg_cache(codec, DAC33_ASRC_CTRL_B); + ioc_reg = dac33_read_reg_cache(component, DAC33_INT_OSC_CTRL); + asrcb_reg = dac33_read_reg_cache(component, DAC33_ASRC_CTRL_B); switch (clk_id) { case TLV320DAC33_MCLK: ioc_reg |= DAC33_REFSEL; @@ -1311,13 +1311,13 @@ static int dac33_set_dai_sysclk(struct snd_soc_dai *codec_dai, asrcb_reg &= ~DAC33_SRCREFSEL; break; default: - dev_err(codec->dev, "Invalid clock ID (%d)\n", clk_id); + dev_err(component->dev, "Invalid clock ID (%d)\n", clk_id); break; } dac33->refclk = freq; - dac33_write_reg_cache(codec, DAC33_INT_OSC_CTRL, ioc_reg); - dac33_write_reg_cache(codec, DAC33_ASRC_CTRL_B, asrcb_reg); + dac33_write_reg_cache(component, DAC33_INT_OSC_CTRL, ioc_reg); + dac33_write_reg_cache(component, DAC33_ASRC_CTRL_B, asrcb_reg); return 0; } @@ -1325,12 +1325,12 @@ static int dac33_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); u8 aictrl_a, aictrl_b; - aictrl_a = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_A); - aictrl_b = dac33_read_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B); + aictrl_a = dac33_read_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_A); + aictrl_b = dac33_read_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_B); /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: @@ -1340,7 +1340,7 @@ static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai, case SND_SOC_DAIFMT_CBS_CFS: /* Codec Slave */ if (dac33->fifo_mode) { - dev_err(codec->dev, "FIFO mode requires master mode\n"); + dev_err(component->dev, "FIFO mode requires master mode\n"); return -EINVAL; } else aictrl_a &= ~(DAC33_MSBCLK | DAC33_MSWCLK); @@ -1366,35 +1366,35 @@ static int dac33_set_dai_fmt(struct snd_soc_dai *codec_dai, aictrl_a |= DAC33_AFMT_LEFT_J; break; default: - dev_err(codec->dev, "Unsupported format (%u)\n", + dev_err(component->dev, "Unsupported format (%u)\n", fmt & SND_SOC_DAIFMT_FORMAT_MASK); return -EINVAL; } - dac33_write_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a); - dac33_write_reg_cache(codec, DAC33_SER_AUDIOIF_CTRL_B, aictrl_b); + dac33_write_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_A, aictrl_a); + dac33_write_reg_cache(component, DAC33_SER_AUDIOIF_CTRL_B, aictrl_b); return 0; } -static int dac33_soc_probe(struct snd_soc_codec *codec) +static int dac33_soc_probe(struct snd_soc_component *component) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); int ret = 0; - dac33->codec = codec; + dac33->component = component; /* Read the tlv320dac33 ID registers */ - ret = dac33_hard_power(codec, 1); + ret = dac33_hard_power(component, 1); if (ret != 0) { - dev_err(codec->dev, "Failed to power up codec: %d\n", ret); + dev_err(component->dev, "Failed to power up component: %d\n", ret); goto err_power; } - ret = dac33_read_id(codec); - dac33_hard_power(codec, 0); + ret = dac33_read_id(component); + dac33_hard_power(component, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to read chip ID: %d\n", ret); + dev_err(component->dev, "Failed to read chip ID: %d\n", ret); ret = -ENODEV; goto err_power; } @@ -1403,9 +1403,9 @@ static int dac33_soc_probe(struct snd_soc_codec *codec) if (dac33->irq >= 0) { ret = request_irq(dac33->irq, dac33_interrupt_handler, IRQF_TRIGGER_RISING, - codec->component.name, codec); + component->name, component); if (ret < 0) { - dev_err(codec->dev, "Could not request IRQ%d (%d)\n", + dev_err(component->dev, "Could not request IRQ%d (%d)\n", dac33->irq, ret); dac33->irq = -1; } @@ -1416,41 +1416,38 @@ static int dac33_soc_probe(struct snd_soc_codec *codec) /* Only add the FIFO controls, if we have valid IRQ number */ if (dac33->irq >= 0) - snd_soc_add_codec_controls(codec, dac33_mode_snd_controls, + snd_soc_add_component_controls(component, dac33_mode_snd_controls, ARRAY_SIZE(dac33_mode_snd_controls)); err_power: return ret; } -static int dac33_soc_remove(struct snd_soc_codec *codec) +static void dac33_soc_remove(struct snd_soc_component *component) { - struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); + struct tlv320dac33_priv *dac33 = snd_soc_component_get_drvdata(component); if (dac33->irq >= 0) { - free_irq(dac33->irq, dac33->codec); + free_irq(dac33->irq, dac33->component); flush_work(&dac33->work); } - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_tlv320dac33 = { - .read = dac33_read_reg_cache, - .write = dac33_write_locked, - .set_bias_level = dac33_set_bias_level, - .idle_bias_off = true, - - .probe = dac33_soc_probe, - .remove = dac33_soc_remove, - - .component_driver = { - .controls = dac33_snd_controls, - .num_controls = ARRAY_SIZE(dac33_snd_controls), - .dapm_widgets = dac33_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(dac33_dapm_widgets), - .dapm_routes = audio_map, - .num_dapm_routes = ARRAY_SIZE(audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_tlv320dac33 = { + .read = dac33_read_reg_cache, + .write = dac33_write_locked, + .set_bias_level = dac33_set_bias_level, + .probe = dac33_soc_probe, + .remove = dac33_soc_remove, + .controls = dac33_snd_controls, + .num_controls = ARRAY_SIZE(dac33_snd_controls), + .dapm_widgets = dac33_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(dac33_dapm_widgets), + .dapm_routes = audio_map, + .num_dapm_routes = ARRAY_SIZE(audio_map), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; #define DAC33_RATES (SNDRV_PCM_RATE_44100 | \ @@ -1544,8 +1541,8 @@ static int dac33_i2c_probe(struct i2c_client *client, goto err_get; } - ret = snd_soc_register_codec(&client->dev, - &soc_codec_dev_tlv320dac33, &dac33_dai, 1); + ret = devm_snd_soc_register_component(&client->dev, + &soc_component_dev_tlv320dac33, &dac33_dai, 1); if (ret < 0) goto err_get; @@ -1562,12 +1559,11 @@ static int dac33_i2c_remove(struct i2c_client *client) struct tlv320dac33_priv *dac33 = i2c_get_clientdata(client); if (unlikely(dac33->chip_power)) - dac33_hard_power(dac33->codec, 0); + dac33_hard_power(dac33->component, 0); if (dac33->power_gpio >= 0) gpio_free(dac33->power_gpio); - snd_soc_unregister_codec(&client->dev); return 0; } diff --git a/sound/soc/codecs/tscs42xx.c b/sound/soc/codecs/tscs42xx.c index e7661d0315e6..bbfc73a79b18 100644 --- a/sound/soc/codecs/tscs42xx.c +++ b/sound/soc/codecs/tscs42xx.c @@ -3,14 +3,19 @@ // Copyright 2017 Tempo Semiconductor, Inc. // Author: Steven Eckhoff <steven.eckhoff.opensource@gmail.com> +#include <linux/kernel.h> +#include <linux/device.h> +#include <linux/regmap.h> #include <linux/i2c.h> +#include <linux/err.h> +#include <linux/string.h> #include <linux/module.h> +#include <linux/delay.h> #include <linux/mutex.h> -#include <linux/regmap.h> +#include <sound/tlv.h> #include <sound/pcm_params.h> #include <sound/soc.h> #include <sound/soc-dapm.h> -#include <sound/tlv.h> #include "tscs42xx.h" @@ -91,15 +96,15 @@ static const struct regmap_config tscs42xx_regmap = { }; #define MAX_PLL_LOCK_20MS_WAITS 1 -static bool plls_locked(struct snd_soc_codec *codec) +static bool plls_locked(struct snd_soc_component *component) { int ret; int count = MAX_PLL_LOCK_20MS_WAITS; do { - ret = snd_soc_read(codec, R_PLLCTL0); + ret = snd_soc_component_read32(component, R_PLLCTL0); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to read PLL lock status (%d)\n", ret); return false; } else if (ret > 0) { @@ -131,10 +136,10 @@ static int sample_rate_to_pll_freq_out(int sample_rate) } #define DACCRSTAT_MAX_TRYS 10 -static int write_coeff_ram(struct snd_soc_codec *codec, u8 *coeff_ram, +static int write_coeff_ram(struct snd_soc_component *component, u8 *coeff_ram, unsigned int addr, unsigned int coeff_cnt) { - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); int cnt; int trys; int ret; @@ -142,9 +147,9 @@ static int write_coeff_ram(struct snd_soc_codec *codec, u8 *coeff_ram, for (cnt = 0; cnt < coeff_cnt; cnt++, addr++) { for (trys = 0; trys < DACCRSTAT_MAX_TRYS; trys++) { - ret = snd_soc_read(codec, R_DACCRSTAT); + ret = snd_soc_component_read32(component, R_DACCRSTAT); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to read stat (%d)\n", ret); return ret; } @@ -154,14 +159,14 @@ static int write_coeff_ram(struct snd_soc_codec *codec, u8 *coeff_ram, if (trys == DACCRSTAT_MAX_TRYS) { ret = -EIO; - dev_err(codec->dev, + dev_err(component->dev, "dac coefficient write error (%d)\n", ret); return ret; } ret = regmap_write(tscs42xx->regmap, R_DACCRADDR, addr); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to write dac ram address (%d)\n", ret); return ret; } @@ -170,7 +175,7 @@ static int write_coeff_ram(struct snd_soc_codec *codec, u8 *coeff_ram, &coeff_ram[addr * COEFF_SIZE], COEFF_SIZE); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to write dac ram (%d)\n", ret); return ret; } @@ -179,9 +184,9 @@ static int write_coeff_ram(struct snd_soc_codec *codec, u8 *coeff_ram, return 0; } -static int power_up_audio_plls(struct snd_soc_codec *codec) +static int power_up_audio_plls(struct snd_soc_component *component) { - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); int freq_out; int ret; unsigned int mask; @@ -199,20 +204,20 @@ static int power_up_audio_plls(struct snd_soc_codec *codec) break; default: ret = -EINVAL; - dev_err(codec->dev, "Unrecognized PLL output freq (%d)\n", ret); + dev_err(component->dev, "Unrecognized PLL output freq (%d)\n", ret); return ret; } mutex_lock(&tscs42xx->pll_lock); - ret = snd_soc_update_bits(codec, R_PLLCTL1C, mask, val); + ret = snd_soc_component_update_bits(component, R_PLLCTL1C, mask, val); if (ret < 0) { - dev_err(codec->dev, "Failed to turn PLL on (%d)\n", ret); + dev_err(component->dev, "Failed to turn PLL on (%d)\n", ret); goto exit; } - if (!plls_locked(codec)) { - dev_err(codec->dev, "Failed to lock plls\n"); + if (!plls_locked(component)) { + dev_err(component->dev, "Failed to lock plls\n"); ret = -ENOMSG; goto exit; } @@ -224,25 +229,25 @@ exit: return ret; } -static int power_down_audio_plls(struct snd_soc_codec *codec) +static int power_down_audio_plls(struct snd_soc_component *component) { - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&tscs42xx->pll_lock); - ret = snd_soc_update_bits(codec, R_PLLCTL1C, + ret = snd_soc_component_update_bits(component, R_PLLCTL1C, RM_PLLCTL1C_PDB_PLL1, RV_PLLCTL1C_PDB_PLL1_DISABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to turn PLL off (%d)\n", ret); + dev_err(component->dev, "Failed to turn PLL off (%d)\n", ret); goto exit; } - ret = snd_soc_update_bits(codec, R_PLLCTL1C, + ret = snd_soc_component_update_bits(component, R_PLLCTL1C, RM_PLLCTL1C_PDB_PLL2, RV_PLLCTL1C_PDB_PLL2_DISABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to turn PLL off (%d)\n", ret); + dev_err(component->dev, "Failed to turn PLL off (%d)\n", ret); goto exit; } @@ -256,8 +261,8 @@ exit: static int coeff_ram_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); struct coeff_ram_ctl *ctl = (struct coeff_ram_ctl *)kcontrol->private_value; struct soc_bytes_ext *params = &ctl->bytes_ext; @@ -275,8 +280,8 @@ static int coeff_ram_get(struct snd_kcontrol *kcontrol, static int coeff_ram_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); struct coeff_ram_ctl *ctl = (struct coeff_ram_ctl *)kcontrol->private_value; struct soc_bytes_ext *params = &ctl->bytes_ext; @@ -292,11 +297,11 @@ static int coeff_ram_put(struct snd_kcontrol *kcontrol, mutex_lock(&tscs42xx->pll_lock); - if (plls_locked(codec)) { - ret = write_coeff_ram(codec, tscs42xx->coeff_ram, + if (plls_locked(component)) { + ret = write_coeff_ram(component, tscs42xx->coeff_ram, ctl->addr, coeff_cnt); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to flush coeff ram cache (%d)\n", ret); goto exit; } @@ -358,13 +363,13 @@ static int dapm_micb_event(struct snd_soc_dapm_widget *w, static int pll_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); int ret; if (SND_SOC_DAPM_EVENT_ON(event)) - ret = power_up_audio_plls(codec); + ret = power_up_audio_plls(component); else - ret = power_down_audio_plls(codec); + ret = power_down_audio_plls(component); return ret; } @@ -372,14 +377,14 @@ static int pll_event(struct snd_soc_dapm_widget *w, static int dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); int ret; mutex_lock(&tscs42xx->coeff_ram_lock); if (tscs42xx->coeff_ram_synced == false) { - ret = write_coeff_ram(codec, tscs42xx->coeff_ram, 0x00, + ret = write_coeff_ram(component, tscs42xx->coeff_ram, 0x00, COEFF_RAM_COEFF_COUNT); if (ret < 0) goto exit; @@ -790,7 +795,7 @@ static const struct snd_kcontrol_new tscs42xx_snd_controls[] = { R_DACMBCREL3L, 2), }; -static int setup_sample_format(struct snd_soc_codec *codec, +static int setup_sample_format(struct snd_soc_component *component, snd_pcm_format_t format) { unsigned int width; @@ -811,21 +816,21 @@ static int setup_sample_format(struct snd_soc_codec *codec, break; default: ret = -EINVAL; - dev_err(codec->dev, "Unsupported format width (%d)\n", ret); + dev_err(component->dev, "Unsupported format width (%d)\n", ret); return ret; } - ret = snd_soc_update_bits(codec, R_AIC1, RM_AIC1_WL, width); + ret = snd_soc_component_update_bits(component, R_AIC1, RM_AIC1_WL, width); if (ret < 0) { - dev_err(codec->dev, "Failed to set sample width (%d)\n", ret); + dev_err(component->dev, "Failed to set sample width (%d)\n", ret); return ret; } return 0; } -static int setup_sample_rate(struct snd_soc_codec *codec, unsigned int rate) +static int setup_sample_rate(struct snd_soc_component *component, unsigned int rate) { - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); unsigned int br, bm; int ret; @@ -871,29 +876,29 @@ static int setup_sample_rate(struct snd_soc_codec *codec, unsigned int rate) bm = RV_DACSR_DBM_2; break; default: - dev_err(codec->dev, "Unsupported sample rate %d\n", rate); + dev_err(component->dev, "Unsupported sample rate %d\n", rate); return -EINVAL; } /* DAC and ADC share bit and frame clock */ - ret = snd_soc_update_bits(codec, R_DACSR, RM_DACSR_DBR, br); + ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBR, br); if (ret < 0) { - dev_err(codec->dev, "Failed to update register (%d)\n", ret); + dev_err(component->dev, "Failed to update register (%d)\n", ret); return ret; } - ret = snd_soc_update_bits(codec, R_DACSR, RM_DACSR_DBM, bm); + ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBM, bm); if (ret < 0) { - dev_err(codec->dev, "Failed to update register (%d)\n", ret); + dev_err(component->dev, "Failed to update register (%d)\n", ret); return ret; } - ret = snd_soc_update_bits(codec, R_ADCSR, RM_DACSR_DBR, br); + ret = snd_soc_component_update_bits(component, R_ADCSR, RM_DACSR_DBR, br); if (ret < 0) { - dev_err(codec->dev, "Failed to update register (%d)\n", ret); + dev_err(component->dev, "Failed to update register (%d)\n", ret); return ret; } - ret = snd_soc_update_bits(codec, R_ADCSR, RM_DACSR_DBM, bm); + ret = snd_soc_component_update_bits(component, R_ADCSR, RM_DACSR_DBM, bm); if (ret < 0) { - dev_err(codec->dev, "Failed to update register (%d)\n", ret); + dev_err(component->dev, "Failed to update register (%d)\n", ret); return ret; } @@ -1025,7 +1030,7 @@ static const struct pll_ctl *get_pll_ctl(int input_freq) return pll_ctl; } -static int set_pll_ctl_from_input_freq(struct snd_soc_codec *codec, +static int set_pll_ctl_from_input_freq(struct snd_soc_component *component, const int input_freq) { int ret; @@ -1035,18 +1040,18 @@ static int set_pll_ctl_from_input_freq(struct snd_soc_codec *codec, pll_ctl = get_pll_ctl(input_freq); if (!pll_ctl) { ret = -EINVAL; - dev_err(codec->dev, "No PLL input entry for %d (%d)\n", + dev_err(component->dev, "No PLL input entry for %d (%d)\n", input_freq, ret); return ret; } for (i = 0; i < PLL_REG_SETTINGS_COUNT; ++i) { - ret = snd_soc_update_bits(codec, + ret = snd_soc_component_update_bits(component, pll_ctl->settings[i].addr, pll_ctl->settings[i].mask, pll_ctl->settings[i].val); if (ret < 0) { - dev_err(codec->dev, "Failed to set pll ctl (%d)\n", + dev_err(component->dev, "Failed to set pll ctl (%d)\n", ret); return ret; } @@ -1059,33 +1064,33 @@ static int tscs42xx_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *codec_dai) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int ret; - ret = setup_sample_format(codec, params_format(params)); + ret = setup_sample_format(component, params_format(params)); if (ret < 0) { - dev_err(codec->dev, "Failed to setup sample format (%d)\n", + dev_err(component->dev, "Failed to setup sample format (%d)\n", ret); return ret; } - ret = setup_sample_rate(codec, params_rate(params)); + ret = setup_sample_rate(component, params_rate(params)); if (ret < 0) { - dev_err(codec->dev, "Failed to setup sample rate (%d)\n", ret); + dev_err(component->dev, "Failed to setup sample rate (%d)\n", ret); return ret; } return 0; } -static inline int dac_mute(struct snd_soc_codec *codec) +static inline int dac_mute(struct snd_soc_component *component) { int ret; - ret = snd_soc_update_bits(codec, R_CNVRTR1, RM_CNVRTR1_DACMU, + ret = snd_soc_component_update_bits(component, R_CNVRTR1, RM_CNVRTR1_DACMU, RV_CNVRTR1_DACMU_ENABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to mute DAC (%d)\n", + dev_err(component->dev, "Failed to mute DAC (%d)\n", ret); return ret; } @@ -1093,14 +1098,14 @@ static inline int dac_mute(struct snd_soc_codec *codec) return 0; } -static inline int dac_unmute(struct snd_soc_codec *codec) +static inline int dac_unmute(struct snd_soc_component *component) { int ret; - ret = snd_soc_update_bits(codec, R_CNVRTR1, RM_CNVRTR1_DACMU, + ret = snd_soc_component_update_bits(component, R_CNVRTR1, RM_CNVRTR1_DACMU, RV_CNVRTR1_DACMU_DISABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to unmute DAC (%d)\n", + dev_err(component->dev, "Failed to unmute DAC (%d)\n", ret); return ret; } @@ -1108,14 +1113,14 @@ static inline int dac_unmute(struct snd_soc_codec *codec) return 0; } -static inline int adc_mute(struct snd_soc_codec *codec) +static inline int adc_mute(struct snd_soc_component *component) { int ret; - ret = snd_soc_update_bits(codec, R_CNVRTR0, RM_CNVRTR0_ADCMU, + ret = snd_soc_component_update_bits(component, R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_ENABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to mute ADC (%d)\n", + dev_err(component->dev, "Failed to mute ADC (%d)\n", ret); return ret; } @@ -1123,14 +1128,14 @@ static inline int adc_mute(struct snd_soc_codec *codec) return 0; } -static inline int adc_unmute(struct snd_soc_codec *codec) +static inline int adc_unmute(struct snd_soc_component *component) { int ret; - ret = snd_soc_update_bits(codec, R_CNVRTR0, RM_CNVRTR0_ADCMU, + ret = snd_soc_component_update_bits(component, R_CNVRTR0, RM_CNVRTR0_ADCMU, RV_CNVRTR0_ADCMU_DISABLE); if (ret < 0) { - dev_err(codec->dev, "Failed to unmute ADC (%d)\n", + dev_err(component->dev, "Failed to unmute ADC (%d)\n", ret); return ret; } @@ -1140,19 +1145,19 @@ static inline int adc_unmute(struct snd_soc_codec *codec) static int tscs42xx_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int ret; if (mute) if (stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = dac_mute(codec); + ret = dac_mute(component); else - ret = adc_mute(codec); + ret = adc_mute(component); else if (stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = dac_unmute(codec); + ret = dac_unmute(component); else - ret = adc_unmute(codec); + ret = adc_unmute(component); return ret; } @@ -1160,23 +1165,23 @@ static int tscs42xx_mute_stream(struct snd_soc_dai *dai, int mute, int stream) static int tscs42xx_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int ret; /* Slave mode not supported since it needs always-on frame clock */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: - ret = snd_soc_update_bits(codec, R_AIC1, RM_AIC1_MS, + ret = snd_soc_component_update_bits(component, R_AIC1, RM_AIC1_MS, RV_AIC1_MS_MASTER); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set codec DAI master (%d)\n", ret); return ret; } break; default: ret = -EINVAL; - dev_err(codec->dev, "Unsupported format (%d)\n", ret); + dev_err(component->dev, "Unsupported format (%d)\n", ret); return ret; } @@ -1186,8 +1191,8 @@ static int tscs42xx_set_dai_fmt(struct snd_soc_dai *codec_dai, static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai, unsigned int ratio) { - struct snd_soc_codec *codec = codec_dai->codec; - struct tscs42xx *tscs42xx = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct tscs42xx *tscs42xx = snd_soc_component_get_drvdata(component); unsigned int value; int ret = 0; @@ -1202,18 +1207,18 @@ static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai, value = RV_DACSR_DBCM_64; break; default: - dev_err(codec->dev, "Unsupported bclk ratio (%d)\n", ret); + dev_err(component->dev, "Unsupported bclk ratio (%d)\n", ret); return -EINVAL; } - ret = snd_soc_update_bits(codec, R_DACSR, RM_DACSR_DBCM, value); + ret = snd_soc_component_update_bits(component, R_DACSR, RM_DACSR_DBCM, value); if (ret < 0) { - dev_err(codec->dev, "Failed to set DAC BCLK ratio (%d)\n", ret); + dev_err(component->dev, "Failed to set DAC BCLK ratio (%d)\n", ret); return ret; } - ret = snd_soc_update_bits(codec, R_ADCSR, RM_ADCSR_ABCM, value); + ret = snd_soc_component_update_bits(component, R_ADCSR, RM_ADCSR_ABCM, value); if (ret < 0) { - dev_err(codec->dev, "Failed to set ADC BCLK ratio (%d)\n", ret); + dev_err(component->dev, "Failed to set ADC BCLK ratio (%d)\n", ret); return ret; } @@ -1229,40 +1234,40 @@ static int tscs42xx_set_dai_bclk_ratio(struct snd_soc_dai *codec_dai, static int tscs42xx_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int ret; switch (clk_id) { case TSCS42XX_PLL_SRC_XTAL: case TSCS42XX_PLL_SRC_MCLK1: - ret = snd_soc_write(codec, R_PLLREFSEL, + ret = snd_soc_component_write(component, R_PLLREFSEL, RV_PLLREFSEL_PLL1_REF_SEL_XTAL_MCLK1 | RV_PLLREFSEL_PLL2_REF_SEL_XTAL_MCLK1); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set pll reference input (%d)\n", ret); return ret; } break; case TSCS42XX_PLL_SRC_MCLK2: - ret = snd_soc_write(codec, R_PLLREFSEL, + ret = snd_soc_component_write(component, R_PLLREFSEL, RV_PLLREFSEL_PLL1_REF_SEL_MCLK2 | RV_PLLREFSEL_PLL2_REF_SEL_MCLK2); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to set PLL reference (%d)\n", ret); return ret; } break; default: - dev_err(codec->dev, "pll src is unsupported\n"); + dev_err(component->dev, "pll src is unsupported\n"); return -EINVAL; } - ret = set_pll_ctl_from_input_freq(codec, freq); + ret = set_pll_ctl_from_input_freq(component, freq); if (ret < 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to setup PLL input freq (%d)\n", ret); return ret; } @@ -1304,24 +1309,28 @@ static int part_is_valid(struct tscs42xx *tscs42xx) }; } -static struct snd_soc_codec_driver soc_codec_dev_tscs42xx = { - .component_driver = { - .dapm_widgets = tscs42xx_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(tscs42xx_dapm_widgets), - .dapm_routes = tscs42xx_intercon, - .num_dapm_routes = ARRAY_SIZE(tscs42xx_intercon), - .controls = tscs42xx_snd_controls, - .num_controls = ARRAY_SIZE(tscs42xx_snd_controls), - }, +static struct snd_soc_component_driver soc_codec_dev_tscs42xx = { + .dapm_widgets = tscs42xx_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(tscs42xx_dapm_widgets), + .dapm_routes = tscs42xx_intercon, + .num_dapm_routes = ARRAY_SIZE(tscs42xx_intercon), + .controls = tscs42xx_snd_controls, + .num_controls = ARRAY_SIZE(tscs42xx_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static inline void init_coeff_ram_cache(struct tscs42xx *tscs42xx) { - const u8 norm_addrs[] = { 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19, 0x1f, - 0x20, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3f, 0x40, 0x45, 0x4a, - 0x4f, 0x54, 0x59, 0x5f, 0x60, 0x65, 0x6a, 0x6f, 0x74, 0x79, - 0x7f, 0x80, 0x85, 0x8c, 0x91, 0x96, 0x97, 0x9c, 0xa3, 0xa8, - 0xad, 0xaf, 0xb0, 0xb5, 0xba, 0xbf, 0xc4, 0xc9, }; + static const u8 norm_addrs[] = { + 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19, 0x1f, 0x20, 0x25, 0x2a, + 0x2f, 0x34, 0x39, 0x3f, 0x40, 0x45, 0x4a, 0x4f, 0x54, 0x59, + 0x5f, 0x60, 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7f, 0x80, 0x85, + 0x8c, 0x91, 0x96, 0x97, 0x9c, 0xa3, 0xa8, 0xad, 0xaf, 0xb0, + 0xb5, 0xba, 0xbf, 0xc4, 0xc9, + }; u8 *coeff_ram = tscs42xx->coeff_ram; int i; @@ -1407,7 +1416,7 @@ static int tscs42xx_i2c_probe(struct i2c_client *i2c, mutex_init(&tscs42xx->coeff_ram_lock); mutex_init(&tscs42xx->pll_lock); - ret = snd_soc_register_codec(tscs42xx->dev, &soc_codec_dev_tscs42xx, + ret = devm_snd_soc_register_component(tscs42xx->dev, &soc_codec_dev_tscs42xx, &tscs42xx_dai, 1); if (ret) { dev_err(tscs42xx->dev, "Failed to register codec (%d)\n", ret); @@ -1417,13 +1426,6 @@ static int tscs42xx_i2c_probe(struct i2c_client *i2c, return 0; } -static int tscs42xx_i2c_remove(struct i2c_client *client) -{ - snd_soc_unregister_codec(&client->dev); - - return 0; -} - static const struct i2c_device_id tscs42xx_i2c_id[] = { { "tscs42A1", 0 }, { "tscs42A2", 0 }, @@ -1441,11 +1443,9 @@ MODULE_DEVICE_TABLE(of, tscs42xx_of_match); static struct i2c_driver tscs42xx_i2c_driver = { .driver = { .name = "tscs42xx", - .owner = THIS_MODULE, .of_match_table = tscs42xx_of_match, }, .probe = tscs42xx_i2c_probe, - .remove = tscs42xx_i2c_remove, .id_table = tscs42xx_i2c_id, }; diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index e4d7f397d361..25b752caf95e 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -86,9 +86,9 @@ static void tw4030_init_ctl_cache(struct twl4030_priv *twl4030) } } -static unsigned int twl4030_read(struct snd_soc_codec *codec, unsigned int reg) +static unsigned int twl4030_read(struct snd_soc_component *component, unsigned int reg) { - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 value = 0; if (reg >= TWL4030_CACHEREGNUM) @@ -151,10 +151,10 @@ static bool twl4030_can_write_to_chip(struct twl4030_priv *twl4030, return write_to_reg; } -static int twl4030_write(struct snd_soc_codec *codec, unsigned int reg, +static int twl4030_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); /* Update the ctl cache */ switch (reg) { @@ -186,9 +186,9 @@ static inline void twl4030_wait_ms(int time) } } -static void twl4030_codec_enable(struct snd_soc_codec *codec, int enable) +static void twl4030_codec_enable(struct snd_soc_component *component, int enable) { - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); int mode; if (enable == twl4030->codec_powered) @@ -227,16 +227,16 @@ static void twl4030_setup_pdata_of(struct twl4030_codec_data *pdata, pdata->hs_extmute = 1; } -static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec) +static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_component *component) { - struct twl4030_codec_data *pdata = dev_get_platdata(codec->dev); + struct twl4030_codec_data *pdata = dev_get_platdata(component->dev); struct device_node *twl4030_codec_node = NULL; - twl4030_codec_node = of_get_child_by_name(codec->dev->parent->of_node, + twl4030_codec_node = of_get_child_by_name(component->dev->parent->of_node, "codec"); if (!pdata && twl4030_codec_node) { - pdata = devm_kzalloc(codec->dev, + pdata = devm_kzalloc(component->dev, sizeof(struct twl4030_codec_data), GFP_KERNEL); if (!pdata) { @@ -250,28 +250,28 @@ static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec) return pdata; } -static void twl4030_init_chip(struct snd_soc_codec *codec) +static void twl4030_init_chip(struct snd_soc_component *component) { struct twl4030_codec_data *pdata; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 reg, byte; int i = 0; - pdata = twl4030_get_pdata(codec); + pdata = twl4030_get_pdata(component); if (pdata && pdata->hs_extmute) { if (gpio_is_valid(pdata->hs_extmute_gpio)) { int ret; if (!pdata->hs_extmute_gpio) - dev_warn(codec->dev, + dev_warn(component->dev, "Extmute GPIO is 0 is this correct?\n"); ret = gpio_request_one(pdata->hs_extmute_gpio, GPIOF_OUT_INIT_LOW, "hs_extmute"); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to get hs_extmute GPIO\n"); pdata->hs_extmute_gpio = -1; } @@ -292,16 +292,16 @@ static void twl4030_init_chip(struct snd_soc_codec *codec) tw4030_init_ctl_cache(twl4030); /* anti-pop when changing analog gain */ - reg = twl4030_read(codec, TWL4030_REG_MISC_SET_1); - twl4030_write(codec, TWL4030_REG_MISC_SET_1, + reg = twl4030_read(component, TWL4030_REG_MISC_SET_1); + twl4030_write(component, TWL4030_REG_MISC_SET_1, reg | TWL4030_SMOOTH_ANAVOL_EN); - twl4030_write(codec, TWL4030_REG_OPTION, + twl4030_write(component, TWL4030_REG_OPTION, TWL4030_ATXL1_EN | TWL4030_ATXR1_EN | TWL4030_ARXL2_EN | TWL4030_ARXR2_EN); /* REG_ARXR2_APGA_CTL reset according to the TRM: 0dB, DA_EN */ - twl4030_write(codec, TWL4030_REG_ARXR2_APGA_CTL, 0x32); + twl4030_write(component, TWL4030_REG_ARXR2_APGA_CTL, 0x32); /* Machine dependent setup */ if (!pdata) @@ -309,18 +309,18 @@ static void twl4030_init_chip(struct snd_soc_codec *codec) twl4030->pdata = pdata; - reg = twl4030_read(codec, TWL4030_REG_HS_POPN_SET); + reg = twl4030_read(component, TWL4030_REG_HS_POPN_SET); reg &= ~TWL4030_RAMP_DELAY; reg |= (pdata->ramp_delay_value << 2); - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, reg); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, reg); /* initiate offset cancellation */ - twl4030_codec_enable(codec, 1); + twl4030_codec_enable(component, 1); - reg = twl4030_read(codec, TWL4030_REG_ANAMICL); + reg = twl4030_read(component, TWL4030_REG_ANAMICL); reg &= ~TWL4030_OFFSET_CNCL_SEL; reg |= pdata->offset_cncl_path; - twl4030_write(codec, TWL4030_REG_ANAMICL, + twl4030_write(component, TWL4030_REG_ANAMICL, reg | TWL4030_CNCL_OFFSET_START); /* @@ -339,12 +339,12 @@ static void twl4030_init_chip(struct snd_soc_codec *codec) ((byte & TWL4030_CNCL_OFFSET_START) == TWL4030_CNCL_OFFSET_START)); - twl4030_codec_enable(codec, 0); + twl4030_codec_enable(component, 0); } -static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable) +static void twl4030_apll_enable(struct snd_soc_component *component, int enable) { - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); if (enable) { twl4030->apll_enabled++; @@ -567,13 +567,13 @@ static const struct snd_kcontrol_new twl4030_dapm_dbypassv_control = static int pin_name##pga_event(struct snd_soc_dapm_widget *w, \ struct snd_kcontrol *kcontrol, int event) \ { \ - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); \ - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); \ + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); \ + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); \ \ switch (event) { \ case SND_SOC_DAPM_POST_PMU: \ twl4030->pin_name##_enabled = 1; \ - twl4030_write(codec, reg, twl4030_read(codec, reg)); \ + twl4030_write(component, reg, twl4030_read(component, reg)); \ break; \ case SND_SOC_DAPM_POST_PMD: \ twl4030->pin_name##_enabled = 0; \ @@ -589,47 +589,47 @@ TWL4030_OUTPUT_PGA(predriver, TWL4030_REG_PREDR_CTL, TWL4030_PREDR_GAIN); TWL4030_OUTPUT_PGA(carkitl, TWL4030_REG_PRECKL_CTL, TWL4030_PRECKL_GAIN); TWL4030_OUTPUT_PGA(carkitr, TWL4030_REG_PRECKR_CTL, TWL4030_PRECKR_GAIN); -static void handsfree_ramp(struct snd_soc_codec *codec, int reg, int ramp) +static void handsfree_ramp(struct snd_soc_component *component, int reg, int ramp) { unsigned char hs_ctl; - hs_ctl = twl4030_read(codec, reg); + hs_ctl = twl4030_read(component, reg); if (ramp) { /* HF ramp-up */ hs_ctl |= TWL4030_HF_CTL_REF_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); udelay(10); hs_ctl |= TWL4030_HF_CTL_RAMP_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); udelay(40); hs_ctl |= TWL4030_HF_CTL_LOOP_EN; hs_ctl |= TWL4030_HF_CTL_HB_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); } else { /* HF ramp-down */ hs_ctl &= ~TWL4030_HF_CTL_LOOP_EN; hs_ctl &= ~TWL4030_HF_CTL_HB_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); hs_ctl &= ~TWL4030_HF_CTL_RAMP_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); udelay(40); hs_ctl &= ~TWL4030_HF_CTL_REF_EN; - twl4030_write(codec, reg, hs_ctl); + twl4030_write(component, reg, hs_ctl); } } static int handsfreelpga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - handsfree_ramp(codec, TWL4030_REG_HFL_CTL, 1); + handsfree_ramp(component, TWL4030_REG_HFL_CTL, 1); break; case SND_SOC_DAPM_POST_PMD: - handsfree_ramp(codec, TWL4030_REG_HFL_CTL, 0); + handsfree_ramp(component, TWL4030_REG_HFL_CTL, 0); break; } return 0; @@ -638,14 +638,14 @@ static int handsfreelpga_event(struct snd_soc_dapm_widget *w, static int handsfreerpga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_POST_PMU: - handsfree_ramp(codec, TWL4030_REG_HFR_CTL, 1); + handsfree_ramp(component, TWL4030_REG_HFR_CTL, 1); break; case SND_SOC_DAPM_POST_PMD: - handsfree_ramp(codec, TWL4030_REG_HFR_CTL, 0); + handsfree_ramp(component, TWL4030_REG_HFR_CTL, 0); break; } return 0; @@ -654,23 +654,23 @@ static int handsfreerpga_event(struct snd_soc_dapm_widget *w, static int vibramux_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - twl4030_write(codec, TWL4030_REG_VIBRA_SET, 0xff); + twl4030_write(component, TWL4030_REG_VIBRA_SET, 0xff); return 0; } static int apll_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); switch (event) { case SND_SOC_DAPM_PRE_PMU: - twl4030_apll_enable(codec, 1); + twl4030_apll_enable(component, 1); break; case SND_SOC_DAPM_POST_PMD: - twl4030_apll_enable(codec, 0); + twl4030_apll_enable(component, 0); break; } return 0; @@ -679,41 +679,41 @@ static int apll_event(struct snd_soc_dapm_widget *w, static int aif_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); u8 audio_if; - audio_if = twl4030_read(codec, TWL4030_REG_AUDIO_IF); + audio_if = twl4030_read(component, TWL4030_REG_AUDIO_IF); switch (event) { case SND_SOC_DAPM_PRE_PMU: /* Enable AIF */ /* enable the PLL before we use it to clock the DAI */ - twl4030_apll_enable(codec, 1); + twl4030_apll_enable(component, 1); - twl4030_write(codec, TWL4030_REG_AUDIO_IF, + twl4030_write(component, TWL4030_REG_AUDIO_IF, audio_if | TWL4030_AIF_EN); break; case SND_SOC_DAPM_POST_PMD: /* disable the DAI before we stop it's source PLL */ - twl4030_write(codec, TWL4030_REG_AUDIO_IF, + twl4030_write(component, TWL4030_REG_AUDIO_IF, audio_if & ~TWL4030_AIF_EN); - twl4030_apll_enable(codec, 0); + twl4030_apll_enable(component, 0); break; } return 0; } -static void headset_ramp(struct snd_soc_codec *codec, int ramp) +static void headset_ramp(struct snd_soc_component *component, int ramp) { unsigned char hs_gain, hs_pop; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); struct twl4030_codec_data *pdata = twl4030->pdata; /* Base values for ramp delay calculation: 2^19 - 2^26 */ unsigned int ramp_base[] = {524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864}; unsigned int delay; - hs_gain = twl4030_read(codec, TWL4030_REG_HS_GAIN_SET); - hs_pop = twl4030_read(codec, TWL4030_REG_HS_POPN_SET); + hs_gain = twl4030_read(component, TWL4030_REG_HS_GAIN_SET); + hs_pop = twl4030_read(component, TWL4030_REG_HS_POPN_SET); delay = (ramp_base[(hs_pop & TWL4030_RAMP_DELAY) >> 2] / twl4030->sysclk) + 1; @@ -724,26 +724,26 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) gpio_set_value(pdata->hs_extmute_gpio, 1); } else { hs_pop |= TWL4030_EXTMUTE; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); } } if (ramp) { /* Headset ramp-up according to the TRM */ hs_pop |= TWL4030_VMID_EN; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); /* Actually write to the register */ twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, hs_gain, TWL4030_REG_HS_GAIN_SET); hs_pop |= TWL4030_RAMP_EN; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); /* Wait ramp delay time + 1, so the VMID can settle */ twl4030_wait_ms(delay); } else { /* Headset ramp-down _not_ according to * the TRM, but in a way that it is working */ hs_pop &= ~TWL4030_RAMP_EN; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); /* Wait ramp delay time + 1, so the VMID can settle */ twl4030_wait_ms(delay); /* Bypass the reg_cache to mute the headset */ @@ -751,7 +751,7 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) TWL4030_REG_HS_GAIN_SET); hs_pop &= ~TWL4030_VMID_EN; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); } /* Disable external mute */ @@ -760,7 +760,7 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) gpio_set_value(pdata->hs_extmute_gpio, 0); } else { hs_pop &= ~TWL4030_EXTMUTE; - twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop); + twl4030_write(component, TWL4030_REG_HS_POPN_SET, hs_pop); } } } @@ -768,21 +768,21 @@ static void headset_ramp(struct snd_soc_codec *codec, int ramp) static int headsetlpga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: /* Do the ramp-up only once */ if (!twl4030->hsr_enabled) - headset_ramp(codec, 1); + headset_ramp(component, 1); twl4030->hsl_enabled = 1; break; case SND_SOC_DAPM_POST_PMD: /* Do the ramp-down only if both headsetL/R is disabled */ if (!twl4030->hsr_enabled) - headset_ramp(codec, 0); + headset_ramp(component, 0); twl4030->hsl_enabled = 0; break; @@ -793,21 +793,21 @@ static int headsetlpga_event(struct snd_soc_dapm_widget *w, static int headsetrpga_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); switch (event) { case SND_SOC_DAPM_POST_PMU: /* Do the ramp-up only once */ if (!twl4030->hsl_enabled) - headset_ramp(codec, 1); + headset_ramp(component, 1); twl4030->hsr_enabled = 1; break; case SND_SOC_DAPM_POST_PMD: /* Do the ramp-down only if both headsetL/R is disabled */ if (!twl4030->hsl_enabled) - headset_ramp(codec, 0); + headset_ramp(component, 0); twl4030->hsr_enabled = 0; break; @@ -818,8 +818,8 @@ static int headsetrpga_event(struct snd_soc_dapm_widget *w, static int digimic_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); struct twl4030_codec_data *pdata = twl4030->pdata; if (pdata && pdata->digimic_delay) @@ -842,7 +842,7 @@ static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int shift = mc->shift; unsigned int rshift = mc->rshift; @@ -850,14 +850,14 @@ static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol, int mask = (1 << fls(max)) - 1; ucontrol->value.integer.value[0] = - (twl4030_read(codec, reg) >> shift) & mask; + (twl4030_read(component, reg) >> shift) & mask; if (ucontrol->value.integer.value[0]) ucontrol->value.integer.value[0] = max + 1 - ucontrol->value.integer.value[0]; if (shift != rshift) { ucontrol->value.integer.value[1] = - (twl4030_read(codec, reg) >> rshift) & mask; + (twl4030_read(component, reg) >> rshift) & mask; if (ucontrol->value.integer.value[1]) ucontrol->value.integer.value[1] = max + 1 - ucontrol->value.integer.value[1]; @@ -871,7 +871,7 @@ static int snd_soc_put_volsw_twl4030(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int shift = mc->shift; unsigned int rshift = mc->rshift; @@ -892,7 +892,7 @@ static int snd_soc_put_volsw_twl4030(struct snd_kcontrol *kcontrol, val2 = max + 1 - val2; val |= val2 << rshift; } - return snd_soc_update_bits(codec, reg, val_mask, val); + return snd_soc_component_update_bits(component, reg, val_mask, val); } static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, @@ -900,7 +900,7 @@ static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; unsigned int shift = mc->shift; @@ -908,9 +908,9 @@ static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, int mask = (1<<fls(max))-1; ucontrol->value.integer.value[0] = - (twl4030_read(codec, reg) >> shift) & mask; + (twl4030_read(component, reg) >> shift) & mask; ucontrol->value.integer.value[1] = - (twl4030_read(codec, reg2) >> shift) & mask; + (twl4030_read(component, reg2) >> shift) & mask; if (ucontrol->value.integer.value[0]) ucontrol->value.integer.value[0] = @@ -927,7 +927,7 @@ static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); unsigned int reg = mc->reg; unsigned int reg2 = mc->rreg; unsigned int shift = mc->shift; @@ -948,11 +948,11 @@ static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, val = val << shift; val2 = val2 << shift; - err = snd_soc_update_bits(codec, reg, val_mask, val); + err = snd_soc_component_update_bits(component, reg, val_mask, val); if (err < 0) return err; - err = snd_soc_update_bits(codec, reg2, val_mask, val2); + err = snd_soc_component_update_bits(component, reg2, val_mask, val2); return err; } @@ -968,11 +968,11 @@ static SOC_ENUM_SINGLE_DECL(twl4030_op_modes_enum, static int snd_soc_put_twl4030_opmode_enum_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); if (twl4030->configured) { - dev_err(codec->dev, + dev_err(component->dev, "operation mode cannot be changed on-the-fly\n"); return -EBUSY; } @@ -1579,7 +1579,7 @@ static const struct snd_soc_dapm_route intercon[] = { }; -static int twl4030_set_bias_level(struct snd_soc_codec *codec, +static int twl4030_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { @@ -1588,11 +1588,11 @@ static int twl4030_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) - twl4030_codec_enable(codec, 1); + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) + twl4030_codec_enable(component, 1); break; case SND_SOC_BIAS_OFF: - twl4030_codec_enable(codec, 0); + twl4030_codec_enable(component, 0); break; } @@ -1628,12 +1628,12 @@ static void twl4030_constraints(struct twl4030_priv *twl4030, /* In case of 4 channel mode, the RX1 L/R for playback and the TX2 L/R for * capture has to be enabled/disabled. */ -static void twl4030_tdm_enable(struct snd_soc_codec *codec, int direction, +static void twl4030_tdm_enable(struct snd_soc_component *component, int direction, int enable) { u8 reg, mask; - reg = twl4030_read(codec, TWL4030_REG_OPTION); + reg = twl4030_read(component, TWL4030_REG_OPTION); if (direction == SNDRV_PCM_STREAM_PLAYBACK) mask = TWL4030_ARXL1_VRX_EN | TWL4030_ARXR1_EN; @@ -1645,14 +1645,14 @@ static void twl4030_tdm_enable(struct snd_soc_codec *codec, int direction, else reg &= ~mask; - twl4030_write(codec, TWL4030_REG_OPTION, reg); + twl4030_write(component, TWL4030_REG_OPTION, reg); } static int twl4030_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); if (twl4030->master_substream) { twl4030->slave_substream = substream; @@ -1662,7 +1662,7 @@ static int twl4030_startup(struct snd_pcm_substream *substream, if (twl4030->configured) twl4030_constraints(twl4030, twl4030->master_substream); } else { - if (!(twl4030_read(codec, TWL4030_REG_CODEC_MODE) & + if (!(twl4030_read(component, TWL4030_REG_CODEC_MODE) & TWL4030_OPTION_1)) { /* In option2 4 channel is not supported, set the * constraint for the first stream for channels, the @@ -1680,8 +1680,8 @@ static int twl4030_startup(struct snd_pcm_substream *substream, static void twl4030_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); if (twl4030->master_substream == substream) twl4030->master_substream = twl4030->slave_substream; @@ -1697,27 +1697,27 @@ static void twl4030_shutdown(struct snd_pcm_substream *substream, /* If the closing substream had 4 channel, do the necessary cleanup */ if (substream->runtime->channels == 4) - twl4030_tdm_enable(codec, substream->stream, 0); + twl4030_tdm_enable(component, substream->stream, 0); } static int twl4030_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 mode, old_mode, format, old_format; /* If the substream has 4 channel, do the necessary setup */ if (params_channels(params) == 4) { - format = twl4030_read(codec, TWL4030_REG_AUDIO_IF); - mode = twl4030_read(codec, TWL4030_REG_CODEC_MODE); + format = twl4030_read(component, TWL4030_REG_AUDIO_IF); + mode = twl4030_read(component, TWL4030_REG_CODEC_MODE); /* Safety check: are we in the correct operating mode and * the interface is in TDM mode? */ if ((mode & TWL4030_OPTION_1) && ((format & TWL4030_AIF_FORMAT) == TWL4030_AIF_FORMAT_TDM)) - twl4030_tdm_enable(codec, substream->stream, 1); + twl4030_tdm_enable(component, substream->stream, 1); else return -EINVAL; } @@ -1727,7 +1727,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, return 0; /* bit rate */ - old_mode = twl4030_read(codec, + old_mode = twl4030_read(component, TWL4030_REG_CODEC_MODE) & ~TWL4030_CODECPDZ; mode = old_mode & ~TWL4030_APLL_RATE; @@ -1763,13 +1763,13 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, mode |= TWL4030_APLL_RATE_96000; break; default: - dev_err(codec->dev, "%s: unknown rate %d\n", __func__, + dev_err(component->dev, "%s: unknown rate %d\n", __func__, params_rate(params)); return -EINVAL; } /* sample size */ - old_format = twl4030_read(codec, TWL4030_REG_AUDIO_IF); + old_format = twl4030_read(component, TWL4030_REG_AUDIO_IF); format = old_format; format &= ~TWL4030_DATA_WIDTH; switch (params_width(params)) { @@ -1780,7 +1780,7 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, format |= TWL4030_DATA_WIDTH_32S_24W; break; default: - dev_err(codec->dev, "%s: unsupported bits/sample %d\n", + dev_err(component->dev, "%s: unsupported bits/sample %d\n", __func__, params_width(params)); return -EINVAL; } @@ -1791,13 +1791,13 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, * If the codec is powered, than we need to toggle the * codec power. */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); - twl4030_codec_enable(codec, 1); + twl4030_codec_enable(component, 0); + twl4030_write(component, TWL4030_REG_CODEC_MODE, mode); + twl4030_write(component, TWL4030_REG_AUDIO_IF, format); + twl4030_codec_enable(component, 1); } else { - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + twl4030_write(component, TWL4030_REG_CODEC_MODE, mode); + twl4030_write(component, TWL4030_REG_AUDIO_IF, format); } } @@ -1821,8 +1821,8 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream, static int twl4030_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); switch (freq) { case 19200000: @@ -1830,12 +1830,12 @@ static int twl4030_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, case 38400000: break; default: - dev_err(codec->dev, "Unsupported HFCLKIN: %u\n", freq); + dev_err(component->dev, "Unsupported HFCLKIN: %u\n", freq); return -EINVAL; } if ((freq / 1000) != twl4030->sysclk) { - dev_err(codec->dev, + dev_err(component->dev, "Mismatch in HFCLKIN: %u (configured: %u)\n", freq, twl4030->sysclk * 1000); return -EINVAL; @@ -1846,12 +1846,12 @@ static int twl4030_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 old_format, format; /* get format */ - old_format = twl4030_read(codec, TWL4030_REG_AUDIO_IF); + old_format = twl4030_read(component, TWL4030_REG_AUDIO_IF); format = old_format; /* set master/slave audio interface */ @@ -1887,11 +1887,11 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) * If the codec is powered, than we need to toggle the * codec power. */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); - twl4030_codec_enable(codec, 1); + twl4030_codec_enable(component, 0); + twl4030_write(component, TWL4030_REG_AUDIO_IF, format); + twl4030_codec_enable(component, 1); } else { - twl4030_write(codec, TWL4030_REG_AUDIO_IF, format); + twl4030_write(component, TWL4030_REG_AUDIO_IF, format); } } @@ -1900,25 +1900,25 @@ static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int twl4030_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; - u8 reg = twl4030_read(codec, TWL4030_REG_AUDIO_IF); + struct snd_soc_component *component = dai->component; + u8 reg = twl4030_read(component, TWL4030_REG_AUDIO_IF); if (tristate) reg |= TWL4030_AIF_TRI_EN; else reg &= ~TWL4030_AIF_TRI_EN; - return twl4030_write(codec, TWL4030_REG_AUDIO_IF, reg); + return twl4030_write(component, TWL4030_REG_AUDIO_IF, reg); } /* In case of voice mode, the RX1 L(VRX) for downlink and the TX2 L/R * (VTXL, VTXR) for uplink has to be enabled/disabled. */ -static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction, +static void twl4030_voice_enable(struct snd_soc_component *component, int direction, int enable) { u8 reg, mask; - reg = twl4030_read(codec, TWL4030_REG_OPTION); + reg = twl4030_read(component, TWL4030_REG_OPTION); if (direction == SNDRV_PCM_STREAM_PLAYBACK) mask = TWL4030_ARXL1_VRX_EN; @@ -1930,21 +1930,21 @@ static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction, else reg &= ~mask; - twl4030_write(codec, TWL4030_REG_OPTION, reg); + twl4030_write(component, TWL4030_REG_OPTION, reg); } static int twl4030_voice_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 mode; /* If the system master clock is not 26MHz, the voice PCM interface is * not available. */ if (twl4030->sysclk != 26000) { - dev_err(codec->dev, + dev_err(component->dev, "%s: HFCLKIN is %u KHz, voice interface needs 26MHz\n", __func__, twl4030->sysclk); return -EINVAL; @@ -1953,11 +1953,11 @@ static int twl4030_voice_startup(struct snd_pcm_substream *substream, /* If the codec mode is not option2, the voice PCM interface is not * available. */ - mode = twl4030_read(codec, TWL4030_REG_CODEC_MODE) + mode = twl4030_read(component, TWL4030_REG_CODEC_MODE) & TWL4030_OPT_MODE; if (mode != TWL4030_OPTION_2) { - dev_err(codec->dev, "%s: the codec mode is not option2\n", + dev_err(component->dev, "%s: the codec mode is not option2\n", __func__); return -EINVAL; } @@ -1968,25 +1968,25 @@ static int twl4030_voice_startup(struct snd_pcm_substream *substream, static void twl4030_voice_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; /* Enable voice digital filters */ - twl4030_voice_enable(codec, substream->stream, 0); + twl4030_voice_enable(component, substream->stream, 0); } static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 old_mode, mode; /* Enable voice digital filters */ - twl4030_voice_enable(codec, substream->stream, 1); + twl4030_voice_enable(component, substream->stream, 1); /* bit rate */ - old_mode = twl4030_read(codec, + old_mode = twl4030_read(component, TWL4030_REG_CODEC_MODE) & ~TWL4030_CODECPDZ; mode = old_mode; @@ -1998,7 +1998,7 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, mode |= TWL4030_SEL_16K; break; default: - dev_err(codec->dev, "%s: unknown rate %d\n", __func__, + dev_err(component->dev, "%s: unknown rate %d\n", __func__, params_rate(params)); return -EINVAL; } @@ -2009,11 +2009,11 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, * If the codec is powered, than we need to toggle the * codec power. */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); - twl4030_codec_enable(codec, 1); + twl4030_codec_enable(component, 0); + twl4030_write(component, TWL4030_REG_CODEC_MODE, mode); + twl4030_codec_enable(component, 1); } else { - twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode); + twl4030_write(component, TWL4030_REG_CODEC_MODE, mode); } } @@ -2023,17 +2023,17 @@ static int twl4030_voice_hw_params(struct snd_pcm_substream *substream, static int twl4030_voice_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); if (freq != 26000000) { - dev_err(codec->dev, + dev_err(component->dev, "%s: HFCLKIN is %u KHz, voice interface needs 26MHz\n", __func__, freq / 1000); return -EINVAL; } if ((freq / 1000) != twl4030->sysclk) { - dev_err(codec->dev, + dev_err(component->dev, "Mismatch in HFCLKIN: %u (configured: %u)\n", freq, twl4030->sysclk * 1000); return -EINVAL; @@ -2044,12 +2044,12 @@ static int twl4030_voice_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); u8 old_format, format; /* get format */ - old_format = twl4030_read(codec, TWL4030_REG_VOICE_IF); + old_format = twl4030_read(component, TWL4030_REG_VOICE_IF); format = old_format; /* set master/slave audio interface */ @@ -2082,11 +2082,11 @@ static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, * If the codec is powered, than we need to toggle the * codec power. */ - twl4030_codec_enable(codec, 0); - twl4030_write(codec, TWL4030_REG_VOICE_IF, format); - twl4030_codec_enable(codec, 1); + twl4030_codec_enable(component, 0); + twl4030_write(component, TWL4030_REG_VOICE_IF, format); + twl4030_codec_enable(component, 1); } else { - twl4030_write(codec, TWL4030_REG_VOICE_IF, format); + twl4030_write(component, TWL4030_REG_VOICE_IF, format); } } @@ -2095,15 +2095,15 @@ static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai, static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate) { - struct snd_soc_codec *codec = dai->codec; - u8 reg = twl4030_read(codec, TWL4030_REG_VOICE_IF); + struct snd_soc_component *component = dai->component; + u8 reg = twl4030_read(component, TWL4030_REG_VOICE_IF); if (tristate) reg |= TWL4030_VIF_TRI_EN; else reg &= ~TWL4030_VIF_TRI_EN; - return twl4030_write(codec, TWL4030_REG_VOICE_IF, reg); + return twl4030_write(component, TWL4030_REG_VOICE_IF, reg); } #define TWL4030_RATES (SNDRV_PCM_RATE_8000_48000) @@ -2164,69 +2164,60 @@ static struct snd_soc_dai_driver twl4030_dai[] = { }, }; -static int twl4030_soc_probe(struct snd_soc_codec *codec) +static int twl4030_soc_probe(struct snd_soc_component *component) { struct twl4030_priv *twl4030; - twl4030 = devm_kzalloc(codec->dev, sizeof(struct twl4030_priv), + twl4030 = devm_kzalloc(component->dev, sizeof(struct twl4030_priv), GFP_KERNEL); if (!twl4030) return -ENOMEM; - snd_soc_codec_set_drvdata(codec, twl4030); + snd_soc_component_set_drvdata(component, twl4030); /* Set the defaults, and power up the codec */ twl4030->sysclk = twl4030_audio_get_mclk() / 1000; - twl4030_init_chip(codec); + twl4030_init_chip(component); return 0; } -static int twl4030_soc_remove(struct snd_soc_codec *codec) +static void twl4030_soc_remove(struct snd_soc_component *component) { - struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); + struct twl4030_priv *twl4030 = snd_soc_component_get_drvdata(component); struct twl4030_codec_data *pdata = twl4030->pdata; if (pdata && pdata->hs_extmute && gpio_is_valid(pdata->hs_extmute_gpio)) gpio_free(pdata->hs_extmute_gpio); - - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_twl4030 = { - .probe = twl4030_soc_probe, - .remove = twl4030_soc_remove, - .read = twl4030_read, - .write = twl4030_write, - .set_bias_level = twl4030_set_bias_level, - .idle_bias_off = true, - - .component_driver = { - .controls = twl4030_snd_controls, - .num_controls = ARRAY_SIZE(twl4030_snd_controls), - .dapm_widgets = twl4030_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(twl4030_dapm_widgets), - .dapm_routes = intercon, - .num_dapm_routes = ARRAY_SIZE(intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_twl4030 = { + .probe = twl4030_soc_probe, + .remove = twl4030_soc_remove, + .read = twl4030_read, + .write = twl4030_write, + .set_bias_level = twl4030_set_bias_level, + .controls = twl4030_snd_controls, + .num_controls = ARRAY_SIZE(twl4030_snd_controls), + .dapm_widgets = twl4030_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(twl4030_dapm_widgets), + .dapm_routes = intercon, + .num_dapm_routes = ARRAY_SIZE(intercon), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int twl4030_codec_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_twl4030, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_twl4030, twl4030_dai, ARRAY_SIZE(twl4030_dai)); } -static int twl4030_codec_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - MODULE_ALIAS("platform:twl4030-codec"); static struct platform_driver twl4030_codec_driver = { .probe = twl4030_codec_probe, - .remove = twl4030_codec_remove, .driver = { .name = "twl4030-codec", }, diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index 573a523ed0b3..bfd1abd72253 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c @@ -76,7 +76,7 @@ struct twl6040_data { unsigned int clk_in; unsigned int sysclk; struct twl6040_jack_data hs_jack; - struct snd_soc_codec *codec; + struct snd_soc_component *component; struct mutex mutex; }; @@ -106,12 +106,12 @@ static const struct snd_pcm_hw_constraint_list sysclk_constraints[] = { { .count = ARRAY_SIZE(hp_rates), .list = hp_rates, }, }; -#define to_twl6040(codec) dev_get_drvdata((codec)->dev->parent) +#define to_twl6040(component) dev_get_drvdata((component)->dev->parent) -static unsigned int twl6040_read(struct snd_soc_codec *codec, unsigned int reg) +static unsigned int twl6040_read(struct snd_soc_component *component, unsigned int reg) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); - struct twl6040 *twl6040 = to_twl6040(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); + struct twl6040 *twl6040 = to_twl6040(component); u8 value; if (reg >= TWL6040_CACHEREGNUM) @@ -133,10 +133,10 @@ static unsigned int twl6040_read(struct snd_soc_codec *codec, unsigned int reg) return value; } -static bool twl6040_can_write_to_chip(struct snd_soc_codec *codec, +static bool twl6040_can_write_to_chip(struct snd_soc_component *component, unsigned int reg) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); switch (reg) { case TWL6040_REG_HSLCTL: @@ -152,10 +152,10 @@ static bool twl6040_can_write_to_chip(struct snd_soc_codec *codec, } } -static inline void twl6040_update_dl12_cache(struct snd_soc_codec *codec, +static inline void twl6040_update_dl12_cache(struct snd_soc_component *component, u8 reg, u8 value) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); switch (reg) { case TWL6040_REG_HSLCTL: @@ -170,54 +170,54 @@ static inline void twl6040_update_dl12_cache(struct snd_soc_codec *codec, } } -static int twl6040_write(struct snd_soc_codec *codec, +static int twl6040_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct twl6040 *twl6040 = to_twl6040(codec); + struct twl6040 *twl6040 = to_twl6040(component); if (reg >= TWL6040_CACHEREGNUM) return -EIO; - twl6040_update_dl12_cache(codec, reg, value); - if (twl6040_can_write_to_chip(codec, reg)) + twl6040_update_dl12_cache(component, reg, value); + if (twl6040_can_write_to_chip(component, reg)) return twl6040_reg_write(twl6040, reg, value); else return 0; } -static void twl6040_init_chip(struct snd_soc_codec *codec) +static void twl6040_init_chip(struct snd_soc_component *component) { - twl6040_read(codec, TWL6040_REG_TRIM1); - twl6040_read(codec, TWL6040_REG_TRIM2); - twl6040_read(codec, TWL6040_REG_TRIM3); - twl6040_read(codec, TWL6040_REG_HSOTRIM); - twl6040_read(codec, TWL6040_REG_HFOTRIM); + twl6040_read(component, TWL6040_REG_TRIM1); + twl6040_read(component, TWL6040_REG_TRIM2); + twl6040_read(component, TWL6040_REG_TRIM3); + twl6040_read(component, TWL6040_REG_HSOTRIM); + twl6040_read(component, TWL6040_REG_HFOTRIM); /* Change chip defaults */ /* No imput selected for microphone amplifiers */ - twl6040_write(codec, TWL6040_REG_MICLCTL, 0x18); - twl6040_write(codec, TWL6040_REG_MICRCTL, 0x18); + twl6040_write(component, TWL6040_REG_MICLCTL, 0x18); + twl6040_write(component, TWL6040_REG_MICRCTL, 0x18); /* * We need to lower the default gain values, so the ramp code * can work correctly for the first playback. * This reduces the pop noise heard at the first playback. */ - twl6040_write(codec, TWL6040_REG_HSGAIN, 0xff); - twl6040_write(codec, TWL6040_REG_EARCTL, 0x1e); - twl6040_write(codec, TWL6040_REG_HFLGAIN, 0x1d); - twl6040_write(codec, TWL6040_REG_HFRGAIN, 0x1d); - twl6040_write(codec, TWL6040_REG_LINEGAIN, 0); + twl6040_write(component, TWL6040_REG_HSGAIN, 0xff); + twl6040_write(component, TWL6040_REG_EARCTL, 0x1e); + twl6040_write(component, TWL6040_REG_HFLGAIN, 0x1d); + twl6040_write(component, TWL6040_REG_HFRGAIN, 0x1d); + twl6040_write(component, TWL6040_REG_LINEGAIN, 0); } /* set headset dac and driver power mode */ -static int headset_power_mode(struct snd_soc_codec *codec, int high_perf) +static int headset_power_mode(struct snd_soc_component *component, int high_perf) { int hslctl, hsrctl; int mask = TWL6040_HSDRVMODE | TWL6040_HSDACMODE; - hslctl = twl6040_read(codec, TWL6040_REG_HSLCTL); - hsrctl = twl6040_read(codec, TWL6040_REG_HSRCTL); + hslctl = twl6040_read(component, TWL6040_REG_HSLCTL); + hsrctl = twl6040_read(component, TWL6040_REG_HSRCTL); if (high_perf) { hslctl &= ~mask; @@ -227,8 +227,8 @@ static int headset_power_mode(struct snd_soc_codec *codec, int high_perf) hsrctl |= mask; } - twl6040_write(codec, TWL6040_REG_HSLCTL, hslctl); - twl6040_write(codec, TWL6040_REG_HSRCTL, hsrctl); + twl6040_write(component, TWL6040_REG_HSLCTL, hslctl); + twl6040_write(component, TWL6040_REG_HSRCTL, hsrctl); return 0; } @@ -236,7 +236,7 @@ static int headset_power_mode(struct snd_soc_codec *codec, int high_perf) static int twl6040_hs_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); u8 hslctl, hsrctl; /* @@ -244,8 +244,8 @@ static int twl6040_hs_dac_event(struct snd_soc_dapm_widget *w, * Both HS DAC need to be turned on (before the HS driver) and off at * the same time. */ - hslctl = twl6040_read(codec, TWL6040_REG_HSLCTL); - hsrctl = twl6040_read(codec, TWL6040_REG_HSRCTL); + hslctl = twl6040_read(component, TWL6040_REG_HSLCTL); + hsrctl = twl6040_read(component, TWL6040_REG_HSRCTL); if (SND_SOC_DAPM_EVENT_ON(event)) { hslctl |= TWL6040_HSDACENA; hsrctl |= TWL6040_HSDACENA; @@ -253,8 +253,8 @@ static int twl6040_hs_dac_event(struct snd_soc_dapm_widget *w, hslctl &= ~TWL6040_HSDACENA; hsrctl &= ~TWL6040_HSDACENA; } - twl6040_write(codec, TWL6040_REG_HSLCTL, hslctl); - twl6040_write(codec, TWL6040_REG_HSRCTL, hsrctl); + twl6040_write(component, TWL6040_REG_HSLCTL, hslctl); + twl6040_write(component, TWL6040_REG_HSRCTL, hsrctl); msleep(1); return 0; @@ -263,17 +263,17 @@ static int twl6040_hs_dac_event(struct snd_soc_dapm_widget *w, static int twl6040_ep_drv_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int ret = 0; if (SND_SOC_DAPM_EVENT_ON(event)) { /* Earphone doesn't support low power mode */ priv->hs_power_mode_locked = 1; - ret = headset_power_mode(codec, 1); + ret = headset_power_mode(component, 1); } else { priv->hs_power_mode_locked = 0; - ret = headset_power_mode(codec, priv->hs_power_mode); + ret = headset_power_mode(component, priv->hs_power_mode); } msleep(1); @@ -281,16 +281,16 @@ static int twl6040_ep_drv_event(struct snd_soc_dapm_widget *w, return ret; } -static void twl6040_hs_jack_report(struct snd_soc_codec *codec, +static void twl6040_hs_jack_report(struct snd_soc_component *component, struct snd_soc_jack *jack, int report) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int status; mutex_lock(&priv->mutex); /* Sync status */ - status = twl6040_read(codec, TWL6040_REG_STATUS); + status = twl6040_read(component, TWL6040_REG_STATUS); if (status & TWL6040_PLUGCOMP) snd_soc_jack_report(jack, report, report); else @@ -299,16 +299,16 @@ static void twl6040_hs_jack_report(struct snd_soc_codec *codec, mutex_unlock(&priv->mutex); } -void twl6040_hs_jack_detect(struct snd_soc_codec *codec, +void twl6040_hs_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, int report) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); struct twl6040_jack_data *hs_jack = &priv->hs_jack; hs_jack->jack = jack; hs_jack->report = report; - twl6040_hs_jack_report(codec, hs_jack->jack, hs_jack->report); + twl6040_hs_jack_report(component, hs_jack->jack, hs_jack->report); } EXPORT_SYMBOL_GPL(twl6040_hs_jack_detect); @@ -316,17 +316,17 @@ static void twl6040_accessory_work(struct work_struct *work) { struct twl6040_data *priv = container_of(work, struct twl6040_data, hs_jack.work.work); - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; struct twl6040_jack_data *hs_jack = &priv->hs_jack; - twl6040_hs_jack_report(codec, hs_jack->jack, hs_jack->report); + twl6040_hs_jack_report(component, hs_jack->jack, hs_jack->report); } /* audio interrupt handler */ static irqreturn_t twl6040_audio_handler(int irq, void *data) { - struct snd_soc_codec *codec = data; - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = data; + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); queue_delayed_work(system_power_efficient_wq, &priv->hs_jack.work, msecs_to_jiffies(200)); @@ -337,12 +337,12 @@ static irqreturn_t twl6040_audio_handler(int irq, void *data) static int twl6040_soc_dapm_put_vibra_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int val; /* Do not allow changes while Input/FF efect is running */ - val = twl6040_read(codec, e->reg); + val = twl6040_read(component, e->reg); if (val & TWL6040_VIBENA && !(val & TWL6040_VIBSEL)) return -EBUSY; @@ -486,8 +486,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(twl6040_power_mode_enum, static int twl6040_headset_power_get_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); ucontrol->value.enumerated.item[0] = priv->hs_power_mode; @@ -497,13 +497,13 @@ static int twl6040_headset_power_get_enum(struct snd_kcontrol *kcontrol, static int twl6040_headset_power_put_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int high_perf = ucontrol->value.enumerated.item[0]; int ret = 0; if (!priv->hs_power_mode_locked) - ret = headset_power_mode(codec, high_perf); + ret = headset_power_mode(component, high_perf); if (!ret) priv->hs_power_mode = high_perf; @@ -514,8 +514,8 @@ static int twl6040_headset_power_put_enum(struct snd_kcontrol *kcontrol, static int twl6040_pll_get_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); ucontrol->value.enumerated.item[0] = priv->pll_power_mode; @@ -525,17 +525,17 @@ static int twl6040_pll_get_enum(struct snd_kcontrol *kcontrol, static int twl6040_pll_put_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); priv->pll_power_mode = ucontrol->value.enumerated.item[0]; return 0; } -int twl6040_get_dl1_gain(struct snd_soc_codec *codec) +int twl6040_get_dl1_gain(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); if (snd_soc_dapm_get_pin_status(dapm, "EP")) return -1; /* -1dB */ @@ -543,7 +543,7 @@ int twl6040_get_dl1_gain(struct snd_soc_codec *codec) if (snd_soc_dapm_get_pin_status(dapm, "HSOR") || snd_soc_dapm_get_pin_status(dapm, "HSOL")) { - u8 val = twl6040_read(codec, TWL6040_REG_HSLCTL); + u8 val = twl6040_read(component, TWL6040_REG_HSLCTL); if (val & TWL6040_HSDACMODE) /* HSDACL in LP mode */ return -8; /* -8dB */ @@ -555,26 +555,26 @@ int twl6040_get_dl1_gain(struct snd_soc_codec *codec) } EXPORT_SYMBOL_GPL(twl6040_get_dl1_gain); -int twl6040_get_clk_id(struct snd_soc_codec *codec) +int twl6040_get_clk_id(struct snd_soc_component *component) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); return priv->pll_power_mode; } EXPORT_SYMBOL_GPL(twl6040_get_clk_id); -int twl6040_get_trim_value(struct snd_soc_codec *codec, enum twl6040_trim trim) +int twl6040_get_trim_value(struct snd_soc_component *component, enum twl6040_trim trim) { if (unlikely(trim >= TWL6040_TRIM_INVAL)) return -EINVAL; - return twl6040_read(codec, TWL6040_REG_TRIM1 + trim); + return twl6040_read(component, TWL6040_REG_TRIM1 + trim); } EXPORT_SYMBOL_GPL(twl6040_get_trim_value); -int twl6040_get_hs_step_size(struct snd_soc_codec *codec) +int twl6040_get_hs_step_size(struct snd_soc_component *component) { - struct twl6040 *twl6040 = to_twl6040(codec); + struct twl6040 *twl6040 = to_twl6040(component); if (twl6040_get_revid(twl6040) < TWL6040_REV_ES1_3) /* For ES under ES_1.3 HS step is 2 mV */ @@ -829,11 +829,11 @@ static const struct snd_soc_dapm_route intercon[] = { {"VIBRAR", NULL, "Vibra Right Driver"}, }; -static int twl6040_set_bias_level(struct snd_soc_codec *codec, +static int twl6040_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct twl6040 *twl6040 = to_twl6040(codec); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040 *twl6040 = to_twl6040(component); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int ret = 0; switch (level) { @@ -856,7 +856,7 @@ static int twl6040_set_bias_level(struct snd_soc_codec *codec, priv->codec_powered = 1; /* Set external boost GPO */ - twl6040_write(codec, TWL6040_REG_GPOCTL, 0x02); + twl6040_write(component, TWL6040_REG_GPOCTL, 0x02); break; case SND_SOC_BIAS_OFF: if (!priv->codec_powered) @@ -873,8 +873,8 @@ static int twl6040_set_bias_level(struct snd_soc_codec *codec, static int twl6040_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE, @@ -887,8 +887,8 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int rate; rate = params_rate(params); @@ -899,7 +899,7 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream, case 88200: /* These rates are not supported when HPPLL is in use */ if (unlikely(priv->pll == TWL6040_SYSCLK_SEL_HPPLL)) { - dev_err(codec->dev, "HPPLL does not support rate %d\n", + dev_err(component->dev, "HPPLL does not support rate %d\n", rate); return -EINVAL; } @@ -913,7 +913,7 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream, priv->sysclk = 19200000; break; default: - dev_err(codec->dev, "unsupported rate %d\n", rate); + dev_err(component->dev, "unsupported rate %d\n", rate); return -EINVAL; } @@ -923,20 +923,20 @@ static int twl6040_hw_params(struct snd_pcm_substream *substream, static int twl6040_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct twl6040 *twl6040 = to_twl6040(codec); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct twl6040 *twl6040 = to_twl6040(component); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int ret; if (!priv->sysclk) { - dev_err(codec->dev, + dev_err(component->dev, "no mclk configured, call set_sysclk() on init\n"); return -EINVAL; } ret = twl6040_set_pll(twl6040, priv->pll, priv->clk_in, priv->sysclk); if (ret) { - dev_err(codec->dev, "Can not set PLL (%d)\n", ret); + dev_err(component->dev, "Can not set PLL (%d)\n", ret); return -EPERM; } @@ -946,8 +946,8 @@ static int twl6040_prepare(struct snd_pcm_substream *substream, static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); switch (clk_id) { case TWL6040_SYSCLK_SEL_LPPLL: @@ -956,26 +956,26 @@ static int twl6040_set_dai_sysclk(struct snd_soc_dai *codec_dai, priv->clk_in = freq; break; default: - dev_err(codec->dev, "unknown clk_id %d\n", clk_id); + dev_err(component->dev, "unknown clk_id %d\n", clk_id); return -EINVAL; } return 0; } -static void twl6040_mute_path(struct snd_soc_codec *codec, enum twl6040_dai_id id, +static void twl6040_mute_path(struct snd_soc_component *component, enum twl6040_dai_id id, int mute) { - struct twl6040 *twl6040 = to_twl6040(codec); - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040 *twl6040 = to_twl6040(component); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); int hslctl, hsrctl, earctl; int hflctl, hfrctl; switch (id) { case TWL6040_DAI_DL1: - hslctl = twl6040_read(codec, TWL6040_REG_HSLCTL); - hsrctl = twl6040_read(codec, TWL6040_REG_HSRCTL); - earctl = twl6040_read(codec, TWL6040_REG_EARCTL); + hslctl = twl6040_read(component, TWL6040_REG_HSLCTL); + hsrctl = twl6040_read(component, TWL6040_REG_HSRCTL); + earctl = twl6040_read(component, TWL6040_REG_EARCTL); if (mute) { /* Power down drivers and DACs */ @@ -991,8 +991,8 @@ static void twl6040_mute_path(struct snd_soc_codec *codec, enum twl6040_dai_id i priv->dl1_unmuted = !mute; break; case TWL6040_DAI_DL2: - hflctl = twl6040_read(codec, TWL6040_REG_HFLCTL); - hfrctl = twl6040_read(codec, TWL6040_REG_HFRCTL); + hflctl = twl6040_read(component, TWL6040_REG_HFLCTL); + hfrctl = twl6040_read(component, TWL6040_REG_HFRCTL); if (mute) { /* Power down drivers and DACs */ @@ -1015,12 +1015,12 @@ static int twl6040_digital_mute(struct snd_soc_dai *dai, int mute) { switch (dai->id) { case TWL6040_DAI_LEGACY: - twl6040_mute_path(dai->codec, TWL6040_DAI_DL1, mute); - twl6040_mute_path(dai->codec, TWL6040_DAI_DL2, mute); + twl6040_mute_path(dai->component, TWL6040_DAI_DL1, mute); + twl6040_mute_path(dai->component, TWL6040_DAI_DL2, mute); break; case TWL6040_DAI_DL1: case TWL6040_DAI_DL2: - twl6040_mute_path(dai->codec, dai->id, mute); + twl6040_mute_path(dai->component, dai->id, mute); break; default: break; @@ -1107,23 +1107,23 @@ static struct snd_soc_dai_driver twl6040_dai[] = { }, }; -static int twl6040_probe(struct snd_soc_codec *codec) +static int twl6040_probe(struct snd_soc_component *component) { struct twl6040_data *priv; - struct platform_device *pdev = to_platform_device(codec->dev); + struct platform_device *pdev = to_platform_device(component->dev); int ret = 0; - priv = devm_kzalloc(codec->dev, sizeof(*priv), GFP_KERNEL); + priv = devm_kzalloc(component->dev, sizeof(*priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; - snd_soc_codec_set_drvdata(codec, priv); + snd_soc_component_set_drvdata(component, priv); - priv->codec = codec; + priv->component = component; priv->plug_irq = platform_get_irq(pdev, 0); if (priv->plug_irq < 0) { - dev_err(codec->dev, "invalid irq: %d\n", priv->plug_irq); + dev_err(component->dev, "invalid irq: %d\n", priv->plug_irq); return priv->plug_irq; } @@ -1134,64 +1134,55 @@ static int twl6040_probe(struct snd_soc_codec *codec) ret = request_threaded_irq(priv->plug_irq, NULL, twl6040_audio_handler, IRQF_NO_SUSPEND | IRQF_ONESHOT, - "twl6040_irq_plug", codec); + "twl6040_irq_plug", component); if (ret) { - dev_err(codec->dev, "PLUG IRQ request failed: %d\n", ret); + dev_err(component->dev, "PLUG IRQ request failed: %d\n", ret); return ret; } - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); - twl6040_init_chip(codec); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); + twl6040_init_chip(component); return 0; } -static int twl6040_remove(struct snd_soc_codec *codec) +static void twl6040_remove(struct snd_soc_component *component) { - struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); + struct twl6040_data *priv = snd_soc_component_get_drvdata(component); - free_irq(priv->plug_irq, codec); - - return 0; + free_irq(priv->plug_irq, component); } -static const struct snd_soc_codec_driver soc_codec_dev_twl6040 = { - .probe = twl6040_probe, - .remove = twl6040_remove, - .read = twl6040_read, - .write = twl6040_write, - .set_bias_level = twl6040_set_bias_level, - .suspend_bias_off = true, - .ignore_pmdown_time = true, - - .component_driver = { - .controls = twl6040_snd_controls, - .num_controls = ARRAY_SIZE(twl6040_snd_controls), - .dapm_widgets = twl6040_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets), - .dapm_routes = intercon, - .num_dapm_routes = ARRAY_SIZE(intercon), - }, +static const struct snd_soc_component_driver soc_component_dev_twl6040 = { + .probe = twl6040_probe, + .remove = twl6040_remove, + .read = twl6040_read, + .write = twl6040_write, + .set_bias_level = twl6040_set_bias_level, + .controls = twl6040_snd_controls, + .num_controls = ARRAY_SIZE(twl6040_snd_controls), + .dapm_widgets = twl6040_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets), + .dapm_routes = intercon, + .num_dapm_routes = ARRAY_SIZE(intercon), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int twl6040_codec_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_twl6040, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_twl6040, twl6040_dai, ARRAY_SIZE(twl6040_dai)); } -static int twl6040_codec_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; -} - static struct platform_driver twl6040_codec_driver = { .driver = { .name = "twl6040-codec", }, .probe = twl6040_codec_probe, - .remove = twl6040_codec_remove, }; module_platform_driver(twl6040_codec_driver); diff --git a/sound/soc/codecs/twl6040.h b/sound/soc/codecs/twl6040.h index 0611406ca7c0..3d9f957077ef 100644 --- a/sound/soc/codecs/twl6040.h +++ b/sound/soc/codecs/twl6040.h @@ -34,11 +34,11 @@ enum twl6040_trim { #define TWL6040_HSF_TRIM_LEFT(x) (x & 0x0f) #define TWL6040_HSF_TRIM_RIGHT(x) ((x >> 4) & 0x0f) -int twl6040_get_dl1_gain(struct snd_soc_codec *codec); -void twl6040_hs_jack_detect(struct snd_soc_codec *codec, +int twl6040_get_dl1_gain(struct snd_soc_component *component); +void twl6040_hs_jack_detect(struct snd_soc_component *component, struct snd_soc_jack *jack, int report); -int twl6040_get_clk_id(struct snd_soc_codec *codec); -int twl6040_get_trim_value(struct snd_soc_codec *codec, enum twl6040_trim trim); -int twl6040_get_hs_step_size(struct snd_soc_codec *codec); +int twl6040_get_clk_id(struct snd_soc_component *component); +int twl6040_get_trim_value(struct snd_soc_component *component, enum twl6040_trim trim); +int twl6040_get_hs_step_size(struct snd_soc_component *component); #endif /* End of __TWL6040_H__ */ diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 77c9cc4467b8..3c935a941129 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c @@ -110,9 +110,9 @@ static int uda134x_regmap_write(void *context, unsigned int reg, return 0; } -static inline void uda134x_reset(struct snd_soc_codec *codec) +static inline void uda134x_reset(struct snd_soc_component *component) { - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); unsigned int mask = 1<<6; regmap_update_bits(uda134x->regmap, UDA134X_STATUS0, mask, mask); @@ -122,7 +122,7 @@ static inline void uda134x_reset(struct snd_soc_codec *codec) static int uda134x_mute(struct snd_soc_dai *dai, int mute) { - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(dai->codec); + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(dai->component); unsigned int mask = 1<<2; unsigned int val; @@ -139,8 +139,8 @@ static int uda134x_mute(struct snd_soc_dai *dai, int mute) static int uda134x_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *master_runtime; if (uda134x->master_substream) { @@ -168,8 +168,8 @@ static int uda134x_startup(struct snd_pcm_substream *substream, static void uda134x_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); if (uda134x->master_substream == substream) uda134x->master_substream = uda134x->slave_substream; @@ -181,8 +181,8 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); unsigned int hw_params = 0; if (substream == uda134x->slave_substream) { @@ -248,8 +248,8 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream, static int uda134x_set_dai_sysclk(struct snd_soc_dai *codec_dai, int clk_id, unsigned int freq, int dir) { - struct snd_soc_codec *codec = codec_dai->codec; - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); pr_debug("%s clk_id: %d, freq: %u, dir: %d\n", __func__, clk_id, freq, dir); @@ -270,8 +270,8 @@ static int uda134x_set_dai_sysclk(struct snd_soc_dai *codec_dai, static int uda134x_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = codec_dai->component; + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); pr_debug("%s fmt: %08X\n", __func__, fmt); @@ -294,10 +294,10 @@ static int uda134x_set_dai_fmt(struct snd_soc_dai *codec_dai, return 0; } -static int uda134x_set_bias_level(struct snd_soc_codec *codec, +static int uda134x_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); struct uda134x_platform_data *pd = uda134x->pd; pr_debug("%s bias level %d\n", __func__, level); @@ -446,10 +446,10 @@ static struct snd_soc_dai_driver uda134x_dai = { .ops = &uda134x_dai_ops, }; -static int uda134x_soc_probe(struct snd_soc_codec *codec) +static int uda134x_soc_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct uda134x_priv *uda134x = snd_soc_component_get_drvdata(component); struct uda134x_platform_data *pd = uda134x->pd; const struct snd_soc_dapm_widget *widgets; unsigned num_widgets; @@ -473,7 +473,7 @@ static int uda134x_soc_probe(struct snd_soc_codec *codec) if (pd->power) pd->power(1); - uda134x_reset(codec); + uda134x_reset(component); if (pd->model == UDA134X_UDA1341) { widgets = uda1341_dapm_widgets; @@ -493,15 +493,15 @@ static int uda134x_soc_probe(struct snd_soc_codec *codec) switch (pd->model) { case UDA134X_UDA1340: case UDA134X_UDA1344: - ret = snd_soc_add_codec_controls(codec, uda1340_snd_controls, + ret = snd_soc_add_component_controls(component, uda1340_snd_controls, ARRAY_SIZE(uda1340_snd_controls)); break; case UDA134X_UDA1341: - ret = snd_soc_add_codec_controls(codec, uda1341_snd_controls, + ret = snd_soc_add_component_controls(component, uda1341_snd_controls, ARRAY_SIZE(uda1341_snd_controls)); break; case UDA134X_UDA1345: - ret = snd_soc_add_codec_controls(codec, uda1345_snd_controls, + ret = snd_soc_add_component_controls(component, uda1345_snd_controls, ARRAY_SIZE(uda1345_snd_controls)); break; default: @@ -518,17 +518,18 @@ static int uda134x_soc_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_uda134x = { - .probe = uda134x_soc_probe, - .set_bias_level = uda134x_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .dapm_widgets = uda134x_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(uda134x_dapm_widgets), - .dapm_routes = uda134x_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(uda134x_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_uda134x = { + .probe = uda134x_soc_probe, + .set_bias_level = uda134x_set_bias_level, + .dapm_widgets = uda134x_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(uda134x_dapm_widgets), + .dapm_routes = uda134x_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(uda134x_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config uda134x_regmap_config = { @@ -571,14 +572,8 @@ static int uda134x_codec_probe(struct platform_device *pdev) if (IS_ERR(uda134x->regmap)) return PTR_ERR(uda134x->regmap); - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_uda134x, &uda134x_dai, 1); -} - -static int uda134x_codec_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_uda134x, &uda134x_dai, 1); } static struct platform_driver uda134x_codec_driver = { @@ -586,7 +581,6 @@ static struct platform_driver uda134x_codec_driver = { .name = "uda134x-codec", }, .probe = uda134x_codec_probe, - .remove = uda134x_codec_remove, }; module_platform_driver(uda134x_codec_driver); diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c index c73e6a192224..584a032b3cb1 100644 --- a/sound/soc/codecs/uda1380.c +++ b/sound/soc/codecs/uda1380.c @@ -34,7 +34,7 @@ /* codec private data */ struct uda1380_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; unsigned int dac_clk; struct work_struct work; struct i2c_client *i2c; @@ -61,10 +61,10 @@ static unsigned long uda1380_cache_dirty; /* * read uda1380 register cache */ -static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec, +static inline unsigned int uda1380_read_reg_cache(struct snd_soc_component *component, unsigned int reg) { - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); u16 *cache = uda1380->reg_cache; if (reg == UDA1380_RESET) @@ -77,10 +77,10 @@ static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec, /* * write uda1380 register cache */ -static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec, +static inline void uda1380_write_reg_cache(struct snd_soc_component *component, u16 reg, unsigned int value) { - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); u16 *cache = uda1380->reg_cache; if (reg >= UDA1380_CACHEREGNUM) @@ -93,10 +93,10 @@ static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec, /* * write to the UDA1380 register space */ -static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, +static int uda1380_write(struct snd_soc_component *component, unsigned int reg, unsigned int value) { - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); u8 data[3]; /* data is @@ -108,12 +108,12 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, data[1] = (value & 0xff00) >> 8; data[2] = value & 0x00ff; - uda1380_write_reg_cache(codec, reg, value); + uda1380_write_reg_cache(component, reg, value); /* the interpolator & decimator regs must only be written when the * codec DAI is active. */ - if (!snd_soc_codec_is_active(codec) && (reg >= UDA1380_MVOL)) + if (!snd_soc_component_is_active(component) && (reg >= UDA1380_MVOL)) return 0; pr_debug("uda1380: hw write %x val %x\n", reg, value); if (i2c_master_send(uda1380->i2c, data, 3) == 3) { @@ -133,9 +133,9 @@ static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg, return -EIO; } -static void uda1380_sync_cache(struct snd_soc_codec *codec) +static void uda1380_sync_cache(struct snd_soc_component *component) { - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); int reg; u8 data[3]; u16 *cache = uda1380->reg_cache; @@ -146,15 +146,15 @@ static void uda1380_sync_cache(struct snd_soc_codec *codec) data[1] = (cache[reg] & 0xff00) >> 8; data[2] = cache[reg] & 0x00ff; if (i2c_master_send(uda1380->i2c, data, 3) != 3) - dev_err(codec->dev, "%s: write to reg 0x%x failed\n", + dev_err(component->dev, "%s: write to reg 0x%x failed\n", __func__, reg); } } -static int uda1380_reset(struct snd_soc_codec *codec) +static int uda1380_reset(struct snd_soc_component *component) { - struct uda1380_platform_data *pdata = codec->dev->platform_data; - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_platform_data *pdata = component->dev->platform_data; + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); if (gpio_is_valid(pdata->gpio_reset)) { gpio_set_value(pdata->gpio_reset, 1); @@ -168,7 +168,7 @@ static int uda1380_reset(struct snd_soc_codec *codec) data[2] = 0; if (i2c_master_send(uda1380->i2c, data, 3) != 3) { - dev_err(codec->dev, "%s: failed\n", __func__); + dev_err(component->dev, "%s: failed\n", __func__); return -EIO; } } @@ -179,15 +179,15 @@ static int uda1380_reset(struct snd_soc_codec *codec) static void uda1380_flush_work(struct work_struct *work) { struct uda1380_priv *uda1380 = container_of(work, struct uda1380_priv, work); - struct snd_soc_codec *uda1380_codec = uda1380->codec; + struct snd_soc_component *uda1380_component = uda1380->component; int bit, reg; for_each_set_bit(bit, &uda1380_cache_dirty, UDA1380_CACHEREGNUM - 0x10) { reg = 0x10 + bit; pr_debug("uda1380: flush reg %x val %x:\n", reg, - uda1380_read_reg_cache(uda1380_codec, reg)); - uda1380_write(uda1380_codec, reg, - uda1380_read_reg_cache(uda1380_codec, reg)); + uda1380_read_reg_cache(uda1380_component, reg)); + uda1380_write(uda1380_component, reg, + uda1380_read_reg_cache(uda1380_component, reg)); clear_bit(bit, &uda1380_cache_dirty); } @@ -420,11 +420,11 @@ static const struct snd_soc_dapm_route uda1380_dapm_routes[] = { static int uda1380_set_dai_fmt_both(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int iface; /* set up DAI based upon fmt */ - iface = uda1380_read_reg_cache(codec, UDA1380_IFACE); + iface = uda1380_read_reg_cache(component, UDA1380_IFACE); iface &= ~(R01_SFORI_MASK | R01_SIM | R01_SFORO_MASK); switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -442,7 +442,7 @@ static int uda1380_set_dai_fmt_both(struct snd_soc_dai *codec_dai, if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) return -EINVAL; - uda1380_write_reg_cache(codec, UDA1380_IFACE, iface); + uda1380_write_reg_cache(component, UDA1380_IFACE, iface); return 0; } @@ -450,11 +450,11 @@ static int uda1380_set_dai_fmt_both(struct snd_soc_dai *codec_dai, static int uda1380_set_dai_fmt_playback(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int iface; /* set up DAI based upon fmt */ - iface = uda1380_read_reg_cache(codec, UDA1380_IFACE); + iface = uda1380_read_reg_cache(component, UDA1380_IFACE); iface &= ~R01_SFORI_MASK; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -472,7 +472,7 @@ static int uda1380_set_dai_fmt_playback(struct snd_soc_dai *codec_dai, if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) return -EINVAL; - uda1380_write(codec, UDA1380_IFACE, iface); + uda1380_write(component, UDA1380_IFACE, iface); return 0; } @@ -480,11 +480,11 @@ static int uda1380_set_dai_fmt_playback(struct snd_soc_dai *codec_dai, static int uda1380_set_dai_fmt_capture(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; int iface; /* set up DAI based upon fmt */ - iface = uda1380_read_reg_cache(codec, UDA1380_IFACE); + iface = uda1380_read_reg_cache(component, UDA1380_IFACE); iface &= ~(R01_SIM | R01_SFORO_MASK); switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { @@ -501,7 +501,7 @@ static int uda1380_set_dai_fmt_capture(struct snd_soc_dai *codec_dai, if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) == SND_SOC_DAIFMT_CBM_CFM) iface |= R01_SIM; - uda1380_write(codec, UDA1380_IFACE, iface); + uda1380_write(component, UDA1380_IFACE, iface); return 0; } @@ -509,20 +509,20 @@ static int uda1380_set_dai_fmt_capture(struct snd_soc_dai *codec_dai, static int uda1380_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); - int mixer = uda1380_read_reg_cache(codec, UDA1380_MIXER); + struct snd_soc_component *component = dai->component; + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); + int mixer = uda1380_read_reg_cache(component, UDA1380_MIXER); switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - uda1380_write_reg_cache(codec, UDA1380_MIXER, + uda1380_write_reg_cache(component, UDA1380_MIXER, mixer & ~R14_SILENCE); schedule_work(&uda1380->work); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - uda1380_write_reg_cache(codec, UDA1380_MIXER, + uda1380_write_reg_cache(component, UDA1380_MIXER, mixer | R14_SILENCE); schedule_work(&uda1380->work); break; @@ -534,13 +534,13 @@ static int uda1380_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK); + struct snd_soc_component *component = dai->component; + u16 clk = uda1380_read_reg_cache(component, UDA1380_CLK); /* set WSPLL power and divider if running from this clock */ if (clk & R00_DAC_CLK) { int rate = params_rate(params); - u16 pm = uda1380_read_reg_cache(codec, UDA1380_PM); + u16 pm = uda1380_read_reg_cache(component, UDA1380_PM); clk &= ~0x3; /* clear SEL_LOOP_DIV */ switch (rate) { case 6250 ... 12500: @@ -556,7 +556,7 @@ static int uda1380_pcm_hw_params(struct snd_pcm_substream *substream, clk |= 0x3; break; } - uda1380_write(codec, UDA1380_PM, R02_PON_PLL | pm); + uda1380_write(component, UDA1380_PM, R02_PON_PLL | pm); } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -564,20 +564,20 @@ static int uda1380_pcm_hw_params(struct snd_pcm_substream *substream, else clk |= R00_EN_ADC | R00_EN_DEC; - uda1380_write(codec, UDA1380_CLK, clk); + uda1380_write(component, UDA1380_CLK, clk); return 0; } static void uda1380_pcm_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK); + struct snd_soc_component *component = dai->component; + u16 clk = uda1380_read_reg_cache(component, UDA1380_CLK); /* shut down WSPLL power if running from this clock */ if (clk & R00_DAC_CLK) { - u16 pm = uda1380_read_reg_cache(codec, UDA1380_PM); - uda1380_write(codec, UDA1380_PM, ~R02_PON_PLL & pm); + u16 pm = uda1380_read_reg_cache(component, UDA1380_PM); + uda1380_write(component, UDA1380_PM, ~R02_PON_PLL & pm); } if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) @@ -585,33 +585,33 @@ static void uda1380_pcm_shutdown(struct snd_pcm_substream *substream, else clk &= ~(R00_EN_ADC | R00_EN_DEC); - uda1380_write(codec, UDA1380_CLK, clk); + uda1380_write(component, UDA1380_CLK, clk); } -static int uda1380_set_bias_level(struct snd_soc_codec *codec, +static int uda1380_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - int pm = uda1380_read_reg_cache(codec, UDA1380_PM); + int pm = uda1380_read_reg_cache(component, UDA1380_PM); int reg; - struct uda1380_platform_data *pdata = codec->dev->platform_data; + struct uda1380_platform_data *pdata = component->dev->platform_data; switch (level) { case SND_SOC_BIAS_ON: case SND_SOC_BIAS_PREPARE: /* ADC, DAC on */ - uda1380_write(codec, UDA1380_PM, R02_PON_BIAS | pm); + uda1380_write(component, UDA1380_PM, R02_PON_BIAS | pm); break; case SND_SOC_BIAS_STANDBY: - if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { + if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { if (gpio_is_valid(pdata->gpio_power)) { gpio_set_value(pdata->gpio_power, 1); mdelay(1); - uda1380_reset(codec); + uda1380_reset(component); } - uda1380_sync_cache(codec); + uda1380_sync_cache(component); } - uda1380_write(codec, UDA1380_PM, 0x0); + uda1380_write(component, UDA1380_PM, 0x0); break; case SND_SOC_BIAS_OFF: if (!gpio_is_valid(pdata->gpio_power)) @@ -694,16 +694,16 @@ static struct snd_soc_dai_driver uda1380_dai[] = { }, }; -static int uda1380_probe(struct snd_soc_codec *codec) +static int uda1380_probe(struct snd_soc_component *component) { - struct uda1380_platform_data *pdata =codec->dev->platform_data; - struct uda1380_priv *uda1380 = snd_soc_codec_get_drvdata(codec); + struct uda1380_platform_data *pdata =component->dev->platform_data; + struct uda1380_priv *uda1380 = snd_soc_component_get_drvdata(component); int ret; - uda1380->codec = codec; + uda1380->component = component; if (!gpio_is_valid(pdata->gpio_power)) { - ret = uda1380_reset(codec); + ret = uda1380_reset(component); if (ret) return ret; } @@ -713,10 +713,10 @@ static int uda1380_probe(struct snd_soc_codec *codec) /* set clock input */ switch (pdata->dac_clk) { case UDA1380_DAC_CLK_SYSCLK: - uda1380_write_reg_cache(codec, UDA1380_CLK, 0); + uda1380_write_reg_cache(component, UDA1380_CLK, 0); break; case UDA1380_DAC_CLK_WSPLL: - uda1380_write_reg_cache(codec, UDA1380_CLK, + uda1380_write_reg_cache(component, UDA1380_CLK, R00_DAC_CLK); break; } @@ -724,21 +724,22 @@ static int uda1380_probe(struct snd_soc_codec *codec) return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_uda1380 = { - .probe = uda1380_probe, - .read = uda1380_read_reg_cache, - .write = uda1380_write, - .set_bias_level = uda1380_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = uda1380_snd_controls, - .num_controls = ARRAY_SIZE(uda1380_snd_controls), - .dapm_widgets = uda1380_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(uda1380_dapm_widgets), - .dapm_routes = uda1380_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(uda1380_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_uda1380 = { + .probe = uda1380_probe, + .read = uda1380_read_reg_cache, + .write = uda1380_write, + .set_bias_level = uda1380_set_bias_level, + .controls = uda1380_snd_controls, + .num_controls = ARRAY_SIZE(uda1380_snd_controls), + .dapm_widgets = uda1380_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(uda1380_dapm_widgets), + .dapm_routes = uda1380_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(uda1380_dapm_routes), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int uda1380_i2c_probe(struct i2c_client *i2c, @@ -780,17 +781,11 @@ static int uda1380_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, uda1380); uda1380->i2c = i2c; - ret = snd_soc_register_codec(&i2c->dev, - &soc_codec_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai)); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_uda1380, uda1380_dai, ARRAY_SIZE(uda1380_dai)); return ret; } -static int uda1380_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - return 0; -} - static const struct i2c_device_id uda1380_i2c_id[] = { { "uda1380", 0 }, { } @@ -809,7 +804,6 @@ static struct i2c_driver uda1380_i2c_driver = { .of_match_table = uda1380_of_match, }, .probe = uda1380_i2c_probe, - .remove = uda1380_i2c_remove, .id_table = uda1380_i2c_id, }; diff --git a/sound/soc/codecs/wl1273.c b/sound/soc/codecs/wl1273.c index 942f1644973e..929ef1fdbb69 100644 --- a/sound/soc/codecs/wl1273.c +++ b/sound/soc/codecs/wl1273.c @@ -172,8 +172,8 @@ out: static int snd_wl1273_get_audio_route(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); ucontrol->value.enumerated.item[0] = wl1273->mode; @@ -190,14 +190,14 @@ static const char * const wl1273_audio_route[] = { "Bt", "FmRx", "FmTx" }; static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); if (wl1273->mode == ucontrol->value.enumerated.item[0]) return 0; /* Do not allow changes while stream is running */ - if (snd_soc_codec_is_active(codec)) + if (snd_soc_component_is_active(component)) return -EPERM; if (ucontrol->value.enumerated.item[0] >= ARRAY_SIZE(wl1273_audio_route)) @@ -213,10 +213,10 @@ static SOC_ENUM_SINGLE_EXT_DECL(wl1273_enum, wl1273_audio_route); static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s: enter.\n", __func__); + dev_dbg(component->dev, "%s: enter.\n", __func__); ucontrol->value.enumerated.item[0] = wl1273->core->audio_mode; @@ -226,11 +226,11 @@ static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol, static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); int val, r = 0; - dev_dbg(codec->dev, "%s: enter.\n", __func__); + dev_dbg(component->dev, "%s: enter.\n", __func__); val = ucontrol->value.enumerated.item[0]; if (wl1273->core->audio_mode == val) @@ -250,10 +250,10 @@ static SOC_ENUM_SINGLE_EXT_DECL(wl1273_audio_enum, wl1273_audio_strings); static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s: enter.\n", __func__); + dev_dbg(component->dev, "%s: enter.\n", __func__); ucontrol->value.integer.value[0] = wl1273->core->volume; @@ -263,11 +263,11 @@ static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol, static int snd_wl1273_fm_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); int r; - dev_dbg(codec->dev, "%s: enter.\n", __func__); + dev_dbg(component->dev, "%s: enter.\n", __func__); r = wl1273->core->set_volume(wl1273->core, ucontrol->value.integer.value[0]); @@ -301,8 +301,8 @@ static const struct snd_soc_dapm_route wl1273_dapm_routes[] = { static int wl1273_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = dai->component; + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); switch (wl1273->mode) { case WL1273_MODE_BT: @@ -335,7 +335,7 @@ static int wl1273_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(dai->codec); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(dai->component); struct wl1273_core *core = wl1273->core; unsigned int rate, width, r; @@ -415,14 +415,14 @@ static struct snd_soc_dai_driver wl1273_dai = { }; /* Audio interface format for the soc_card driver */ -int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt) +int wl1273_get_format(struct snd_soc_component *component, unsigned int *fmt) { struct wl1273_priv *wl1273; - if (codec == NULL || fmt == NULL) + if (component == NULL || fmt == NULL) return -EINVAL; - wl1273 = snd_soc_codec_get_drvdata(codec); + wl1273 = snd_soc_component_get_drvdata(component); switch (wl1273->mode) { case WL1273_MODE_FM_RX: @@ -446,15 +446,15 @@ int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt) } EXPORT_SYMBOL_GPL(wl1273_get_format); -static int wl1273_probe(struct snd_soc_codec *codec) +static int wl1273_probe(struct snd_soc_component *component) { - struct wl1273_core **core = codec->dev->platform_data; + struct wl1273_core **core = component->dev->platform_data; struct wl1273_priv *wl1273; - dev_dbg(codec->dev, "%s.\n", __func__); + dev_dbg(component->dev, "%s.\n", __func__); if (!core) { - dev_err(codec->dev, "Platform data is missing.\n"); + dev_err(component->dev, "Platform data is missing.\n"); return -EINVAL; } @@ -465,44 +465,43 @@ static int wl1273_probe(struct snd_soc_codec *codec) wl1273->mode = WL1273_MODE_BT; wl1273->core = *core; - snd_soc_codec_set_drvdata(codec, wl1273); + snd_soc_component_set_drvdata(component, wl1273); return 0; } -static int wl1273_remove(struct snd_soc_codec *codec) +static void wl1273_remove(struct snd_soc_component *component) { - struct wl1273_priv *wl1273 = snd_soc_codec_get_drvdata(codec); + struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component); - dev_dbg(codec->dev, "%s\n", __func__); + dev_dbg(component->dev, "%s\n", __func__); kfree(wl1273); - - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_wl1273 = { - .probe = wl1273_probe, - .remove = wl1273_remove, - - .component_driver = { - .controls = wl1273_controls, - .num_controls = ARRAY_SIZE(wl1273_controls), - .dapm_widgets = wl1273_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wl1273_dapm_widgets), - .dapm_routes = wl1273_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wl1273_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_wl1273 = { + .probe = wl1273_probe, + .remove = wl1273_remove, + .controls = wl1273_controls, + .num_controls = ARRAY_SIZE(wl1273_controls), + .dapm_widgets = wl1273_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wl1273_dapm_widgets), + .dapm_routes = wl1273_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wl1273_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wl1273_platform_probe(struct platform_device *pdev) { - return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wl1273, + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wl1273, &wl1273_dai, 1); } static int wl1273_platform_remove(struct platform_device *pdev) { - snd_soc_unregister_codec(&pdev->dev); return 0; } diff --git a/sound/soc/codecs/wl1273.h b/sound/soc/codecs/wl1273.h index 43ec7e668c51..43a81d5cab4d 100644 --- a/sound/soc/codecs/wl1273.h +++ b/sound/soc/codecs/wl1273.h @@ -25,6 +25,6 @@ #ifndef __WL1273_CODEC_H__ #define __WL1273_CODEC_H__ -int wl1273_get_format(struct snd_soc_codec *codec, unsigned int *fmt); +int wl1273_get_format(struct snd_soc_component *component, unsigned int *fmt); #endif /* End of __WL1273_CODEC_H__ */ diff --git a/sound/soc/codecs/wm1250-ev1.c b/sound/soc/codecs/wm1250-ev1.c index cf5f0580df6a..9727eec6d01b 100644 --- a/sound/soc/codecs/wm1250-ev1.c +++ b/sound/soc/codecs/wm1250-ev1.c @@ -32,10 +32,10 @@ struct wm1250_priv { struct gpio gpios[WM1250_EV1_NUM_GPIOS]; }; -static int wm1250_ev1_set_bias_level(struct snd_soc_codec *codec, +static int wm1250_ev1_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { - struct wm1250_priv *wm1250 = dev_get_drvdata(codec->dev); + struct wm1250_priv *wm1250 = dev_get_drvdata(component->dev); int ena; if (wm1250) @@ -81,7 +81,7 @@ static int wm1250_ev1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct wm1250_priv *wm1250 = snd_soc_codec_get_drvdata(dai->codec); + struct wm1250_priv *wm1250 = snd_soc_component_get_drvdata(dai->component); switch (params_rate(params)) { case 8000: @@ -141,15 +141,15 @@ static struct snd_soc_dai_driver wm1250_ev1_dai = { .ops = &wm1250_ev1_ops, }; -static const struct snd_soc_codec_driver soc_codec_dev_wm1250_ev1 = { - .component_driver = { - .dapm_widgets = wm1250_ev1_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm1250_ev1_dapm_widgets), - .dapm_routes = wm1250_ev1_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wm1250_ev1_dapm_routes), - }, - .set_bias_level = wm1250_ev1_set_bias_level, - .idle_bias_off = true, +static const struct snd_soc_component_driver soc_component_dev_wm1250_ev1 = { + .dapm_widgets = wm1250_ev1_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm1250_ev1_dapm_widgets), + .dapm_routes = wm1250_ev1_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wm1250_ev1_dapm_routes), + .set_bias_level = wm1250_ev1_set_bias_level, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm1250_ev1_pdata(struct i2c_client *i2c) @@ -224,7 +224,7 @@ static int wm1250_ev1_probe(struct i2c_client *i2c, if (ret != 0) return ret; - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm1250_ev1, + ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_wm1250_ev1, &wm1250_ev1_dai, 1); if (ret != 0) { dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); @@ -237,7 +237,6 @@ static int wm1250_ev1_probe(struct i2c_client *i2c, static int wm1250_ev1_remove(struct i2c_client *i2c) { - snd_soc_unregister_codec(&i2c->dev); wm1250_ev1_free(i2c); return 0; diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c index abfa052c07d8..c5ae07234a00 100644 --- a/sound/soc/codecs/wm2000.c +++ b/sound/soc/codecs/wm2000.c @@ -607,8 +607,8 @@ static int wm2000_anc_set_mode(struct wm2000_priv *wm2000) static int wm2000_anc_mode_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); ucontrol->value.integer.value[0] = wm2000->anc_active; @@ -618,8 +618,8 @@ static int wm2000_anc_mode_get(struct snd_kcontrol *kcontrol, static int wm2000_anc_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); unsigned int anc_active = ucontrol->value.integer.value[0]; int ret; @@ -640,8 +640,8 @@ static int wm2000_anc_mode_put(struct snd_kcontrol *kcontrol, static int wm2000_speaker_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); ucontrol->value.integer.value[0] = wm2000->spk_ena; @@ -651,8 +651,8 @@ static int wm2000_speaker_get(struct snd_kcontrol *kcontrol, static int wm2000_speaker_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); unsigned int val = ucontrol->value.integer.value[0]; int ret; @@ -683,8 +683,8 @@ static const struct snd_kcontrol_new wm2000_controls[] = { static int wm2000_anc_power_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); int ret; mutex_lock(&wm2000->lock); @@ -724,16 +724,16 @@ static const struct snd_soc_dapm_route wm2000_audio_map[] = { }; #ifdef CONFIG_PM -static int wm2000_suspend(struct snd_soc_codec *codec) +static int wm2000_suspend(struct snd_soc_component *component) { - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); return wm2000_anc_transition(wm2000, ANC_OFF); } -static int wm2000_resume(struct snd_soc_codec *codec) +static int wm2000_resume(struct snd_soc_component *component) { - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); return wm2000_anc_set_mode(wm2000); } @@ -782,9 +782,9 @@ static const struct regmap_config wm2000_regmap = { .readable_reg = wm2000_readable_reg, }; -static int wm2000_probe(struct snd_soc_codec *codec) +static int wm2000_probe(struct snd_soc_component *component) { - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); /* This will trigger a transition to standby mode by default */ wm2000_anc_set_mode(wm2000); @@ -792,27 +792,28 @@ static int wm2000_probe(struct snd_soc_codec *codec) return 0; } -static int wm2000_remove(struct snd_soc_codec *codec) +static void wm2000_remove(struct snd_soc_component *component) { - struct wm2000_priv *wm2000 = dev_get_drvdata(codec->dev); + struct wm2000_priv *wm2000 = dev_get_drvdata(component->dev); - return wm2000_anc_transition(wm2000, ANC_OFF); + wm2000_anc_transition(wm2000, ANC_OFF); } -static const struct snd_soc_codec_driver soc_codec_dev_wm2000 = { - .probe = wm2000_probe, - .remove = wm2000_remove, - .suspend = wm2000_suspend, - .resume = wm2000_resume, - - .component_driver = { - .controls = wm2000_controls, - .num_controls = ARRAY_SIZE(wm2000_controls), - .dapm_widgets = wm2000_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm2000_dapm_widgets), - .dapm_routes = wm2000_audio_map, - .num_dapm_routes = ARRAY_SIZE(wm2000_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_wm2000 = { + .probe = wm2000_probe, + .remove = wm2000_remove, + .suspend = wm2000_suspend, + .resume = wm2000_resume, + .controls = wm2000_controls, + .num_controls = ARRAY_SIZE(wm2000_controls), + .dapm_widgets = wm2000_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm2000_dapm_widgets), + .dapm_routes = wm2000_audio_map, + .num_dapm_routes = ARRAY_SIZE(wm2000_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm2000_i2c_probe(struct i2c_client *i2c, @@ -916,7 +917,8 @@ static int wm2000_i2c_probe(struct i2c_client *i2c, wm2000_reset(wm2000); - ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm2000, NULL, 0); + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_wm2000, NULL, 0); err_supplies: regulator_bulk_disable(WM2000_NUM_SUPPLIES, wm2000->supplies); @@ -926,13 +928,6 @@ out: return ret; } -static int wm2000_i2c_remove(struct i2c_client *i2c) -{ - snd_soc_unregister_codec(&i2c->dev); - - return 0; -} - static const struct i2c_device_id wm2000_i2c_id[] = { { "wm2000", 0 }, { } @@ -944,7 +939,6 @@ static struct i2c_driver wm2000_i2c_driver = { .name = "wm2000", }, .probe = wm2000_i2c_probe, - .remove = wm2000_i2c_remove, .id_table = wm2000_i2c_id, }; diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index fc066caa1918..1ac83388d1b8 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c @@ -34,6 +34,8 @@ #include "wm5102.h" #include "wm_adsp.h" +#define DRV_NAME "wm5102-codec" + struct wm5102_priv { struct arizona_priv core; struct arizona_fll fll[2]; @@ -581,8 +583,8 @@ static const struct reg_default wm5102_sysclk_revb_patch[] = { static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); struct regmap *regmap = arizona->regmap; const struct reg_default *patch = NULL; int i, patch_size; @@ -618,10 +620,10 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, } static int wm5102_adsp_power_ev(struct snd_soc_dapm_widget *w, - struct snd_kcontrol *kcontrol, int event) + struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); unsigned int v = 0; int ret; @@ -629,7 +631,7 @@ static int wm5102_adsp_power_ev(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMU: ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v); if (ret != 0) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret); return -EIO; } @@ -637,9 +639,9 @@ static int wm5102_adsp_power_ev(struct snd_soc_dapm_widget *w, v = (v & ARIZONA_SYSCLK_FREQ_MASK) >> ARIZONA_SYSCLK_FREQ_SHIFT; if (v >= 3) { - ret = arizona_dvfs_up(codec, ARIZONA_DVFS_ADSP1_RQ); + ret = arizona_dvfs_up(component, ARIZONA_DVFS_ADSP1_RQ); if (ret) { - dev_err(codec->dev, + dev_err(component->dev, "Failed to raise DVFS: %d\n", ret); return ret; } @@ -647,9 +649,9 @@ static int wm5102_adsp_power_ev(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMD: - ret = arizona_dvfs_down(codec, ARIZONA_DVFS_ADSP1_RQ); + ret = arizona_dvfs_down(component, ARIZONA_DVFS_ADSP1_RQ); if (ret) - dev_warn(codec->dev, + dev_warn(component->dev, "Failed to lower DVFS: %d\n", ret); break; @@ -663,8 +665,8 @@ static int wm5102_adsp_power_ev(struct snd_soc_dapm_widget *w, static int wm5102_out_comp_coeff_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); mutex_lock(&arizona->dac_comp_lock); put_unaligned_be16(arizona->dac_comp_coeff, @@ -677,8 +679,8 @@ static int wm5102_out_comp_coeff_get(struct snd_kcontrol *kcontrol, static int wm5102_out_comp_coeff_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); mutex_lock(&arizona->dac_comp_lock); memcpy(&arizona->dac_comp_coeff, ucontrol->value.bytes.data, @@ -692,8 +694,8 @@ static int wm5102_out_comp_coeff_put(struct snd_kcontrol *kcontrol, static int wm5102_out_comp_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); mutex_lock(&arizona->dac_comp_lock); ucontrol->value.integer.value[0] = arizona->dac_comp_enabled; @@ -705,8 +707,8 @@ static int wm5102_out_comp_switch_get(struct snd_kcontrol *kcontrol, static int wm5102_out_comp_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); mutex_lock(&arizona->dac_comp_lock); arizona->dac_comp_enabled = ucontrol->value.integer.value[0]; @@ -715,7 +717,7 @@ static int wm5102_out_comp_switch_put(struct snd_kcontrol *kcontrol, return 0; } -static const char *wm5102_osr_text[] = { +static const char * const wm5102_osr_text[] = { "Low power", "Normal", "High performance", }; @@ -1060,7 +1062,7 @@ ARIZONA_MIXER_ENUMS(DSP1R, ARIZONA_DSP1RMIX_INPUT_1_SOURCE); ARIZONA_DSP_AUX_ENUMS(DSP1, ARIZONA_DSP1AUX1MIX_INPUT_1_SOURCE); -static const char *wm5102_aec_loopback_texts[] = { +static const char * const wm5102_aec_loopback_texts[] = { "HPOUT1L", "HPOUT1R", "HPOUT2L", "HPOUT2R", "EPOUT", "SPKOUTL", "SPKOUTR", "SPKDAT1L", "SPKDAT1R", }; @@ -1315,8 +1317,7 @@ SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0, ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &wm5102_aec_loopback_mux), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, &wm5102_aec_loopback_mux), SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, @@ -1734,10 +1735,10 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = { { "DRC1 Signal Activity", NULL, "DRC1R" }, }; -static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source, - unsigned int Fref, unsigned int Fout) +static int wm5102_set_fll(struct snd_soc_component *component, int fll_id, + int source, unsigned int Fref, unsigned int Fout) { - struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec); + struct wm5102_priv *wm5102 = snd_soc_component_get_drvdata(component); switch (fll_id) { case WM5102_FLL1: @@ -1910,7 +1911,8 @@ static struct snd_soc_dai_driver wm5102_dai[] = { static int wm5102_open(struct snd_compr_stream *stream) { struct snd_soc_pcm_runtime *rtd = stream->private_data; - struct wm5102_priv *priv = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct wm5102_priv *priv = snd_soc_component_get_drvdata(component); return wm_adsp_compr_open(&priv->core.adsp[0], stream); } @@ -1930,30 +1932,29 @@ static irqreturn_t wm5102_adsp2_irq(int irq, void *data) return IRQ_HANDLED; } -static int wm5102_codec_probe(struct snd_soc_codec *codec) +static int wm5102_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); - struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct wm5102_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int ret; - snd_soc_codec_init_regmap(codec, arizona->regmap); + snd_soc_component_init_regmap(component, arizona->regmap); - ret = wm_adsp2_codec_probe(&priv->core.adsp[0], codec); + ret = wm_adsp2_component_probe(&priv->core.adsp[0], component); if (ret) return ret; - ret = snd_soc_add_codec_controls(codec, - arizona_adsp2_rate_controls, 1); + ret = snd_soc_add_component_controls(component, + arizona_adsp2_rate_controls, 1); if (ret) goto err_adsp2_codec_probe; - ret = arizona_init_spk(codec); + ret = arizona_init_spk(component); if (ret < 0) return ret; - arizona_init_gpio(codec); + arizona_init_gpio(component); snd_soc_component_disable_pin(component, "HAPTICS"); @@ -1962,20 +1963,18 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec) return 0; err_adsp2_codec_probe: - wm_adsp2_codec_remove(&priv->core.adsp[0], codec); + wm_adsp2_component_remove(&priv->core.adsp[0], component); return ret; } -static int wm5102_codec_remove(struct snd_soc_codec *codec) +static void wm5102_component_remove(struct snd_soc_component *component) { - struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec); + struct wm5102_priv *priv = snd_soc_component_get_drvdata(component); - wm_adsp2_codec_remove(&priv->core.adsp[0], codec); + wm_adsp2_component_remove(&priv->core.adsp[0], component); priv->core.arizona->dapm = NULL; - - return 0; } #define WM5102_DIG_VU 0x0200 @@ -1992,37 +1991,32 @@ static unsigned int wm5102_digital_vu[] = { ARIZONA_DAC_DIGITAL_VOLUME_5R, }; -static const struct snd_soc_codec_driver soc_codec_dev_wm5102 = { - .probe = wm5102_codec_probe, - .remove = wm5102_codec_remove, - - .idle_bias_off = true, - - .set_sysclk = arizona_set_sysclk, - .set_pll = wm5102_set_fll, - - .component_driver = { - .controls = wm5102_snd_controls, - .num_controls = ARRAY_SIZE(wm5102_snd_controls), - .dapm_widgets = wm5102_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm5102_dapm_widgets), - .dapm_routes = wm5102_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wm5102_dapm_routes), - }, -}; - -static const struct snd_compr_ops wm5102_compr_ops = { - .open = wm5102_open, - .free = wm_adsp_compr_free, - .set_params = wm_adsp_compr_set_params, - .get_caps = wm_adsp_compr_get_caps, - .trigger = wm_adsp_compr_trigger, - .pointer = wm_adsp_compr_pointer, - .copy = wm_adsp_compr_copy, +static struct snd_compr_ops wm5102_compr_ops = { + .open = wm5102_open, + .free = wm_adsp_compr_free, + .set_params = wm_adsp_compr_set_params, + .get_caps = wm_adsp_compr_get_caps, + .trigger = wm_adsp_compr_trigger, + .pointer = wm_adsp_compr_pointer, + .copy = wm_adsp_compr_copy, }; -static const struct snd_soc_platform_driver wm5102_compr_platform = { - .compr_ops = &wm5102_compr_ops, +static const struct snd_soc_component_driver soc_component_dev_wm5102 = { + .probe = wm5102_component_probe, + .remove = wm5102_component_remove, + .set_sysclk = arizona_set_sysclk, + .set_pll = wm5102_set_fll, + .name = DRV_NAME, + .compr_ops = &wm5102_compr_ops, + .controls = wm5102_snd_controls, + .num_controls = ARRAY_SIZE(wm5102_snd_controls), + .dapm_widgets = wm5102_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm5102_dapm_widgets), + .dapm_routes = wm5102_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wm5102_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm5102_probe(struct platform_device *pdev) @@ -2109,23 +2103,17 @@ static int wm5102_probe(struct platform_device *pdev) if (ret < 0) goto err_dsp_irq; - ret = snd_soc_register_platform(&pdev->dev, &wm5102_compr_platform); + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm5102, + wm5102_dai, + ARRAY_SIZE(wm5102_dai)); if (ret < 0) { - dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); + dev_err(&pdev->dev, "Failed to register component: %d\n", ret); goto err_spk_irqs; } - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5102, - wm5102_dai, ARRAY_SIZE(wm5102_dai)); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); - goto err_platform; - } - return ret; -err_platform: - snd_soc_unregister_platform(&pdev->dev); err_spk_irqs: arizona_free_spk_irqs(arizona); err_dsp_irq: @@ -2139,8 +2127,6 @@ static int wm5102_remove(struct platform_device *pdev) struct wm5102_priv *wm5102 = platform_get_drvdata(pdev); struct arizona *arizona = wm5102->core.arizona; - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); wm_adsp2_remove(&wm5102->core.adsp[0]); diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index fb0cf9c61f48..fb9835dcd836 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c @@ -35,6 +35,8 @@ #define WM5110_NUM_ADSP 4 +#define DRV_NAME "wm5110-codec" + struct wm5110_priv { struct arizona_priv core; struct arizona_fll fll[2]; @@ -159,8 +161,8 @@ static const struct reg_default wm5110_sysclk_reve_patch[] = { static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); struct regmap *regmap = arizona->regmap; const struct reg_default *patch = NULL; int i, patch_size; @@ -196,14 +198,14 @@ static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, static int wm5110_adsp_power_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); unsigned int v; int ret; ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v); if (ret != 0) { - dev_err(codec->dev, "Failed to read SYSCLK state: %d\n", ret); + dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret); return ret; } @@ -286,10 +288,10 @@ static const struct reg_sequence wm5110_dre_right_enable[] = { static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; - unsigned int val = snd_soc_read(codec, ARIZONA_DRE_ENABLE); + unsigned int val = snd_soc_component_read32(component, ARIZONA_DRE_ENABLE); const struct reg_sequence *wseq; int nregs; @@ -323,26 +325,32 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w) static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); - unsigned int val = snd_soc_read(codec, ARIZONA_DRE_ENABLE); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); + unsigned int val = snd_soc_component_read32(component, ARIZONA_DRE_ENABLE); switch (w->shift) { case ARIZONA_OUT1L_ENA_SHIFT: if (!(val & ARIZONA_DRE1L_ENA_MASK)) { - snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, - ARIZONA_WS_TRG1, ARIZONA_WS_TRG1); - snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, - ARIZONA_WS_TRG1, 0); + snd_soc_component_update_bits(component, + ARIZONA_SPARE_TRIGGERS, + ARIZONA_WS_TRG1, + ARIZONA_WS_TRG1); + snd_soc_component_update_bits(component, + ARIZONA_SPARE_TRIGGERS, + ARIZONA_WS_TRG1, 0); priv->out_down_delay += 27; } break; case ARIZONA_OUT1R_ENA_SHIFT: if (!(val & ARIZONA_DRE1R_ENA_MASK)) { - snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, - ARIZONA_WS_TRG2, ARIZONA_WS_TRG2); - snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, - ARIZONA_WS_TRG2, 0); + snd_soc_component_update_bits(component, + ARIZONA_SPARE_TRIGGERS, + ARIZONA_WS_TRG2, + ARIZONA_WS_TRG2); + snd_soc_component_update_bits(component, + ARIZONA_SPARE_TRIGGERS, + ARIZONA_WS_TRG2, 0); priv->out_down_delay += 27; } break; @@ -356,8 +364,8 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w) static int wm5110_hp_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); switch (priv->arizona->rev) { case 0 ... 3: @@ -395,9 +403,9 @@ static int wm5110_clear_pga_volume(struct arizona *arizona, int output) static int wm5110_put_dre(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int ena, dre; @@ -456,8 +464,8 @@ err: static int wm5110_in_pga_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int ret; /* @@ -476,8 +484,8 @@ static int wm5110_in_pga_get(struct snd_kcontrol *kcontrol, static int wm5110_in_pga_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int ret; /* @@ -496,9 +504,9 @@ static int wm5110_in_pga_put(struct snd_kcontrol *kcontrol, static int wm5110_in_analog_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); - struct wm5110_priv *wm5110 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); + struct wm5110_priv *wm5110 = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; unsigned int reg, mask; struct reg_sequence analog_seq[] = { @@ -517,9 +525,9 @@ static int wm5110_in_analog_ev(struct snd_soc_dapm_widget *w, wm5110->in_post_pending++; return 0; case SND_SOC_DAPM_PRE_PMU: - wm5110->in_pga_cache[w->shift] = snd_soc_read(codec, reg); + wm5110->in_pga_cache[w->shift] = snd_soc_component_read32(component, reg); - snd_soc_update_bits(codec, reg, mask, + snd_soc_component_update_bits(component, reg, mask, 0x40 << ARIZONA_IN1L_PGA_VOL_SHIFT); wm5110->in_pre_pending--; @@ -536,8 +544,8 @@ static int wm5110_in_analog_ev(struct snd_soc_dapm_widget *w, break; case SND_SOC_DAPM_POST_PMU: - snd_soc_update_bits(codec, reg, mask, - wm5110->in_pga_cache[w->shift]); + snd_soc_component_update_bits(component, reg, mask, + wm5110->in_pga_cache[w->shift]); wm5110->in_post_pending--; if (wm5110->in_post_pending == 0) @@ -555,13 +563,13 @@ static int wm5110_in_analog_ev(struct snd_soc_dapm_widget *w, static int wm5110_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->arizona; switch (arizona->rev) { case 0 ... 4: - if (arizona_input_analog(codec, w->shift)) + if (arizona_input_analog(component, w->shift)) wm5110_in_analog_ev(w, kcontrol, event); break; @@ -861,14 +869,14 @@ SOC_DOUBLE("SPKDAT2 Switch", ARIZONA_PDM_SPK2_CTRL_1, ARIZONA_SPK2L_MUTE_SHIFT, ARIZONA_SPK2R_MUTE_SHIFT, 1, 1), SOC_DOUBLE_EXT("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE, - ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0, - snd_soc_get_volsw, wm5110_put_dre), + ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0, + snd_soc_get_volsw, wm5110_put_dre), SOC_DOUBLE_EXT("HPOUT2 DRE Switch", ARIZONA_DRE_ENABLE, - ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0, - snd_soc_get_volsw, wm5110_put_dre), + ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0, + snd_soc_get_volsw, wm5110_put_dre), SOC_DOUBLE_EXT("HPOUT3 DRE Switch", ARIZONA_DRE_ENABLE, - ARIZONA_DRE3L_ENA_SHIFT, ARIZONA_DRE3R_ENA_SHIFT, 1, 0, - snd_soc_get_volsw, wm5110_put_dre), + ARIZONA_DRE3L_ENA_SHIFT, ARIZONA_DRE3R_ENA_SHIFT, 1, 0, + snd_soc_get_volsw, wm5110_put_dre), SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp), SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp), @@ -1034,7 +1042,7 @@ ARIZONA_MUX_ENUMS(ISRC3DEC2, ARIZONA_ISRC3DEC2MIX_INPUT_1_SOURCE); ARIZONA_MUX_ENUMS(ISRC3DEC3, ARIZONA_ISRC3DEC3MIX_INPUT_1_SOURCE); ARIZONA_MUX_ENUMS(ISRC3DEC4, ARIZONA_ISRC3DEC4MIX_INPUT_1_SOURCE); -static const char *wm5110_aec_loopback_texts[] = { +static const char * const wm5110_aec_loopback_texts[] = { "HPOUT1L", "HPOUT1R", "HPOUT2L", "HPOUT2R", "HPOUT3L", "HPOUT3R", "SPKOUTL", "SPKOUTR", "SPKDAT1L", "SPKDAT1R", "SPKDAT2L", "SPKDAT2R", }; @@ -1272,18 +1280,17 @@ SND_SOC_DAPM_PGA("ISRC3DEC4", ARIZONA_ISRC_3_CTRL_3, ARIZONA_ISRC3_DEC3_ENA_SHIFT, 0, NULL, 0), SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &wm5110_aec_loopback_mux), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, &wm5110_aec_loopback_mux), SND_SOC_DAPM_SUPPLY("RXANC NG External Clock", SND_SOC_NOPM, - ARIZONA_EXT_NG_SEL_SET_SHIFT, 0, arizona_anc_ev, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + ARIZONA_EXT_NG_SEL_SET_SHIFT, 0, arizona_anc_ev, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_PGA("RXANCL NG External", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_PGA("RXANCR NG External", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_SUPPLY("RXANC NG Clock", SND_SOC_NOPM, - ARIZONA_CLK_NG_ENA_SET_SHIFT, 0, arizona_anc_ev, - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), + ARIZONA_CLK_NG_ENA_SET_SHIFT, 0, arizona_anc_ev, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_PGA("RXANCL NG Internal", SND_SOC_NOPM, 0, 0, NULL, 0), SND_SOC_DAPM_PGA("RXANCR NG Internal", SND_SOC_NOPM, 0, 0, NULL, 0), @@ -2032,10 +2039,10 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { { "DSP3 Voice Trigger", "Switch", "DSP3" }, }; -static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source, - unsigned int Fref, unsigned int Fout) +static int wm5110_set_fll(struct snd_soc_component *component, int fll_id, + int source, unsigned int Fref, unsigned int Fout) { - struct wm5110_priv *wm5110 = snd_soc_codec_get_drvdata(codec); + struct wm5110_priv *wm5110 = snd_soc_component_get_drvdata(component); switch (fll_id) { case WM5110_FLL1: @@ -2229,7 +2236,8 @@ static struct snd_soc_dai_driver wm5110_dai[] = { static int wm5110_open(struct snd_compr_stream *stream) { struct snd_soc_pcm_runtime *rtd = stream->private_data; - struct wm5110_priv *priv = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct wm5110_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int n_adsp; @@ -2275,33 +2283,32 @@ static irqreturn_t wm5110_adsp2_irq(int irq, void *data) return IRQ_HANDLED; } -static int wm5110_codec_probe(struct snd_soc_codec *codec) +static int wm5110_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); - struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct wm5110_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int i, ret; arizona->dapm = dapm; - snd_soc_codec_init_regmap(codec, arizona->regmap); + snd_soc_component_init_regmap(component, arizona->regmap); - ret = arizona_init_spk(codec); + ret = arizona_init_spk(component); if (ret < 0) return ret; - arizona_init_gpio(codec); - arizona_init_mono(codec); + arizona_init_gpio(component); + arizona_init_mono(component); for (i = 0; i < WM5110_NUM_ADSP; ++i) { - ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec); + ret = wm_adsp2_component_probe(&priv->core.adsp[i], component); if (ret) goto err_adsp2_codec_probe; } - ret = snd_soc_add_codec_controls(codec, - arizona_adsp2_rate_controls, - WM5110_NUM_ADSP); + ret = snd_soc_add_component_controls(component, + arizona_adsp2_rate_controls, + WM5110_NUM_ADSP); if (ret) goto err_adsp2_codec_probe; @@ -2311,22 +2318,20 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec) err_adsp2_codec_probe: for (--i; i >= 0; --i) - wm_adsp2_codec_remove(&priv->core.adsp[i], codec); + wm_adsp2_component_remove(&priv->core.adsp[i], component); return ret; } -static int wm5110_codec_remove(struct snd_soc_codec *codec) +static void wm5110_component_remove(struct snd_soc_component *component) { - struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); + struct wm5110_priv *priv = snd_soc_component_get_drvdata(component); int i; for (i = 0; i < WM5110_NUM_ADSP; ++i) - wm_adsp2_codec_remove(&priv->core.adsp[i], codec); + wm_adsp2_component_remove(&priv->core.adsp[i], component); priv->core.arizona->dapm = NULL; - - return 0; } #define WM5110_DIG_VU 0x0200 @@ -2346,37 +2351,32 @@ static unsigned int wm5110_digital_vu[] = { ARIZONA_DAC_DIGITAL_VOLUME_6R, }; -static const struct snd_soc_codec_driver soc_codec_dev_wm5110 = { - .probe = wm5110_codec_probe, - .remove = wm5110_codec_remove, - - .idle_bias_off = true, - - .set_sysclk = arizona_set_sysclk, - .set_pll = wm5110_set_fll, - - .component_driver = { - .controls = wm5110_snd_controls, - .num_controls = ARRAY_SIZE(wm5110_snd_controls), - .dapm_widgets = wm5110_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm5110_dapm_widgets), - .dapm_routes = wm5110_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wm5110_dapm_routes), - }, -}; - -static const struct snd_compr_ops wm5110_compr_ops = { - .open = wm5110_open, - .free = wm_adsp_compr_free, - .set_params = wm_adsp_compr_set_params, - .get_caps = wm_adsp_compr_get_caps, - .trigger = wm_adsp_compr_trigger, - .pointer = wm_adsp_compr_pointer, - .copy = wm_adsp_compr_copy, +static struct snd_compr_ops wm5110_compr_ops = { + .open = wm5110_open, + .free = wm_adsp_compr_free, + .set_params = wm_adsp_compr_set_params, + .get_caps = wm_adsp_compr_get_caps, + .trigger = wm_adsp_compr_trigger, + .pointer = wm_adsp_compr_pointer, + .copy = wm_adsp_compr_copy, }; -static const struct snd_soc_platform_driver wm5110_compr_platform = { - .compr_ops = &wm5110_compr_ops, +static const struct snd_soc_component_driver soc_component_dev_wm5110 = { + .probe = wm5110_component_probe, + .remove = wm5110_component_remove, + .set_sysclk = arizona_set_sysclk, + .set_pll = wm5110_set_fll, + .name = DRV_NAME, + .compr_ops = &wm5110_compr_ops, + .controls = wm5110_snd_controls, + .num_controls = ARRAY_SIZE(wm5110_snd_controls), + .dapm_widgets = wm5110_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm5110_dapm_widgets), + .dapm_routes = wm5110_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wm5110_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm5110_probe(struct platform_device *pdev) @@ -2464,23 +2464,17 @@ static int wm5110_probe(struct platform_device *pdev) if (ret < 0) goto err_dsp_irq; - ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform); + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm5110, + wm5110_dai, + ARRAY_SIZE(wm5110_dai)); if (ret < 0) { - dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); + dev_err(&pdev->dev, "Failed to register component: %d\n", ret); goto err_spk_irqs; } - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110, - wm5110_dai, ARRAY_SIZE(wm5110_dai)); - if (ret < 0) { - dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); - goto err_platform; - } - return ret; -err_platform: - snd_soc_unregister_platform(&pdev->dev); err_spk_irqs: arizona_free_spk_irqs(arizona); err_dsp_irq: @@ -2495,8 +2489,6 @@ static int wm5110_remove(struct platform_device *pdev) struct arizona *arizona = wm5110->core.arizona; int i; - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); for (i = 0; i < WM5110_NUM_ADSP; i++) diff --git a/sound/soc/codecs/wm8997.c b/sound/soc/codecs/wm8997.c index cac9b3e7e15d..df5b36b8fc5a 100644 --- a/sound/soc/codecs/wm8997.c +++ b/sound/soc/codecs/wm8997.c @@ -84,8 +84,8 @@ static const struct reg_default wm8997_sysclk_reva_patch[] = { static int wm8997_sysclk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct arizona *arizona = dev_get_drvdata(codec->dev->parent); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct arizona *arizona = dev_get_drvdata(component->dev->parent); struct regmap *regmap = arizona->regmap; const struct reg_default *patch = NULL; int i, patch_size; @@ -118,7 +118,7 @@ static int wm8997_sysclk_ev(struct snd_soc_dapm_widget *w, return arizona_dvfs_sysclk_ev(w, kcontrol, event); } -static const char *wm8997_osr_text[] = { +static const char * const wm8997_osr_text[] = { "Low power", "Normal", "High performance", }; @@ -609,8 +609,7 @@ SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0, ARIZONA_SLIMRX8_ENA_SHIFT, 0), SND_SOC_DAPM_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &wm8997_aec_loopback_mux), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, &wm8997_aec_loopback_mux), SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, @@ -927,10 +926,10 @@ static const struct snd_soc_dapm_route wm8997_dapm_routes[] = { { "MICSUPP", NULL, "SYSCLK" }, }; -static int wm8997_set_fll(struct snd_soc_codec *codec, int fll_id, int source, - unsigned int Fref, unsigned int Fout) +static int wm8997_set_fll(struct snd_soc_component *component, int fll_id, + int source, unsigned int Fref, unsigned int Fout) { - struct wm8997_priv *wm8997 = snd_soc_codec_get_drvdata(codec); + struct wm8997_priv *wm8997 = snd_soc_component_get_drvdata(component); switch (fll_id) { case WM8997_FLL1: @@ -1057,17 +1056,16 @@ static struct snd_soc_dai_driver wm8997_dai[] = { }, }; -static int wm8997_codec_probe(struct snd_soc_codec *codec) +static int wm8997_component_probe(struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); - struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct wm8997_priv *priv = snd_soc_component_get_drvdata(component); struct arizona *arizona = priv->core.arizona; int ret; - snd_soc_codec_init_regmap(codec, arizona->regmap); + snd_soc_component_init_regmap(component, arizona->regmap); - ret = arizona_init_spk(codec); + ret = arizona_init_spk(component); if (ret < 0) return ret; @@ -1078,13 +1076,11 @@ static int wm8997_codec_probe(struct snd_soc_codec *codec) return 0; } -static int wm8997_codec_remove(struct snd_soc_codec *codec) +static void wm8997_component_remove(struct snd_soc_component *component) { - struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec); + struct wm8997_priv *priv = snd_soc_component_get_drvdata(component); priv->core.arizona->dapm = NULL; - - return 0; } #define WM8997_DIG_VU 0x0200 @@ -1098,23 +1094,20 @@ static unsigned int wm8997_digital_vu[] = { ARIZONA_DAC_DIGITAL_VOLUME_5R, }; -static const struct snd_soc_codec_driver soc_codec_dev_wm8997 = { - .probe = wm8997_codec_probe, - .remove = wm8997_codec_remove, - - .idle_bias_off = true, - - .set_sysclk = arizona_set_sysclk, - .set_pll = wm8997_set_fll, - - .component_driver = { - .controls = wm8997_snd_controls, - .num_controls = ARRAY_SIZE(wm8997_snd_controls), - .dapm_widgets = wm8997_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm8997_dapm_widgets), - .dapm_routes = wm8997_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wm8997_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_wm8997 = { + .probe = wm8997_component_probe, + .remove = wm8997_component_remove, + .set_sysclk = arizona_set_sysclk, + .set_pll = wm8997_set_fll, + .controls = wm8997_snd_controls, + .num_controls = ARRAY_SIZE(wm8997_snd_controls), + .dapm_widgets = wm8997_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm8997_dapm_widgets), + .dapm_routes = wm8997_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wm8997_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm8997_probe(struct platform_device *pdev) @@ -1178,10 +1171,12 @@ static int wm8997_probe(struct platform_device *pdev) if (ret < 0) return ret; - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997, - wm8997_dai, ARRAY_SIZE(wm8997_dai)); + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm8997, + wm8997_dai, + ARRAY_SIZE(wm8997_dai)); if (ret < 0) { - dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); + dev_err(&pdev->dev, "Failed to register component: %d\n", ret); goto err_spk_irqs; } @@ -1196,7 +1191,6 @@ static int wm8997_remove(struct platform_device *pdev) struct wm8997_priv *wm8997 = platform_get_drvdata(pdev); struct arizona *arizona = wm8997->core.arizona; - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); arizona_free_spk_irqs(arizona); diff --git a/sound/soc/codecs/wm8998.c b/sound/soc/codecs/wm8998.c index 1288e1f67dcf..61294c787f27 100644 --- a/sound/soc/codecs/wm8998.c +++ b/sound/soc/codecs/wm8998.c @@ -41,12 +41,12 @@ static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); unsigned int val; switch (event) { case SND_SOC_DAPM_PRE_PMU: - val = snd_soc_read(codec, ARIZONA_ASRC_RATE1); + val = snd_soc_component_read32(component, ARIZONA_ASRC_RATE1); val &= ARIZONA_ASRC_RATE1_MASK; val >>= ARIZONA_ASRC_RATE1_SHIFT; @@ -54,23 +54,23 @@ static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w, case 0: case 1: case 2: - val = snd_soc_read(codec, + val = snd_soc_component_read32(component, ARIZONA_SAMPLE_RATE_1 + val); if (val >= 0x11) { - dev_warn(codec->dev, + dev_warn(component->dev, "Unsupported ASRC rate1 (%s)\n", arizona_sample_rate_val_to_name(val)); return -EINVAL; } break; default: - dev_err(codec->dev, + dev_err(component->dev, "Illegal ASRC rate1 selector (0x%x)\n", val); return -EINVAL; } - val = snd_soc_read(codec, ARIZONA_ASRC_RATE2); + val = snd_soc_component_read32(component, ARIZONA_ASRC_RATE2); val &= ARIZONA_ASRC_RATE2_MASK; val >>= ARIZONA_ASRC_RATE2_SHIFT; @@ -78,17 +78,17 @@ static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w, case 8: case 9: val -= 0x8; - val = snd_soc_read(codec, + val = snd_soc_component_read32(component, ARIZONA_ASYNC_SAMPLE_RATE_1 + val); if (val >= 0x11) { - dev_warn(codec->dev, + dev_warn(component->dev, "Unsupported ASRC rate2 (%s)\n", arizona_sample_rate_val_to_name(val)); return -EINVAL; } break; default: - dev_err(codec->dev, + dev_err(component->dev, "Illegal ASRC rate2 selector (0x%x)\n", val); return -EINVAL; @@ -104,9 +104,9 @@ static int wm8998_asrc_ev(struct snd_soc_dapm_widget *w, static int wm8998_inmux_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct wm8998_priv *wm8998 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); + struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component); struct arizona *arizona = wm8998->core.arizona; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int mode_reg, mode_index; @@ -137,11 +137,13 @@ static int wm8998_inmux_put(struct snd_kcontrol *kcontrol, if (inmode & ARIZONA_INMODE_SE) src_val |= 1 << ARIZONA_IN1L_SRC_SE_SHIFT; - snd_soc_update_bits(codec, mode_reg, ARIZONA_IN1_MODE_MASK, mode_val); + snd_soc_component_update_bits(component, mode_reg, + ARIZONA_IN1_MODE_MASK, mode_val); - snd_soc_update_bits(codec, e->reg, - ARIZONA_IN1L_SRC_MASK | ARIZONA_IN1L_SRC_SE_MASK, - src_val); + snd_soc_component_update_bits(component, e->reg, + ARIZONA_IN1L_SRC_MASK | + ARIZONA_IN1L_SRC_SE_MASK, + src_val); return snd_soc_dapm_mux_update_power(dapm, kcontrol, ucontrol->value.enumerated.item[0], @@ -322,7 +324,7 @@ SOC_DOUBLE_R("HPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, SOC_DOUBLE_R("LINEOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, - ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), + ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), SOC_DOUBLE_R("SPKDAT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L, @@ -335,7 +337,7 @@ SOC_DOUBLE_R_TLV("LINEOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, - ARIZONA_OUT3L_VOL_SHIFT, 0xbf, 0, digital_tlv), + ARIZONA_OUT3L_VOL_SHIFT, 0xbf, 0, digital_tlv), SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L, ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_VOL_SHIFT, 0xbf, 0, digital_tlv), @@ -615,12 +617,12 @@ SND_SOC_DAPM_PGA("ISRC2DEC2", ARIZONA_ISRC_2_CTRL_3, ARIZONA_ISRC2_DEC1_ENA_SHIFT, 0, NULL, 0), SND_SOC_DAPM_MUX("AEC1 Loopback", ARIZONA_DAC_AEC_CONTROL_1, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &wm8998_aec_loopback_mux[0]), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, + &wm8998_aec_loopback_mux[0]), SND_SOC_DAPM_MUX("AEC2 Loopback", ARIZONA_DAC_AEC_CONTROL_2, - ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, - &wm8998_aec_loopback_mux[1]), + ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, + &wm8998_aec_loopback_mux[1]), SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), @@ -739,9 +741,9 @@ SND_SOC_DAPM_PGA_E("OUT5R", ARIZONA_OUTPUT_ENABLES_1, SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), SND_SOC_DAPM_PGA("SPD1TX1", ARIZONA_SPD1_TX_CONTROL, - ARIZONA_SPD1_VAL1_SHIFT, 0, NULL, 0), + ARIZONA_SPD1_VAL1_SHIFT, 0, NULL, 0), SND_SOC_DAPM_PGA("SPD1TX2", ARIZONA_SPD1_TX_CONTROL, - ARIZONA_SPD1_VAL2_SHIFT, 0, NULL, 0), + ARIZONA_SPD1_VAL2_SHIFT, 0, NULL, 0), SND_SOC_DAPM_OUT_DRV("SPD1", ARIZONA_SPD1_TX_CONTROL, ARIZONA_SPD1_ENA_SHIFT, 0, NULL, 0), @@ -1249,10 +1251,10 @@ static struct snd_soc_dai_driver wm8998_dai[] = { }, }; -static int wm8998_set_fll(struct snd_soc_codec *codec, int fll_id, int source, - unsigned int Fref, unsigned int Fout) +static int wm8998_set_fll(struct snd_soc_component *component, int fll_id, + int source, unsigned int Fref, unsigned int Fout) { - struct wm8998_priv *wm8998 = snd_soc_codec_get_drvdata(codec); + struct wm8998_priv *wm8998 = snd_soc_component_get_drvdata(component); switch (fll_id) { case WM8998_FLL1: @@ -1270,35 +1272,32 @@ static int wm8998_set_fll(struct snd_soc_codec *codec, int fll_id, int source, } } -static int wm8998_codec_probe(struct snd_soc_codec *codec) +static int wm8998_component_probe(struct snd_soc_component *component) { - struct wm8998_priv *priv = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); - struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); + struct wm8998_priv *priv = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); struct arizona *arizona = priv->core.arizona; int ret; arizona->dapm = dapm; - snd_soc_codec_init_regmap(codec, arizona->regmap); + snd_soc_component_init_regmap(component, arizona->regmap); - ret = arizona_init_spk(codec); + ret = arizona_init_spk(component); if (ret < 0) return ret; - arizona_init_gpio(codec); + arizona_init_gpio(component); snd_soc_component_disable_pin(component, "HAPTICS"); return 0; } -static int wm8998_codec_remove(struct snd_soc_codec *codec) +static void wm8998_component_remove(struct snd_soc_component *component) { - struct wm8998_priv *priv = snd_soc_codec_get_drvdata(codec); + struct wm8998_priv *priv = snd_soc_component_get_drvdata(component); priv->core.arizona->dapm = NULL; - - return 0; } #define WM8998_DIG_VU 0x0200 @@ -1315,23 +1314,20 @@ static unsigned int wm8998_digital_vu[] = { ARIZONA_DAC_DIGITAL_VOLUME_5R, }; -static const struct snd_soc_codec_driver soc_codec_dev_wm8998 = { - .probe = wm8998_codec_probe, - .remove = wm8998_codec_remove, - - .idle_bias_off = true, - - .set_sysclk = arizona_set_sysclk, - .set_pll = wm8998_set_fll, - - .component_driver = { - .controls = wm8998_snd_controls, - .num_controls = ARRAY_SIZE(wm8998_snd_controls), - .dapm_widgets = wm8998_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm8998_dapm_widgets), - .dapm_routes = wm8998_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(wm8998_dapm_routes), - }, +static const struct snd_soc_component_driver soc_component_dev_wm8998 = { + .probe = wm8998_component_probe, + .remove = wm8998_component_remove, + .set_sysclk = arizona_set_sysclk, + .set_pll = wm8998_set_fll, + .controls = wm8998_snd_controls, + .num_controls = ARRAY_SIZE(wm8998_snd_controls), + .dapm_widgets = wm8998_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm8998_dapm_widgets), + .dapm_routes = wm8998_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(wm8998_dapm_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm8998_probe(struct platform_device *pdev) @@ -1384,10 +1380,12 @@ static int wm8998_probe(struct platform_device *pdev) if (ret < 0) return ret; - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998, - wm8998_dai, ARRAY_SIZE(wm8998_dai)); + ret = devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm8998, + wm8998_dai, + ARRAY_SIZE(wm8998_dai)); if (ret < 0) { - dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); + dev_err(&pdev->dev, "Failed to register component: %d\n", ret); goto err_spk_irqs; } @@ -1404,7 +1402,6 @@ static int wm8998_remove(struct platform_device *pdev) struct wm8998_priv *wm8998 = platform_get_drvdata(pdev); struct arizona *arizona = wm8998->core.arizona; - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); arizona_free_spk_irqs(arizona); diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index 2c09f71fe433..ccdf088461b7 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c @@ -235,17 +235,17 @@ static const struct snd_soc_dapm_route wm9705_audio_map[] = { static int ac97_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int reg; - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x1, 0x1); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) reg = AC97_PCM_FRONT_DAC_RATE; else reg = AC97_PCM_LR_ADC_RATE; - return snd_soc_write(codec, reg, substream->runtime->rate); + return snd_soc_component_write(component, reg, substream->runtime->rate); } #define WM9705_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \ @@ -289,18 +289,18 @@ static struct snd_soc_dai_driver wm9705_dai[] = { }; #ifdef CONFIG_PM -static int wm9705_soc_suspend(struct snd_soc_codec *codec) +static int wm9705_soc_suspend(struct snd_soc_component *component) { - regcache_cache_bypass(codec->component.regmap, true); - snd_soc_write(codec, AC97_POWERDOWN, 0xffff); - regcache_cache_bypass(codec->component.regmap, false); + regcache_cache_bypass(component->regmap, true); + snd_soc_component_write(component, AC97_POWERDOWN, 0xffff); + regcache_cache_bypass(component->regmap, false); return 0; } -static int wm9705_soc_resume(struct snd_soc_codec *codec) +static int wm9705_soc_resume(struct snd_soc_component *component) { - struct wm9705_priv *wm9705 = snd_soc_codec_get_drvdata(codec); + struct wm9705_priv *wm9705 = snd_soc_component_get_drvdata(component); int ret; ret = snd_ac97_reset(wm9705->ac97, true, WM9705_VENDOR_ID, @@ -308,7 +308,7 @@ static int wm9705_soc_resume(struct snd_soc_codec *codec) if (ret < 0) return ret; - regcache_sync(codec->component.regmap); + snd_soc_component_cache_sync(component); return 0; } @@ -317,9 +317,9 @@ static int wm9705_soc_resume(struct snd_soc_codec *codec) #define wm9705_soc_resume NULL #endif -static int wm9705_soc_probe(struct snd_soc_codec *codec) +static int wm9705_soc_probe(struct snd_soc_component *component) { - struct wm9705_priv *wm9705 = snd_soc_codec_get_drvdata(codec); + struct wm9705_priv *wm9705 = snd_soc_component_get_drvdata(component); struct regmap *regmap; if (wm9705->mfd_pdata) { @@ -327,54 +327,54 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec) regmap = wm9705->mfd_pdata->regmap; } else { #ifdef CONFIG_SND_SOC_AC97_BUS - wm9705->ac97 = snd_soc_new_ac97_codec(codec, WM9705_VENDOR_ID, + wm9705->ac97 = snd_soc_new_ac97_component(component, WM9705_VENDOR_ID, WM9705_VENDOR_ID_MASK); if (IS_ERR(wm9705->ac97)) { - dev_err(codec->dev, "Failed to register AC97 codec\n"); + dev_err(component->dev, "Failed to register AC97 codec\n"); return PTR_ERR(wm9705->ac97); } regmap = regmap_init_ac97(wm9705->ac97, &wm9705_regmap_config); if (IS_ERR(regmap)) { - snd_soc_free_ac97_codec(wm9705->ac97); + snd_soc_free_ac97_component(wm9705->ac97); return PTR_ERR(regmap); } #endif } - snd_soc_codec_set_drvdata(codec, wm9705->ac97); - snd_soc_codec_init_regmap(codec, regmap); + snd_soc_component_set_drvdata(component, wm9705->ac97); + snd_soc_component_init_regmap(component, regmap); return 0; } -static int wm9705_soc_remove(struct snd_soc_codec *codec) +static void wm9705_soc_remove(struct snd_soc_component *component) { #ifdef CONFIG_SND_SOC_AC97_BUS - struct wm9705_priv *wm9705 = snd_soc_codec_get_drvdata(codec); + struct wm9705_priv *wm9705 = snd_soc_component_get_drvdata(component); if (!wm9705->mfd_pdata) { - snd_soc_codec_exit_regmap(codec); - snd_soc_free_ac97_codec(wm9705->ac97); + snd_soc_component_exit_regmap(component); + snd_soc_free_ac97_component(wm9705->ac97); } #endif - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_wm9705 = { - .probe = wm9705_soc_probe, - .remove = wm9705_soc_remove, - .suspend = wm9705_soc_suspend, - .resume = wm9705_soc_resume, - - .component_driver = { - .controls = wm9705_snd_ac97_controls, - .num_controls = ARRAY_SIZE(wm9705_snd_ac97_controls), - .dapm_widgets = wm9705_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm9705_dapm_widgets), - .dapm_routes = wm9705_audio_map, - .num_dapm_routes = ARRAY_SIZE(wm9705_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_wm9705 = { + .probe = wm9705_soc_probe, + .remove = wm9705_soc_remove, + .suspend = wm9705_soc_suspend, + .resume = wm9705_soc_resume, + .controls = wm9705_snd_ac97_controls, + .num_controls = ARRAY_SIZE(wm9705_snd_ac97_controls), + .dapm_widgets = wm9705_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm9705_dapm_widgets), + .dapm_routes = wm9705_audio_map, + .num_dapm_routes = ARRAY_SIZE(wm9705_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm9705_probe(struct platform_device *pdev) @@ -388,14 +388,8 @@ static int wm9705_probe(struct platform_device *pdev) wm9705->mfd_pdata = dev_get_platdata(&pdev->dev); platform_set_drvdata(pdev, wm9705); - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_wm9705, wm9705_dai, ARRAY_SIZE(wm9705_dai)); -} - -static int wm9705_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm9705, wm9705_dai, ARRAY_SIZE(wm9705_dai)); } static struct platform_driver wm9705_codec_driver = { @@ -404,7 +398,6 @@ static struct platform_driver wm9705_codec_driver = { }, .probe = wm9705_probe, - .remove = wm9705_remove, }; module_platform_driver(wm9705_codec_driver); diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 4f6d1a442bc4..7aeeeec8adbd 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -220,8 +220,8 @@ static int wm9712_hp_mixer_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); + struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); unsigned int val = ucontrol->value.integer.value[0]; struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -264,8 +264,8 @@ static int wm9712_hp_mixer_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); + struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int shift, mixer; @@ -527,33 +527,33 @@ static const struct snd_soc_dapm_route wm9712_audio_map[] = { static int ac97_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; int reg; struct snd_pcm_runtime *runtime = substream->runtime; - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x1, 0x1); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) reg = AC97_PCM_FRONT_DAC_RATE; else reg = AC97_PCM_LR_ADC_RATE; - return snd_soc_write(codec, reg, runtime->rate); + return snd_soc_component_write(component, reg, runtime->rate); } static int ac97_aux_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct snd_pcm_runtime *runtime = substream->runtime; - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1); - snd_soc_update_bits(codec, AC97_PCI_SID, 0x8000, 0x8000); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x1, 0x1); + snd_soc_component_update_bits(component, AC97_PCI_SID, 0x8000, 0x8000); if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) return -ENODEV; - return snd_soc_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate); + return snd_soc_component_write(component, AC97_PCM_SURR_DAC_RATE, runtime->rate); } #define WM9712_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ @@ -597,7 +597,7 @@ static struct snd_soc_dai_driver wm9712_dai[] = { } }; -static int wm9712_set_bias_level(struct snd_soc_codec *codec, +static int wm9712_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { @@ -605,20 +605,20 @@ static int wm9712_set_bias_level(struct snd_soc_codec *codec, case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: - snd_soc_write(codec, AC97_POWERDOWN, 0x0000); + snd_soc_component_write(component, AC97_POWERDOWN, 0x0000); break; case SND_SOC_BIAS_OFF: /* disable everything including AC link */ - snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); - snd_soc_write(codec, AC97_POWERDOWN, 0xffff); + snd_soc_component_write(component, AC97_EXTENDED_MSTATUS, 0xffff); + snd_soc_component_write(component, AC97_POWERDOWN, 0xffff); break; } return 0; } -static int wm9712_soc_resume(struct snd_soc_codec *codec) +static int wm9712_soc_resume(struct snd_soc_component *component) { - struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); + struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); int ret; ret = snd_ac97_reset(wm9712->ac97, true, WM9712_VENDOR_ID, @@ -626,17 +626,17 @@ static int wm9712_soc_resume(struct snd_soc_codec *codec) if (ret < 0) return ret; - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); if (ret == 0) - regcache_sync(codec->component.regmap); + snd_soc_component_cache_sync(component); return ret; } -static int wm9712_soc_probe(struct snd_soc_codec *codec) +static int wm9712_soc_probe(struct snd_soc_component *component) { - struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); + struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); struct regmap *regmap; int ret; @@ -645,59 +645,59 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) regmap = wm9712->mfd_pdata->regmap; } else { #ifdef CONFIG_SND_SOC_AC97_BUS - wm9712->ac97 = snd_soc_new_ac97_codec(codec, WM9712_VENDOR_ID, + wm9712->ac97 = snd_soc_new_ac97_component(component, WM9712_VENDOR_ID, WM9712_VENDOR_ID_MASK); if (IS_ERR(wm9712->ac97)) { ret = PTR_ERR(wm9712->ac97); - dev_err(codec->dev, + dev_err(component->dev, "Failed to register AC97 codec: %d\n", ret); return ret; } regmap = regmap_init_ac97(wm9712->ac97, &wm9712_regmap_config); if (IS_ERR(regmap)) { - snd_soc_free_ac97_codec(wm9712->ac97); + snd_soc_free_ac97_component(wm9712->ac97); return PTR_ERR(regmap); } #endif } - snd_soc_codec_init_regmap(codec, regmap); + snd_soc_component_init_regmap(component, regmap); /* set alc mux to none */ - snd_soc_update_bits(codec, AC97_VIDEO, 0x3000, 0x3000); + snd_soc_component_update_bits(component, AC97_VIDEO, 0x3000, 0x3000); return 0; } -static int wm9712_soc_remove(struct snd_soc_codec *codec) +static void wm9712_soc_remove(struct snd_soc_component *component) { #ifdef CONFIG_SND_SOC_AC97_BUS - struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); + struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); if (!wm9712->mfd_pdata) { - snd_soc_codec_exit_regmap(codec); - snd_soc_free_ac97_codec(wm9712->ac97); + snd_soc_component_exit_regmap(component); + snd_soc_free_ac97_component(wm9712->ac97); } #endif - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_wm9712 = { - .probe = wm9712_soc_probe, - .remove = wm9712_soc_remove, - .resume = wm9712_soc_resume, - .set_bias_level = wm9712_set_bias_level, - .suspend_bias_off = true, - - .component_driver = { - .controls = wm9712_snd_ac97_controls, - .num_controls = ARRAY_SIZE(wm9712_snd_ac97_controls), - .dapm_widgets = wm9712_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm9712_dapm_widgets), - .dapm_routes = wm9712_audio_map, - .num_dapm_routes = ARRAY_SIZE(wm9712_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_wm9712 = { + .probe = wm9712_soc_probe, + .remove = wm9712_soc_remove, + .resume = wm9712_soc_resume, + .set_bias_level = wm9712_set_bias_level, + .controls = wm9712_snd_ac97_controls, + .num_controls = ARRAY_SIZE(wm9712_snd_ac97_controls), + .dapm_widgets = wm9712_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm9712_dapm_widgets), + .dapm_routes = wm9712_audio_map, + .num_dapm_routes = ARRAY_SIZE(wm9712_audio_map), + .suspend_bias_off = 1, + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm9712_probe(struct platform_device *pdev) @@ -713,26 +713,19 @@ static int wm9712_probe(struct platform_device *pdev) wm9712->mfd_pdata = dev_get_platdata(&pdev->dev); platform_set_drvdata(pdev, wm9712); - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_wm9712, wm9712_dai, ARRAY_SIZE(wm9712_dai)); -} - -static int wm9712_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm9712, wm9712_dai, ARRAY_SIZE(wm9712_dai)); } -static struct platform_driver wm9712_codec_driver = { +static struct platform_driver wm9712_component_driver = { .driver = { - .name = "wm9712-codec", + .name = "wm9712-component", }, .probe = wm9712_probe, - .remove = wm9712_remove, }; -module_platform_driver(wm9712_codec_driver); +module_platform_driver(wm9712_component_driver); MODULE_DESCRIPTION("ASoC WM9711/WM9712 driver"); MODULE_AUTHOR("Liam Girdwood"); diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index df7220656d98..3d6cf0085005 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c @@ -196,16 +196,16 @@ SOC_SINGLE("3D Depth", AC97_REC_GAIN_MIC, 0, 15, 1), static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); if (WARN_ON(event != SND_SOC_DAPM_PRE_PMD)) return -EINVAL; /* Gracefully shut down the voice interface. */ - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0200); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0200); schedule_timeout_interruptible(msecs_to_jiffies(1)); - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, 0x0f00); - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x1000, 0x1000); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0f00); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x1000, 0x1000); return 0; } @@ -229,8 +229,8 @@ static int wm9713_hp_mixer_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); unsigned int val = ucontrol->value.integer.value[0]; struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; @@ -273,8 +273,8 @@ static int wm9713_hp_mixer_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm); - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int mixer, shift; @@ -753,7 +753,7 @@ struct _pll_div { * to allow rounding later */ #define FIXED_PLL_SIZE ((1 << 22) * 10) -static void pll_factors(struct snd_soc_codec *codec, +static void pll_factors(struct snd_soc_component *component, struct _pll_div *pll_div, unsigned int source) { u64 Kpart; @@ -789,7 +789,7 @@ static void pll_factors(struct snd_soc_codec *codec, Ndiv = target / source; if ((Ndiv < 5) || (Ndiv > 12)) - dev_warn(codec->dev, + dev_warn(component->dev, "WM9713 PLL N value %u out of recommended range!\n", Ndiv); @@ -815,28 +815,28 @@ static void pll_factors(struct snd_soc_codec *codec, * Please note that changing the PLL input frequency may require * resynchronisation with the AC97 controller. */ -static int wm9713_set_pll(struct snd_soc_codec *codec, +static int wm9713_set_pll(struct snd_soc_component *component, int pll_id, unsigned int freq_in, unsigned int freq_out) { - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); u16 reg, reg2; struct _pll_div pll_div; /* turn PLL off ? */ if (freq_in == 0) { /* disable PLL power and select ext source */ - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0080, 0x0080); - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x0200, 0x0200); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0080, 0x0080); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x0200, 0x0200); wm9713->pll_in = 0; return 0; } - pll_factors(codec, &pll_div, freq_in); + pll_factors(component, &pll_div, freq_in); if (pll_div.k == 0) { reg = (pll_div.n << 12) | (pll_div.lf << 11) | (pll_div.divsel << 9) | (pll_div.divctl << 8); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); } else { /* write the fractional k to the reg 0x46 pages */ reg2 = (pll_div.n << 12) | (pll_div.lf << 11) | (1 << 10) | @@ -844,31 +844,31 @@ static int wm9713_set_pll(struct snd_soc_codec *codec, /* K [21:20] */ reg = reg2 | (0x5 << 4) | (pll_div.k >> 20); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); /* K [19:16] */ reg = reg2 | (0x4 << 4) | ((pll_div.k >> 16) & 0xf); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); /* K [15:12] */ reg = reg2 | (0x3 << 4) | ((pll_div.k >> 12) & 0xf); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); /* K [11:8] */ reg = reg2 | (0x2 << 4) | ((pll_div.k >> 8) & 0xf); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); /* K [7:4] */ reg = reg2 | (0x1 << 4) | ((pll_div.k >> 4) & 0xf); - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); reg = reg2 | (0x0 << 4) | (pll_div.k & 0xf); /* K [3:0] */ - snd_soc_write(codec, AC97_LINE1_LEVEL, reg); + snd_soc_component_write(component, AC97_LINE1_LEVEL, reg); } /* turn PLL on and select as source */ - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x0200, 0x0000); - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0080, 0x0000); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x0200, 0x0000); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0080, 0x0000); wm9713->pll_in = freq_in; /* wait 10ms AC97 link frames for the link to stabilise */ @@ -879,8 +879,8 @@ static int wm9713_set_pll(struct snd_soc_codec *codec, static int wm9713_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int source, unsigned int freq_in, unsigned int freq_out) { - struct snd_soc_codec *codec = codec_dai->codec; - return wm9713_set_pll(codec, pll_id, freq_in, freq_out); + struct snd_soc_component *component = codec_dai->component; + return wm9713_set_pll(component, pll_id, freq_in, freq_out); } /* @@ -890,10 +890,10 @@ static int wm9713_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, static int wm9713_set_dai_tristate(struct snd_soc_dai *codec_dai, int tristate) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; if (tristate) - snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, + snd_soc_component_update_bits(component, AC97_CENTER_LFE_MASTER, 0x6000, 0x0000); return 0; @@ -906,30 +906,30 @@ static int wm9713_set_dai_tristate(struct snd_soc_dai *codec_dai, static int wm9713_set_dai_clkdiv(struct snd_soc_dai *codec_dai, int div_id, int div) { - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; switch (div_id) { case WM9713_PCMCLK_DIV: - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0f00, div); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, div); break; case WM9713_CLKA_MULT: - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0002, div); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0002, div); break; case WM9713_CLKB_MULT: - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x0004, div); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0004, div); break; case WM9713_HIFI_DIV: - snd_soc_update_bits(codec, AC97_HANDSET_RATE, 0x7000, div); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x7000, div); break; case WM9713_PCMBCLK_DIV: - snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, 0x0e00, div); + snd_soc_component_update_bits(component, AC97_CENTER_LFE_MASTER, 0x0e00, div); break; case WM9713_PCMCLK_PLL_DIV: - snd_soc_update_bits(codec, AC97_LINE1_LEVEL, + snd_soc_component_update_bits(component, AC97_LINE1_LEVEL, 0x007f, div | 0x60); break; case WM9713_HIFI_PLL_DIV: - snd_soc_update_bits(codec, AC97_LINE1_LEVEL, + snd_soc_component_update_bits(component, AC97_LINE1_LEVEL, 0x007f, div | 0x70); break; default: @@ -942,8 +942,8 @@ static int wm9713_set_dai_clkdiv(struct snd_soc_dai *codec_dai, static int wm9713_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { - struct snd_soc_codec *codec = codec_dai->codec; - u16 gpio = snd_soc_read(codec, AC97_GPIO_CFG) & 0xffc5; + struct snd_soc_component *component = codec_dai->component; + u16 gpio = snd_soc_component_read32(component, AC97_GPIO_CFG) & 0xffc5; u16 reg = 0x8000; /* clock masters */ @@ -996,8 +996,8 @@ static int wm9713_set_dai_fmt(struct snd_soc_dai *codec_dai, break; } - snd_soc_write(codec, AC97_GPIO_CFG, gpio); - snd_soc_write(codec, AC97_CENTER_LFE_MASTER, reg); + snd_soc_component_write(component, AC97_GPIO_CFG, gpio); + snd_soc_component_write(component, AC97_CENTER_LFE_MASTER, reg); return 0; } @@ -1005,22 +1005,22 @@ static int wm9713_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; /* enable PCM interface in master mode */ switch (params_width(params)) { case 16: break; case 20: - snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, + snd_soc_component_update_bits(component, AC97_CENTER_LFE_MASTER, 0x000c, 0x0004); break; case 24: - snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, + snd_soc_component_update_bits(component, AC97_CENTER_LFE_MASTER, 0x000c, 0x0008); break; case 32: - snd_soc_update_bits(codec, AC97_CENTER_LFE_MASTER, + snd_soc_component_update_bits(component, AC97_CENTER_LFE_MASTER, 0x000c, 0x000c); break; } @@ -1030,33 +1030,33 @@ static int wm9713_pcm_hw_params(struct snd_pcm_substream *substream, static int ac97_hifi_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct snd_pcm_runtime *runtime = substream->runtime; int reg; - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x0001, 0x0001); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x0001, 0x0001); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) reg = AC97_PCM_FRONT_DAC_RATE; else reg = AC97_PCM_LR_ADC_RATE; - return snd_soc_write(codec, reg, runtime->rate); + return snd_soc_component_write(component, reg, runtime->rate); } static int ac97_aux_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { - struct snd_soc_codec *codec = dai->codec; + struct snd_soc_component *component = dai->component; struct snd_pcm_runtime *runtime = substream->runtime; - snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x0001, 0x0001); - snd_soc_update_bits(codec, AC97_PCI_SID, 0x8000, 0x8000); + snd_soc_component_update_bits(component, AC97_EXTENDED_STATUS, 0x0001, 0x0001); + snd_soc_component_update_bits(component, AC97_PCI_SID, 0x8000, 0x8000); if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) return -ENODEV; - return snd_soc_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate); + return snd_soc_component_write(component, AC97_PCM_SURR_DAC_RATE, runtime->rate); } #define WM9713_RATES (SNDRV_PCM_RATE_8000 | \ @@ -1142,48 +1142,48 @@ static struct snd_soc_dai_driver wm9713_dai[] = { }, }; -static int wm9713_set_bias_level(struct snd_soc_codec *codec, +static int wm9713_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: /* enable thermal shutdown */ - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0xe400, 0x0000); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0xe400, 0x0000); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: /* enable master bias and vmid */ - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0xc400, 0x0000); - snd_soc_write(codec, AC97_POWERDOWN, 0x0000); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0xc400, 0x0000); + snd_soc_component_write(component, AC97_POWERDOWN, 0x0000); break; case SND_SOC_BIAS_OFF: /* disable everything including AC link */ - snd_soc_write(codec, AC97_EXTENDED_MID, 0xffff); - snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); - snd_soc_write(codec, AC97_POWERDOWN, 0xffff); + snd_soc_component_write(component, AC97_EXTENDED_MID, 0xffff); + snd_soc_component_write(component, AC97_EXTENDED_MSTATUS, 0xffff); + snd_soc_component_write(component, AC97_POWERDOWN, 0xffff); break; } return 0; } -static int wm9713_soc_suspend(struct snd_soc_codec *codec) +static int wm9713_soc_suspend(struct snd_soc_component *component) { /* Disable everything except touchpanel - that will be handled * by the touch driver and left disabled if touch is not in * use. */ - snd_soc_update_bits(codec, AC97_EXTENDED_MID, 0x7fff, + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x7fff, 0x7fff); - snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); - snd_soc_write(codec, AC97_POWERDOWN, 0x6f00); - snd_soc_write(codec, AC97_POWERDOWN, 0xffff); + snd_soc_component_write(component, AC97_EXTENDED_MSTATUS, 0xffff); + snd_soc_component_write(component, AC97_POWERDOWN, 0x6f00); + snd_soc_component_write(component, AC97_POWERDOWN, 0xffff); return 0; } -static int wm9713_soc_resume(struct snd_soc_codec *codec) +static int wm9713_soc_resume(struct snd_soc_component *component) { - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); int ret; ret = snd_ac97_reset(wm9713->ac97, true, WM9713_VENDOR_ID, @@ -1191,24 +1191,24 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec) if (ret < 0) return ret; - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); + snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY); /* do we need to re-start the PLL ? */ if (wm9713->pll_in) - wm9713_set_pll(codec, 0, wm9713->pll_in, 0); + wm9713_set_pll(component, 0, wm9713->pll_in, 0); /* only synchronise the codec if warm reset failed */ if (ret == 0) { - regcache_mark_dirty(codec->component.regmap); - snd_soc_cache_sync(codec); + regcache_mark_dirty(component->regmap); + snd_soc_component_cache_sync(component); } return ret; } -static int wm9713_soc_probe(struct snd_soc_codec *codec) +static int wm9713_soc_probe(struct snd_soc_component *component) { - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); struct regmap *regmap = NULL; if (wm9713->mfd_pdata) { @@ -1216,54 +1216,54 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) regmap = wm9713->mfd_pdata->regmap; } else { #ifdef CONFIG_SND_SOC_AC97_BUS - wm9713->ac97 = snd_soc_new_ac97_codec(codec, WM9713_VENDOR_ID, + wm9713->ac97 = snd_soc_new_ac97_component(component, WM9713_VENDOR_ID, WM9713_VENDOR_ID_MASK); if (IS_ERR(wm9713->ac97)) return PTR_ERR(wm9713->ac97); regmap = regmap_init_ac97(wm9713->ac97, &wm9713_regmap_config); if (IS_ERR(regmap)) { - snd_soc_free_ac97_codec(wm9713->ac97); + snd_soc_free_ac97_component(wm9713->ac97); return PTR_ERR(regmap); } #endif } - snd_soc_codec_init_regmap(codec, regmap); + snd_soc_component_init_regmap(component, regmap); /* unmute the adc - move to kcontrol */ - snd_soc_update_bits(codec, AC97_CD, 0x7fff, 0x0000); + snd_soc_component_update_bits(component, AC97_CD, 0x7fff, 0x0000); return 0; } -static int wm9713_soc_remove(struct snd_soc_codec *codec) +static void wm9713_soc_remove(struct snd_soc_component *component) { #ifdef CONFIG_SND_SOC_AC97_BUS - struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); + struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); if (!wm9713->mfd_pdata) { - snd_soc_codec_exit_regmap(codec); - snd_soc_free_ac97_codec(wm9713->ac97); + snd_soc_component_exit_regmap(component); + snd_soc_free_ac97_component(wm9713->ac97); } #endif - return 0; } -static const struct snd_soc_codec_driver soc_codec_dev_wm9713 = { - .probe = wm9713_soc_probe, - .remove = wm9713_soc_remove, - .suspend = wm9713_soc_suspend, - .resume = wm9713_soc_resume, - .set_bias_level = wm9713_set_bias_level, - - .component_driver = { - .controls = wm9713_snd_ac97_controls, - .num_controls = ARRAY_SIZE(wm9713_snd_ac97_controls), - .dapm_widgets = wm9713_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(wm9713_dapm_widgets), - .dapm_routes = wm9713_audio_map, - .num_dapm_routes = ARRAY_SIZE(wm9713_audio_map), - }, +static const struct snd_soc_component_driver soc_component_dev_wm9713 = { + .probe = wm9713_soc_probe, + .remove = wm9713_soc_remove, + .suspend = wm9713_soc_suspend, + .resume = wm9713_soc_resume, + .set_bias_level = wm9713_set_bias_level, + .controls = wm9713_snd_ac97_controls, + .num_controls = ARRAY_SIZE(wm9713_snd_ac97_controls), + .dapm_widgets = wm9713_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(wm9713_dapm_widgets), + .dapm_routes = wm9713_audio_map, + .num_dapm_routes = ARRAY_SIZE(wm9713_audio_map), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int wm9713_probe(struct platform_device *pdev) @@ -1279,14 +1279,8 @@ static int wm9713_probe(struct platform_device *pdev) wm9713->mfd_pdata = dev_get_platdata(&pdev->dev); platform_set_drvdata(pdev, wm9713); - return snd_soc_register_codec(&pdev->dev, - &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai)); -} - -static int wm9713_remove(struct platform_device *pdev) -{ - snd_soc_unregister_codec(&pdev->dev); - return 0; + return devm_snd_soc_register_component(&pdev->dev, + &soc_component_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai)); } static struct platform_driver wm9713_codec_driver = { @@ -1295,7 +1289,6 @@ static struct platform_driver wm9713_codec_driver = { }, .probe = wm9713_probe, - .remove = wm9713_remove, }; module_platform_driver(wm9713_codec_driver); diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c index 66e32f5d2917..1d7ed1bef842 100644 --- a/sound/soc/codecs/wm_adsp.c +++ b/sound/soc/codecs/wm_adsp.c @@ -605,13 +605,13 @@ static const struct { }; static void wm_adsp2_init_debugfs(struct wm_adsp *dsp, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { struct dentry *root = NULL; char *root_name; int i; - if (!codec->component.debugfs_root) { + if (!component->debugfs_root) { adsp_err(dsp, "No codec debugfs root\n"); goto err; } @@ -621,7 +621,7 @@ static void wm_adsp2_init_debugfs(struct wm_adsp *dsp, goto err; snprintf(root_name, PAGE_SIZE, "dsp%d", dsp->num); - root = debugfs_create_dir(root_name, codec->component.debugfs_root); + root = debugfs_create_dir(root_name, component->debugfs_root); kfree(root_name); if (!root) @@ -662,7 +662,7 @@ static void wm_adsp2_cleanup_debugfs(struct wm_adsp *dsp) } #else static inline void wm_adsp2_init_debugfs(struct wm_adsp *dsp, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { } @@ -688,9 +688,9 @@ static inline void wm_adsp_debugfs_clear(struct wm_adsp *dsp) static int wm_adsp_fw_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = snd_soc_component_get_drvdata(component); ucontrol->value.enumerated.item[0] = dsp[e->shift_l].fw; @@ -700,9 +700,9 @@ static int wm_adsp_fw_get(struct snd_kcontrol *kcontrol, static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + struct wm_adsp *dsp = snd_soc_component_get_drvdata(component); int ret = 0; if (ucontrol->value.enumerated.item[0] == dsp[e->shift_l].fw) @@ -1204,16 +1204,18 @@ static int wmfw_add_ctl(struct wm_adsp *dsp, struct wm_coeff_ctl *ctl) kcontrol->put = wm_coeff_put_acked; break; default: - kcontrol->get = wm_coeff_get; - kcontrol->put = wm_coeff_put; - - ctl->bytes_ext.max = ctl->len; - ctl->bytes_ext.get = wm_coeff_tlv_get; - ctl->bytes_ext.put = wm_coeff_tlv_put; + if (kcontrol->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { + ctl->bytes_ext.max = ctl->len; + ctl->bytes_ext.get = wm_coeff_tlv_get; + ctl->bytes_ext.put = wm_coeff_tlv_put; + } else { + kcontrol->get = wm_coeff_get; + kcontrol->put = wm_coeff_put; + } break; } - ret = snd_soc_add_codec_controls(dsp->codec, kcontrol, 1); + ret = snd_soc_add_component_controls(dsp->component, kcontrol, 1); if (ret < 0) goto err_kcontrol; @@ -2396,14 +2398,14 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct wm_adsp *dsps = snd_soc_component_get_drvdata(component); struct wm_adsp *dsp = &dsps[w->shift]; struct wm_coeff_ctl *ctl; int ret; unsigned int val; - dsp->codec = codec; + dsp->component = component; mutex_lock(&dsp->pwr_lock); @@ -2633,8 +2635,8 @@ static void wm_adsp2_set_dspclk(struct wm_adsp *dsp, unsigned int freq) int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm_adsp *dsp = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = dsp->preloaded; @@ -2645,9 +2647,9 @@ EXPORT_SYMBOL_GPL(wm_adsp2_preloader_get); int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct wm_adsp *dsp = snd_soc_codec_get_drvdata(codec); - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct wm_adsp *dsp = snd_soc_component_get_drvdata(component); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; char preload[32]; @@ -2683,8 +2685,8 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event, unsigned int freq) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct wm_adsp *dsps = snd_soc_component_get_drvdata(component); struct wm_adsp *dsp = &dsps[w->shift]; struct wm_coeff_ctl *ctl; @@ -2726,8 +2728,8 @@ EXPORT_SYMBOL_GPL(wm_adsp2_early_event); int wm_adsp2_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { - struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); - struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); + struct wm_adsp *dsps = snd_soc_component_get_drvdata(component); struct wm_adsp *dsp = &dsps[w->shift]; int ret; @@ -2841,31 +2843,31 @@ err: } EXPORT_SYMBOL_GPL(wm_adsp2_event); -int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec) +int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component) { - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); char preload[32]; snprintf(preload, ARRAY_SIZE(preload), "DSP%d Preload", dsp->num); snd_soc_dapm_disable_pin(dapm, preload); - wm_adsp2_init_debugfs(dsp, codec); + wm_adsp2_init_debugfs(dsp, component); - dsp->codec = codec; + dsp->component = component; - return snd_soc_add_codec_controls(codec, + return snd_soc_add_component_controls(component, &wm_adsp_fw_controls[dsp->num - 1], 1); } -EXPORT_SYMBOL_GPL(wm_adsp2_codec_probe); +EXPORT_SYMBOL_GPL(wm_adsp2_component_probe); -int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec) +int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component) { wm_adsp2_cleanup_debugfs(dsp); return 0; } -EXPORT_SYMBOL_GPL(wm_adsp2_codec_remove); +EXPORT_SYMBOL_GPL(wm_adsp2_component_remove); int wm_adsp2_init(struct wm_adsp *dsp) { diff --git a/sound/soc/codecs/wm_adsp.h b/sound/soc/codecs/wm_adsp.h index 41cc11c19b83..82d651ff9d73 100644 --- a/sound/soc/codecs/wm_adsp.h +++ b/sound/soc/codecs/wm_adsp.h @@ -62,7 +62,7 @@ struct wm_adsp { int type; struct device *dev; struct regmap *regmap; - struct snd_soc_codec *codec; + struct snd_soc_component *component; int base; int sysclk_reg; @@ -126,8 +126,8 @@ extern const struct snd_kcontrol_new wm_adsp_fw_controls[]; int wm_adsp1_init(struct wm_adsp *dsp); int wm_adsp2_init(struct wm_adsp *dsp); void wm_adsp2_remove(struct wm_adsp *dsp); -int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec); -int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec); +int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component); +int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component); int wm_adsp1_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index 384961651904..807040bb3921 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c @@ -34,6 +34,7 @@ #include "edma-pcm.h" #include "davinci-i2s.h" +#define DRV_NAME "davinci-i2s" /* * NOTE: terminology here is confusing. @@ -190,7 +191,7 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_platform *platform = rtd->platform; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); int playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); u32 spcr; u32 mask = playback ? DAVINCI_MCBSP_SPCR_XRST : DAVINCI_MCBSP_SPCR_RRST; @@ -211,8 +212,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, if (playback) { /* Stop the DMA to avoid data loss */ /* while the transmitter is out of reset to handle XSYNCERR */ - if (platform->driver->ops->trigger) { - int ret = platform->driver->ops->trigger(substream, + if (component->driver->ops->trigger) { + int ret = component->driver->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP); if (ret < 0) printk(KERN_DEBUG "Playback DMA stop failed\n"); @@ -233,8 +234,8 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev, toggle_clock(dev, playback); /* Restart the DMA */ - if (platform->driver->ops->trigger) { - int ret = platform->driver->ops->trigger(substream, + if (component->driver->ops->trigger) { + int ret = component->driver->ops->trigger(substream, SNDRV_PCM_TRIGGER_START); if (ret < 0) printk(KERN_DEBUG "Playback DMA start failed\n"); @@ -651,7 +652,7 @@ static struct snd_soc_dai_driver davinci_i2s_dai = { }; static const struct snd_soc_component_driver davinci_i2s_component = { - .name = "davinci-i2s", + .name = DRV_NAME, }; static int davinci_i2s_probe(struct platform_device *pdev) diff --git a/sound/soc/dwc/dwc-i2s.c b/sound/soc/dwc/dwc-i2s.c index e27e21f8569a..65112b9d8588 100644 --- a/sound/soc/dwc/dwc-i2s.c +++ b/sound/soc/dwc/dwc-i2s.c @@ -491,6 +491,10 @@ static int dw_configure_dai(struct dw_i2s_dev *dev, dev->quirks & DW_I2S_QUIRK_COMP_PARAM1) comp1 = comp1 & ~BIT(5); + if (dev->capability & DWC_I2S_PLAY && + dev->quirks & DW_I2S_QUIRK_COMP_PARAM1) + comp1 = comp1 & ~BIT(6); + if (COMP1_TX_ENABLED(comp1)) { dev_dbg(dev->dev, " designware: play supported\n"); idx = COMP1_TX_WORDSIZE_0(comp1); diff --git a/sound/soc/dwc/dwc-pcm.c b/sound/soc/dwc/dwc-pcm.c index 406fd867117b..2cc9632024fc 100644 --- a/sound/soc/dwc/dwc-pcm.c +++ b/sound/soc/dwc/dwc-pcm.c @@ -269,7 +269,7 @@ static const struct snd_pcm_ops dw_pcm_ops = { .pointer = dw_pcm_pointer, }; -static const struct snd_soc_platform_driver dw_pcm_platform = { +static const struct snd_soc_component_driver dw_pcm_component = { .pcm_new = dw_pcm_new, .pcm_free = dw_pcm_free, .ops = &dw_pcm_ops, @@ -277,5 +277,6 @@ static const struct snd_soc_platform_driver dw_pcm_platform = { int dw_pcm_register(struct platform_device *pdev) { - return devm_snd_soc_register_platform(&pdev->dev, &dw_pcm_platform); + return devm_snd_soc_register_component(&pdev->dev, &dw_pcm_component, + NULL, 0); } diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index 37f9b6201918..6ec19fb4a934 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig @@ -231,17 +231,6 @@ config SND_SOC_EUKREA_TLV320 Enable I2S based access to the TLV320AIC23B codec attached to the SSI interface -config SND_SOC_IMX_WM8962 - tristate "SoC Audio support for i.MX boards with wm8962" - depends on OF && I2C && INPUT - select SND_SOC_WM8962 - select SND_SOC_IMX_PCM_DMA - select SND_SOC_IMX_AUDMUX - select SND_SOC_FSL_SSI - help - Say Y if you want to add support for SoC audio on an i.MX board with - a wm8962 codec. - config SND_SOC_IMX_ES8328 tristate "SoC Audio support for i.MX boards with the ES8328 codec" depends on OF && (I2C || SPI) diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile index c67bf1139e1e..de94fa057e24 100644 --- a/sound/soc/fsl/Makefile +++ b/sound/soc/fsl/Makefile @@ -55,7 +55,6 @@ snd-soc-mx27vis-aic32x4-objs := mx27vis-aic32x4.o snd-soc-wm1133-ev1-objs := wm1133-ev1.o snd-soc-imx-es8328-objs := imx-es8328.o snd-soc-imx-sgtl5000-objs := imx-sgtl5000.o -snd-soc-imx-wm8962-objs := imx-wm8962.o snd-soc-imx-spdif-objs := imx-spdif.o snd-soc-imx-mc13783-objs := imx-mc13783.o @@ -65,6 +64,5 @@ obj-$(CONFIG_SND_SOC_MX27VIS_AIC32X4) += snd-soc-mx27vis-aic32x4.o obj-$(CONFIG_SND_MXC_SOC_WM1133_EV1) += snd-soc-wm1133-ev1.o obj-$(CONFIG_SND_SOC_IMX_ES8328) += snd-soc-imx-es8328.o obj-$(CONFIG_SND_SOC_IMX_SGTL5000) += snd-soc-imx-sgtl5000.o -obj-$(CONFIG_SND_SOC_IMX_WM8962) += snd-soc-imx-wm8962.o obj-$(CONFIG_SND_SOC_IMX_SPDIF) += snd-soc-imx-spdif.o obj-$(CONFIG_SND_SOC_IMX_MC13783) += snd-soc-imx-mc13783.o diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c index 989be518c4ed..4a6750aa3637 100644 --- a/sound/soc/fsl/fsl-asoc-card.c +++ b/sound/soc/fsl/fsl-asoc-card.c @@ -91,9 +91,9 @@ struct fsl_asoc_card_priv { struct cpu_priv cpu_priv; struct snd_soc_card card; u32 sample_rate; - u32 sample_format; + snd_pcm_format_t sample_format; u32 asrc_rate; - u32 asrc_format; + snd_pcm_format_t asrc_format; u32 dai_fmt; char name[32]; }; @@ -199,7 +199,7 @@ static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, mask = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); snd_mask_none(mask); - snd_mask_set(mask, priv->asrc_format); + snd_mask_set(mask, (__force int)priv->asrc_format); return 0; } diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c index 806d39927318..adfb8135d739 100644 --- a/sound/soc/fsl/fsl_asrc.c +++ b/sound/soc/fsl/fsl_asrc.c @@ -582,10 +582,6 @@ static struct snd_soc_dai_driver fsl_asrc_dai = { .ops = &fsl_asrc_dai_ops, }; -static const struct snd_soc_component_driver fsl_asrc_component = { - .name = "fsl-asrc-dai", -}; - static bool fsl_asrc_readable_reg(struct device *dev, unsigned int reg) { switch (reg) { @@ -927,12 +923,6 @@ static int fsl_asrc_probe(struct platform_device *pdev) return ret; } - ret = devm_snd_soc_register_platform(&pdev->dev, &fsl_asrc_platform); - if (ret) { - dev_err(&pdev->dev, "failed to register ASoC platform\n"); - return ret; - } - return 0; } diff --git a/sound/soc/fsl/fsl_asrc.h b/sound/soc/fsl/fsl_asrc.h index 2c5856ac5bc3..d558dd5499a5 100644 --- a/sound/soc/fsl/fsl_asrc.h +++ b/sound/soc/fsl/fsl_asrc.h @@ -462,6 +462,7 @@ struct fsl_asrc { u32 regcache_cfg; }; -extern struct snd_soc_platform_driver fsl_asrc_platform; +#define DRV_NAME "fsl-asrc-dai" +extern struct snd_soc_component_driver fsl_asrc_component; struct dma_chan *fsl_asrc_get_dma_channel(struct fsl_asrc_pair *pair, bool dir); #endif /* _FSL_ASRC_H */ diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c index e1b97e59275a..565e16d8fe85 100644 --- a/sound/soc/fsl/fsl_asrc_dma.c +++ b/sound/soc/fsl/fsl_asrc_dma.c @@ -64,7 +64,8 @@ static int fsl_asrc_dma_prepare_and_submit(struct snd_pcm_substream *substream) struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_asrc_pair *pair = runtime->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; unsigned long flags = DMA_CTRL_ACK; /* Prepare and submit Front-End DMA channel */ @@ -137,12 +138,13 @@ static int fsl_asrc_dma_hw_params(struct snd_pcm_substream *substream, bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; struct snd_dmaengine_dai_dma_data *dma_params_fe = NULL; struct snd_dmaengine_dai_dma_data *dma_params_be = NULL; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_asrc_pair *pair = runtime->private_data; struct fsl_asrc *asrc_priv = pair->asrc_priv; struct dma_slave_config config_fe, config_be; enum asrc_pair_index index = pair->index; - struct device *dev = rtd->platform->dev; + struct device *dev = component->dev; int stream = substream->stream; struct imx_dma_data *tmp_data; struct snd_soc_dpcm *dpcm; @@ -274,7 +276,8 @@ static int fsl_asrc_dma_startup(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; struct fsl_asrc *asrc_priv = dev_get_drvdata(dev); struct fsl_asrc_pair *pair; @@ -381,9 +384,10 @@ static void fsl_asrc_dma_pcm_free(struct snd_pcm *pcm) } } -struct snd_soc_platform_driver fsl_asrc_platform = { +struct snd_soc_component_driver fsl_asrc_component = { + .name = DRV_NAME, .ops = &fsl_asrc_dma_pcm_ops, .pcm_new = fsl_asrc_dma_pcm_new, .pcm_free = fsl_asrc_dma_pcm_free, }; -EXPORT_SYMBOL_GPL(fsl_asrc_platform); +EXPORT_SYMBOL_GPL(fsl_asrc_component); diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index 8c2981b70f64..fce2010d3c53 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c @@ -37,6 +37,8 @@ #include "fsl_dma.h" #include "fsl_ssi.h" /* For the offset of stx0 and srx0 */ +#define DRV_NAME "fsl_dma" + /* * The formats that the DMA controller supports, which is anything * that is 8, 16, or 32 bits. @@ -56,7 +58,7 @@ SNDRV_PCM_FMTBIT_U32_LE | \ SNDRV_PCM_FMTBIT_U32_BE) struct dma_object { - struct snd_soc_platform_driver dai; + struct snd_soc_component_driver dai; dma_addr_t ssi_stx_phys; dma_addr_t ssi_srx_phys; unsigned int ssi_fifo_depth; @@ -203,7 +205,8 @@ static irqreturn_t fsl_dma_isr(int irq, void *dev_id) struct fsl_dma_private *dma_private = dev_id; struct snd_pcm_substream *substream = dma_private->substream; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel; irqreturn_t ret = IRQ_NONE; u32 sr, sr2 = 0; @@ -385,9 +388,10 @@ static int fsl_dma_open(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; struct dma_object *dma = - container_of(rtd->platform->driver, struct dma_object, dai); + container_of(component->driver, struct dma_object, dai); struct fsl_dma_private *dma_private; struct ccsr_dma_channel __iomem *dma_channel; dma_addr_t ld_buf_phys; @@ -539,7 +543,8 @@ static int fsl_dma_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; /* Number of bits per sample */ unsigned int sample_bits = @@ -702,7 +707,8 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; struct ccsr_dma_channel __iomem *dma_channel = dma_private->dma_channel; dma_addr_t position; snd_pcm_uframes_t frames; @@ -799,9 +805,10 @@ static int fsl_dma_close(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct fsl_dma_private *dma_private = runtime->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct device *dev = rtd->platform->dev; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = component->dev; struct dma_object *dma = - container_of(rtd->platform->driver, struct dma_object, dai); + container_of(component->driver, struct dma_object, dai); if (dma_private) { if (dma_private->irq) @@ -908,6 +915,7 @@ static int fsl_soc_dma_probe(struct platform_device *pdev) return -ENOMEM; } + dma->dai.name = DRV_NAME; dma->dai.ops = &fsl_dma_ops; dma->dai.pcm_new = fsl_dma_new; dma->dai.pcm_free = fsl_dma_free_dma_buffers; @@ -925,7 +933,7 @@ static int fsl_soc_dma_probe(struct platform_device *pdev) of_node_put(ssi_np); - ret = snd_soc_register_platform(&pdev->dev, &dma->dai); + ret = devm_snd_soc_register_component(&pdev->dev, &dma->dai, NULL, 0); if (ret) { dev_err(&pdev->dev, "could not register platform\n"); kfree(dma); @@ -944,7 +952,6 @@ static int fsl_soc_dma_remove(struct platform_device *pdev) { struct dma_object *dma = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); iounmap(dma->channel); irq_dispose_mapping(dma->irq); kfree(dma); diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c index cef79a1a620b..40a700493f4c 100644 --- a/sound/soc/fsl/fsl_esai.c +++ b/sound/soc/fsl/fsl_esai.c @@ -788,7 +788,7 @@ static int fsl_esai_probe(struct platform_device *pdev) struct device_node *np = pdev->dev.of_node; struct fsl_esai *esai_priv; struct resource *res; - const uint32_t *iprop; + const __be32 *iprop; void __iomem *regs; int irq, ret; diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index aecd00f7929d..0823b08923b5 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c @@ -56,6 +56,10 @@ #include "fsl_ssi.h" #include "imx-pcm.h" +/* Define RX and TX to index ssi->regvals array; Can be 0 or 1 only */ +#define RX 0 +#define TX 1 + /** * FSLSSI_I2S_FORMATS: audio formats supported by the SSI * @@ -86,6 +90,16 @@ SNDRV_PCM_FMTBIT_S24_LE) #endif +/* + * In AC97 mode, TXDIR bit is forced to 0 and TFDIR bit is forced to 1: + * - SSI inputs external bit clock and outputs frame sync clock -- CBM_CFS + * - Also have NB_NF to mark these two clocks will not be inverted + */ +#define FSLSSI_AC97_DAIFMT \ + (SND_SOC_DAIFMT_AC97 | \ + SND_SOC_DAIFMT_CBM_CFS | \ + SND_SOC_DAIFMT_NB_NF) + #define FSLSSI_SIER_DBG_RX_FLAGS \ (SSI_SIER_RFF0_EN | \ SSI_SIER_RLS_EN | \ @@ -201,7 +215,9 @@ struct fsl_ssi_soc_data { * @cpu_dai_drv: CPU DAI driver for this device * * @dai_fmt: DAI configuration this device is currently used with + * @streams: Mask of current active streams: BIT(TX) and BIT(RX) * @i2s_net: I2S and Network mode configurations of SCR register + * @synchronous: Use synchronous mode - both of TX and RX use STCK and SFCK * @use_dma: DMA is used or FIQ with stream filter * @use_dual_fifo: DMA with support for dual FIFO mode * @has_ipg_clk_name: If "ipg" is in the clock name list of device tree @@ -223,8 +239,12 @@ struct fsl_ssi_soc_data { * * @fiq_params: FIQ stream filtering parameters * - * @pdev: Pointer to pdev when using fsl-ssi as sound card (ppc only) - * TODO: Should be replaced with simple-sound-card + * @card_pdev: Platform_device pointer to register a sound card for PowerPC or + * to register a CODEC platform device for AC97 + * @card_name: Platform_device name to register a sound card for PowerPC or + * to register a CODEC platform device for AC97 + * @card_idx: The index of SSI to register a sound card for PowerPC or + * to register a CODEC platform device for AC97 * * @dbg_stats: Debugging statistics * @@ -245,7 +265,9 @@ struct fsl_ssi { struct snd_soc_dai_driver cpu_dai_drv; unsigned int dai_fmt; + u8 streams; u8 i2s_net; + bool synchronous; bool use_dma; bool use_dual_fifo; bool has_ipg_clk_name; @@ -267,7 +289,9 @@ struct fsl_ssi { struct imx_pcm_fiq_params fiq_params; - struct platform_device *pdev; + struct platform_device *card_pdev; + char card_name[32]; + u32 card_idx; struct fsl_ssi_dbg dbg_stats; @@ -376,181 +400,172 @@ static irqreturn_t fsl_ssi_isr(int irq, void *dev_id) } /** - * Enable or disable all rx/tx config flags at once + * Set SCR, SIER, STCR and SRCR registers with cached values in regvals + * + * Notes: + * 1) For offline_config SoCs, enable all necessary bits of both streams + * when 1st stream starts, even if the opposite stream will not start + * 2) It also clears FIFO before setting regvals; SOR is safe to set online */ -static void fsl_ssi_rxtx_config(struct fsl_ssi *ssi, bool enable) +static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx) { - struct regmap *regs = ssi->regs; struct fsl_ssi_regvals *vals = ssi->regvals; + int dir = tx ? TX : RX; + u32 sier, srcr, stcr; + + /* Clear dirty data in the FIFO; It also prevents channel slipping */ + regmap_update_bits(ssi->regs, REG_SSI_SOR, + SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx)); + + /* + * On offline_config SoCs, SxCR and SIER are already configured when + * the previous stream started. So skip all SxCR and SIER settings + * to prevent online reconfigurations, then jump to set SCR directly + */ + if (ssi->soc->offline_config && ssi->streams) + goto enable_scr; - if (enable) { - regmap_update_bits(regs, REG_SSI_SIER, - vals[RX].sier | vals[TX].sier, - vals[RX].sier | vals[TX].sier); - regmap_update_bits(regs, REG_SSI_SRCR, - vals[RX].srcr | vals[TX].srcr, - vals[RX].srcr | vals[TX].srcr); - regmap_update_bits(regs, REG_SSI_STCR, - vals[RX].stcr | vals[TX].stcr, - vals[RX].stcr | vals[TX].stcr); + if (ssi->soc->offline_config) { + /* + * Online reconfiguration not supported, so enable all bits for + * both streams at once to avoid necessity of reconfigurations + */ + srcr = vals[RX].srcr | vals[TX].srcr; + stcr = vals[RX].stcr | vals[TX].stcr; + sier = vals[RX].sier | vals[TX].sier; } else { - regmap_update_bits(regs, REG_SSI_SRCR, - vals[RX].srcr | vals[TX].srcr, 0); - regmap_update_bits(regs, REG_SSI_STCR, - vals[RX].stcr | vals[TX].stcr, 0); - regmap_update_bits(regs, REG_SSI_SIER, - vals[RX].sier | vals[TX].sier, 0); + /* Otherwise, only set bits for the current stream */ + srcr = vals[dir].srcr; + stcr = vals[dir].stcr; + sier = vals[dir].sier; } -} -/** - * Clear remaining data in the FIFO to avoid dirty data or channel slipping - */ -static void fsl_ssi_fifo_clear(struct fsl_ssi *ssi, bool is_rx) -{ - bool tx = !is_rx; + /* Configure SRCR, STCR and SIER at once */ + regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, srcr); + regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, stcr); + regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, sier); - regmap_update_bits(ssi->regs, REG_SSI_SOR, - SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx)); +enable_scr: + /* + * Start DMA before setting TE to avoid FIFO underrun + * which may cause a channel slip or a channel swap + * + * TODO: FIQ cases might also need this upon testing + */ + if (ssi->use_dma && tx) { + int try = 100; + u32 sfcsr; + + /* Enable SSI first to send TX DMA request */ + regmap_update_bits(ssi->regs, REG_SSI_SCR, + SSI_SCR_SSIEN, SSI_SCR_SSIEN); + + /* Busy wait until TX FIFO not empty -- DMA working */ + do { + regmap_read(ssi->regs, REG_SSI_SFCSR, &sfcsr); + if (SSI_SFCSR_TFCNT0(sfcsr)) + break; + } while (--try); + + /* FIFO still empty -- something might be wrong */ + if (!SSI_SFCSR_TFCNT0(sfcsr)) + dev_warn(ssi->dev, "Timeout waiting TX FIFO filling\n"); + } + /* Enable all remaining bits in SCR */ + regmap_update_bits(ssi->regs, REG_SSI_SCR, + vals[dir].scr, vals[dir].scr); + + /* Log the enabled stream to the mask */ + ssi->streams |= BIT(dir); } /** - * Calculate the bits that have to be disabled for the current stream that is - * getting disabled. This keeps the bits enabled that are necessary for the - * second stream to work if 'stream_active' is true. + * Exclude bits that are used by the opposite stream * - * Detailed calculation: - * These are the values that need to be active after disabling. For non-active - * second stream, this is 0: - * vals_stream * !!stream_active + * When both streams are active, disabling some bits for the current stream + * might break the other stream if these bits are used by it. * - * The following computes the overall differences between the setup for the - * to-disable stream and the active stream, a simple XOR: - * vals_disable ^ (vals_stream * !!(stream_active)) + * @vals : regvals of the current stream + * @avals: regvals of the opposite stream + * @aactive: active state of the opposite stream * - * The full expression adds a mask on all values we care about + * 1) XOR vals and avals to get the differences if the other stream is active; + * Otherwise, return current vals if the other stream is not active + * 2) AND the result of 1) with the current vals */ -#define fsl_ssi_disable_val(vals_disable, vals_stream, stream_active) \ - ((vals_disable) & \ - ((vals_disable) ^ ((vals_stream) * (u32)!!(stream_active)))) +#define _ssi_xor_shared_bits(vals, avals, aactive) \ + ((vals) ^ ((avals) * (aactive))) + +#define ssi_excl_shared_bits(vals, avals, aactive) \ + ((vals) & _ssi_xor_shared_bits(vals, avals, aactive)) /** - * Enable or disable SSI configuration. + * Unset SCR, SIER, STCR and SRCR registers with cached values in regvals + * + * Notes: + * 1) For offline_config SoCs, to avoid online reconfigurations, disable all + * bits of both streams at once when the last stream is abort to end + * 2) It also clears FIFO after unsetting regvals; SOR is safe to set online */ -static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable, - struct fsl_ssi_regvals *vals) +static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx) { - struct regmap *regs = ssi->regs; - struct fsl_ssi_regvals *avals; - int nr_active_streams; - u32 scr; - int keep_active; - - regmap_read(regs, REG_SSI_SCR, &scr); + struct fsl_ssi_regvals *vals, *avals; + u32 sier, srcr, stcr, scr; + int adir = tx ? RX : TX; + int dir = tx ? TX : RX; + bool aactive; - nr_active_streams = !!(scr & SSI_SCR_TE) + !!(scr & SSI_SCR_RE); + /* Check if the opposite stream is active */ + aactive = ssi->streams & BIT(adir); - if (nr_active_streams - 1 > 0) - keep_active = 1; - else - keep_active = 0; + vals = &ssi->regvals[dir]; - /* Get the opposite direction to keep its values untouched */ - if (&ssi->regvals[RX] == vals) - avals = &ssi->regvals[TX]; - else - avals = &ssi->regvals[RX]; - - if (!enable) { - /* - * To keep the other stream safe, exclude shared bits between - * both streams, and get safe bits to disable current stream - */ - u32 scr = fsl_ssi_disable_val(vals->scr, avals->scr, - keep_active); - /* Safely disable SCR register for the stream */ - regmap_update_bits(regs, REG_SSI_SCR, scr, 0); - } + /* Get regvals of the opposite stream to keep opposite stream safe */ + avals = &ssi->regvals[adir]; /* - * For cases where online configuration is not supported, - * 1) Enable all necessary bits of both streams when 1st stream starts - * even if the opposite stream will not start - * 2) Disable all remaining bits of both streams when last stream ends + * To keep the other stream safe, exclude shared bits between + * both streams, and get safe bits to disable current stream */ - if (ssi->soc->offline_config) { - if ((enable && !nr_active_streams) || (!enable && !keep_active)) - fsl_ssi_rxtx_config(ssi, enable); + scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive); - goto config_done; - } + /* Disable safe bits of SCR register for the current stream */ + regmap_update_bits(ssi->regs, REG_SSI_SCR, scr, 0); - /* Online configure single direction while SSI is running */ - if (enable) { - fsl_ssi_fifo_clear(ssi, vals->scr & SSI_SCR_RE); + /* Log the disabled stream to the mask */ + ssi->streams &= ~BIT(dir); - regmap_update_bits(regs, REG_SSI_SRCR, vals->srcr, vals->srcr); - regmap_update_bits(regs, REG_SSI_STCR, vals->stcr, vals->stcr); - regmap_update_bits(regs, REG_SSI_SIER, vals->sier, vals->sier); - } else { - u32 sier; - u32 srcr; - u32 stcr; + /* + * On offline_config SoCs, if the other stream is active, skip + * SxCR and SIER settings to prevent online reconfigurations + */ + if (ssi->soc->offline_config && aactive) + goto fifo_clear; + if (ssi->soc->offline_config) { + /* Now there is only current stream active, disable all bits */ + srcr = vals->srcr | avals->srcr; + stcr = vals->stcr | avals->stcr; + sier = vals->sier | avals->sier; + } else { /* * To keep the other stream safe, exclude shared bits between * both streams, and get safe bits to disable current stream */ - sier = fsl_ssi_disable_val(vals->sier, avals->sier, - keep_active); - srcr = fsl_ssi_disable_val(vals->srcr, avals->srcr, - keep_active); - stcr = fsl_ssi_disable_val(vals->stcr, avals->stcr, - keep_active); - - /* Safely disable other control registers for the stream */ - regmap_update_bits(regs, REG_SSI_SRCR, srcr, 0); - regmap_update_bits(regs, REG_SSI_STCR, stcr, 0); - regmap_update_bits(regs, REG_SSI_SIER, sier, 0); + sier = ssi_excl_shared_bits(vals->sier, avals->sier, aactive); + srcr = ssi_excl_shared_bits(vals->srcr, avals->srcr, aactive); + stcr = ssi_excl_shared_bits(vals->stcr, avals->stcr, aactive); } -config_done: - /* Enabling of subunits is done after configuration */ - if (enable) { - /* - * Start DMA before setting TE to avoid FIFO underrun - * which may cause a channel slip or a channel swap - * - * TODO: FIQ cases might also need this upon testing - */ - if (ssi->use_dma && (vals->scr & SSI_SCR_TE)) { - int i; - int max_loop = 100; - - /* Enable SSI first to send TX DMA request */ - regmap_update_bits(regs, REG_SSI_SCR, - SSI_SCR_SSIEN, SSI_SCR_SSIEN); - - /* Busy wait until TX FIFO not empty -- DMA working */ - for (i = 0; i < max_loop; i++) { - u32 sfcsr; - regmap_read(regs, REG_SSI_SFCSR, &sfcsr); - if (SSI_SFCSR_TFCNT0(sfcsr)) - break; - } - if (i == max_loop) { - dev_err(ssi->dev, - "Timeout waiting TX FIFO filling\n"); - } - } - /* Enable all remaining bits */ - regmap_update_bits(regs, REG_SSI_SCR, vals->scr, vals->scr); - } -} + /* Clear configurations of SRCR, STCR and SIER at once */ + regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, 0); + regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, 0); + regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, 0); -static void fsl_ssi_rx_config(struct fsl_ssi *ssi, bool enable) -{ - fsl_ssi_config(ssi, enable, &ssi->regvals[RX]); +fifo_clear: + /* Clear remaining data in the FIFO */ + regmap_update_bits(ssi->regs, REG_SSI_SOR, + SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx)); } static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi) @@ -566,21 +581,6 @@ static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi) } } -static void fsl_ssi_tx_config(struct fsl_ssi *ssi, bool enable) -{ - /* - * SACCST might be modified via AC Link by a CODEC if it sends - * extra bits in their SLOTREQ requests, which'll accidentally - * send valid data to slots other than normal playback slots. - * - * To be safe, configure SACCST right before TX starts. - */ - if (enable && fsl_ssi_is_ac97(ssi)) - fsl_ssi_tx_ac97_saccst_setup(ssi); - - fsl_ssi_config(ssi, enable, &ssi->regvals[TX]); -} - /** * Cache critical bits of SIER, SRCR, STCR and SCR to later set them safely */ @@ -588,17 +588,20 @@ static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi) { struct fsl_ssi_regvals *vals = ssi->regvals; - vals[RX].sier = SSI_SIER_RFF0_EN; + vals[RX].sier = SSI_SIER_RFF0_EN | FSLSSI_SIER_DBG_RX_FLAGS; vals[RX].srcr = SSI_SRCR_RFEN0; - vals[RX].scr = 0; - vals[TX].sier = SSI_SIER_TFE0_EN; + vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE; + vals[TX].sier = SSI_SIER_TFE0_EN | FSLSSI_SIER_DBG_TX_FLAGS; vals[TX].stcr = SSI_STCR_TFEN0; - vals[TX].scr = 0; + vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE; /* AC97 has already enabled SSIEN, RE and TE, so ignore them */ - if (!fsl_ssi_is_ac97(ssi)) { - vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE; - vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE; + if (fsl_ssi_is_ac97(ssi)) + vals[RX].scr = vals[TX].scr = 0; + + if (ssi->use_dual_fifo) { + vals[RX].srcr |= SSI_SRCR_RFEN1; + vals[TX].stcr |= SSI_STCR_TFEN1; } if (ssi->use_dma) { @@ -608,9 +611,6 @@ static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi) vals[RX].sier |= SSI_SIER_RIE; vals[TX].sier |= SSI_SIER_TIE; } - - vals[RX].sier |= FSLSSI_SIER_DBG_RX_FLAGS; - vals[TX].sier |= FSLSSI_SIER_DBG_TX_FLAGS; } static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi) @@ -681,7 +681,6 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); struct regmap *regs = ssi->regs; - int synchronous = ssi->cpu_dai_drv.symmetric_rates, ret; u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i; unsigned long clkrate, baudrate, tmprate; unsigned int slots = params_channels(hw_params); @@ -689,6 +688,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, u64 sub, savesub = 100000; unsigned int freq; bool baudclk_is_used; + int ret; /* Override slots and slot_width if being specifically set... */ if (ssi->slots) @@ -767,7 +767,7 @@ static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR; /* STCCR is used for RX in synchronous mode */ - tx2 = tx || synchronous; + tx2 = tx || ssi->synchronous; regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr); if (!baudclk_is_used) { @@ -803,11 +803,6 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, unsigned int sample_size = params_width(hw_params); u32 wl = SSI_SxCCR_WL(sample_size); int ret; - u32 scr; - int enabled; - - regmap_read(regs, REG_SSI_SCR, &scr); - enabled = scr & SSI_SCR_SSIEN; /* * SSI is properly configured if it is enabled and running in @@ -815,7 +810,7 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, * that should set separate configurations for STCCR and SRCCR * despite running in the synchronous mode. */ - if (enabled && ssi->cpu_dai_drv.symmetric_rates) + if (ssi->streams && ssi->synchronous) return 0; if (fsl_ssi_is_i2s_master(ssi)) { @@ -834,20 +829,20 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, } if (!fsl_ssi_is_ac97(ssi)) { - u8 i2s_net; /* Normal + Network mode to send 16-bit data in 32-bit frames */ if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16) - i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET; - else - i2s_net = ssi->i2s_net; + ssi->i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET; + + /* Use Normal mode to send mono data at 1st slot of 2 slots */ + if (channels == 1) + ssi->i2s_net = SSI_SCR_I2S_MODE_NORMAL; regmap_update_bits(regs, REG_SSI_SCR, - SSI_SCR_I2S_NET_MASK, - channels == 1 ? 0 : i2s_net); + SSI_SCR_I2S_NET_MASK, ssi->i2s_net); } /* In synchronous mode, the SSI uses STCCR for capture */ - tx2 = tx || ssi->cpu_dai_drv.symmetric_rates; + tx2 = tx || ssi->synchronous; regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl); return 0; @@ -868,45 +863,31 @@ static int fsl_ssi_hw_free(struct snd_pcm_substream *substream, return 0; } -static int _fsl_ssi_set_dai_fmt(struct device *dev, - struct fsl_ssi *ssi, unsigned int fmt) +static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt) { - struct regmap *regs = ssi->regs; - u32 strcr = 0, stcr, srcr, scr, mask; - u8 wm; + u32 strcr = 0, scr = 0, stcr, srcr, mask; ssi->dai_fmt = fmt; - if (fsl_ssi_is_i2s_master(ssi) && IS_ERR(ssi->baudclk)) { - dev_err(dev, "missing baudclk for master mode\n"); - return -EINVAL; - } - - fsl_ssi_setup_regvals(ssi); - - regmap_read(regs, REG_SSI_SCR, &scr); - scr &= ~(SSI_SCR_SYN | SSI_SCR_I2S_MODE_MASK); /* Synchronize frame sync clock for TE to avoid data slipping */ scr |= SSI_SCR_SYNC_TX_FS; - mask = SSI_STCR_TXBIT0 | SSI_STCR_TFDIR | SSI_STCR_TXDIR | - SSI_STCR_TSCKP | SSI_STCR_TFSI | SSI_STCR_TFSL | SSI_STCR_TEFS; - regmap_read(regs, REG_SSI_STCR, &stcr); - regmap_read(regs, REG_SSI_SRCR, &srcr); - stcr &= ~mask; - srcr &= ~mask; + /* Set to default shifting settings: LSB_ALIGNED */ + strcr |= SSI_STCR_TXBIT0; /* Use Network mode as default */ ssi->i2s_net = SSI_SCR_NET; switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: - regmap_update_bits(regs, REG_SSI_STCCR, - SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); - regmap_update_bits(regs, REG_SSI_SRCCR, - SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { - case SND_SOC_DAIFMT_CBM_CFS: case SND_SOC_DAIFMT_CBS_CFS: + if (IS_ERR(ssi->baudclk)) { + dev_err(ssi->dev, + "missing baudclk for master mode\n"); + return -EINVAL; + } + /* fall through */ + case SND_SOC_DAIFMT_CBM_CFS: ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER; break; case SND_SOC_DAIFMT_CBM_CFM: @@ -916,30 +897,34 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev, return -EINVAL; } + regmap_update_bits(ssi->regs, REG_SSI_STCCR, + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); + regmap_update_bits(ssi->regs, REG_SSI_SRCCR, + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); + /* Data on rising edge of bclk, frame low, 1clk before data */ - strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | - SSI_STCR_TXBIT0 | SSI_STCR_TEFS; + strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | SSI_STCR_TEFS; break; case SND_SOC_DAIFMT_LEFT_J: /* Data on rising edge of bclk, frame high */ - strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP; + strcr |= SSI_STCR_TSCKP; break; case SND_SOC_DAIFMT_DSP_A: /* Data on rising edge of bclk, frame high, 1clk before data */ - strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | - SSI_STCR_TXBIT0 | SSI_STCR_TEFS; + strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TEFS; break; case SND_SOC_DAIFMT_DSP_B: /* Data on rising edge of bclk, frame high */ - strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TXBIT0; + strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP; break; case SND_SOC_DAIFMT_AC97: /* Data on falling edge of bclk, frame high, 1clk before data */ - ssi->i2s_net |= SSI_SCR_I2S_MODE_NORMAL; + strcr |= SSI_STCR_TEFS; break; default: return -EINVAL; } + scr |= ssi->i2s_net; /* DAI clock inversion */ @@ -973,49 +958,33 @@ static int _fsl_ssi_set_dai_fmt(struct device *dev, break; case SND_SOC_DAIFMT_CBM_CFM: /* Input bit or frame sync clocks */ - scr &= ~SSI_SCR_SYS_CLK_EN; break; case SND_SOC_DAIFMT_CBM_CFS: /* Input bit clock but output frame sync clock */ - strcr &= ~SSI_STCR_TXDIR; strcr |= SSI_STCR_TFDIR; - scr &= ~SSI_SCR_SYS_CLK_EN; break; default: - if (!fsl_ssi_is_ac97(ssi)) - return -EINVAL; + return -EINVAL; } - stcr |= strcr; - srcr |= strcr; + stcr = strcr; + srcr = strcr; /* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */ - if (ssi->cpu_dai_drv.symmetric_rates || fsl_ssi_is_ac97(ssi)) { + if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) { srcr &= ~SSI_SRCR_RXDIR; scr |= SSI_SCR_SYN; } - regmap_write(regs, REG_SSI_STCR, stcr); - regmap_write(regs, REG_SSI_SRCR, srcr); - regmap_write(regs, REG_SSI_SCR, scr); + mask = SSI_STCR_TFDIR | SSI_STCR_TXDIR | SSI_STCR_TSCKP | + SSI_STCR_TFSL | SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0; - wm = ssi->fifo_watermark; + regmap_update_bits(ssi->regs, REG_SSI_STCR, mask, stcr); + regmap_update_bits(ssi->regs, REG_SSI_SRCR, mask, srcr); - regmap_write(regs, REG_SSI_SFCSR, - SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) | - SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm)); - - if (ssi->use_dual_fifo) { - regmap_update_bits(regs, REG_SSI_SRCR, - SSI_SRCR_RFEN1, SSI_SRCR_RFEN1); - regmap_update_bits(regs, REG_SSI_STCR, - SSI_STCR_TFEN1, SSI_STCR_TFEN1); - regmap_update_bits(regs, REG_SSI_SCR, - SSI_SCR_TCH_EN, SSI_SCR_TCH_EN); - } - - if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_AC97) - fsl_ssi_setup_ac97(ssi); + mask = SSI_SCR_SYNC_TX_FS | SSI_SCR_I2S_MODE_MASK | + SSI_SCR_SYS_CLK_EN | SSI_SCR_SYN; + regmap_update_bits(ssi->regs, REG_SSI_SCR, mask, scr); return 0; } @@ -1031,7 +1000,7 @@ static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) if (fsl_ssi_is_ac97(ssi)) return 0; - return _fsl_ssi_set_dai_fmt(dai->dev, ssi, fmt); + return _fsl_ssi_set_dai_fmt(ssi, fmt); } /** @@ -1051,9 +1020,7 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, } /* The slot number should be >= 2 if using Network mode or I2S mode */ - regmap_read(regs, REG_SSI_SCR, &val); - val &= SSI_SCR_I2S_MODE_MASK | SSI_SCR_NET; - if (val && slots < 2) { + if (ssi->i2s_net && slots < 2) { dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n"); return -EINVAL; } @@ -1063,9 +1030,8 @@ static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, regmap_update_bits(regs, REG_SSI_SRCCR, SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots)); - /* Save SSIEN bit of the SCR register */ + /* Save the SCR register value */ regmap_read(regs, REG_SSI_SCR, &val); - val &= SSI_SCR_SSIEN; /* Temporarily enable SSI to allow SxMSKs to be configurable */ regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN); @@ -1092,39 +1058,34 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai); - struct regmap *regs = ssi->regs; + bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - fsl_ssi_tx_config(ssi, true); - else - fsl_ssi_rx_config(ssi, true); + /* + * SACCST might be modified via AC Link by a CODEC if it sends + * extra bits in their SLOTREQ requests, which'll accidentally + * send valid data to slots other than normal playback slots. + * + * To be safe, configure SACCST right before TX starts. + */ + if (tx && fsl_ssi_is_ac97(ssi)) + fsl_ssi_tx_ac97_saccst_setup(ssi); + fsl_ssi_config_enable(ssi, tx); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - fsl_ssi_tx_config(ssi, false); - else - fsl_ssi_rx_config(ssi, false); + fsl_ssi_config_disable(ssi, tx); break; default: return -EINVAL; } - /* Clear corresponding FIFO */ - if (fsl_ssi_is_ac97(ssi)) { - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - regmap_write(regs, REG_SSI_SOR, SSI_SOR_TX_CLR); - else - regmap_write(regs, REG_SSI_SOR, SSI_SOR_RX_CLR); - } - return 0; } @@ -1132,10 +1093,9 @@ static int fsl_ssi_dai_probe(struct snd_soc_dai *dai) { struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); - if (ssi->soc->imx && ssi->use_dma) { - dai->playback_dma_data = &ssi->dma_params_tx; - dai->capture_dma_data = &ssi->dma_params_rx; - } + if (ssi->soc->imx && ssi->use_dma) + snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx, + &ssi->dma_params_rx); return 0; } @@ -1175,6 +1135,7 @@ static const struct snd_soc_component_driver fsl_ssi_component = { static struct snd_soc_dai_driver fsl_ssi_ac97_dai = { .bus_control = true, + .symmetric_channels = 1, .probe = fsl_ssi_dai_probe, .playback = { .stream_name = "AC97 Playback", @@ -1272,6 +1233,53 @@ static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = { }; /** + * Initialize SSI registers + */ +static int fsl_ssi_hw_init(struct fsl_ssi *ssi) +{ + u32 wm = ssi->fifo_watermark; + + /* Initialize regvals */ + fsl_ssi_setup_regvals(ssi); + + /* Set watermarks */ + regmap_write(ssi->regs, REG_SSI_SFCSR, + SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) | + SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm)); + + /* Enable Dual FIFO mode */ + if (ssi->use_dual_fifo) + regmap_update_bits(ssi->regs, REG_SSI_SCR, + SSI_SCR_TCH_EN, SSI_SCR_TCH_EN); + + /* AC97 should start earlier to communicate with CODECs */ + if (fsl_ssi_is_ac97(ssi)) { + _fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt); + fsl_ssi_setup_ac97(ssi); + } + + return 0; +} + +/** + * Clear SSI registers + */ +static void fsl_ssi_hw_clean(struct fsl_ssi *ssi) +{ + /* Disable registers for AC97 */ + if (fsl_ssi_is_ac97(ssi)) { + /* Disable TE and RE bits first */ + regmap_update_bits(ssi->regs, REG_SSI_SCR, + SSI_SCR_TE | SSI_SCR_RE, 0); + /* Disable AC97 mode */ + regmap_write(ssi->regs, REG_SSI_SACNT, 0); + /* Unset WAIT bits */ + regmap_write(ssi->regs, REG_SSI_SOR, 0); + /* Disable SSI -- software reset */ + regmap_update_bits(ssi->regs, REG_SSI_SCR, SSI_SCR_SSIEN, 0); + } +} +/** * Make every character in a string lower-case */ static void make_lowercase(char *s) @@ -1285,9 +1293,7 @@ static void make_lowercase(char *s) static int fsl_ssi_imx_probe(struct platform_device *pdev, struct fsl_ssi *ssi, void __iomem *iomem) { - struct device_node *np = pdev->dev.of_node; struct device *dev = &pdev->dev; - u32 dmas[4]; int ret; /* Backward compatible for a DT without ipg clock name assigned */ @@ -1321,14 +1327,8 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev, ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0; ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0; - /* Set to dual FIFO mode according to the SDMA sciprt */ - ret = of_property_read_u32_array(np, "dmas", dmas, 4); - if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) { - ssi->use_dual_fifo = true; - /* - * Use even numbers to avoid channel swap due to SDMA - * script design - */ + /* Use even numbers to avoid channel swap due to SDMA script design */ + if (ssi->use_dual_fifo) { ssi->dma_params_tx.maxburst &= ~0x1; ssi->dma_params_rx.maxburst &= ~0x1; } @@ -1369,41 +1369,109 @@ static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi) clk_disable_unprepare(ssi->clk); } -static int fsl_ssi_probe(struct platform_device *pdev) +static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi) { - struct fsl_ssi *ssi; - int ret = 0; - struct device_node *np = pdev->dev.of_node; - struct device *dev = &pdev->dev; + struct device *dev = ssi->dev; + struct device_node *np = dev->of_node; const struct of_device_id *of_id; const char *p, *sprop; - const uint32_t *iprop; - struct resource *res; - void __iomem *iomem; - char name[64]; - struct regmap_config regconfig = fsl_ssi_regconfig; + const __be32 *iprop; + u32 dmas[4]; + int ret; of_id = of_match_device(fsl_ssi_ids, dev); if (!of_id || !of_id->data) return -EINVAL; - ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL); - if (!ssi) - return -ENOMEM; - ssi->soc = of_id->data; - ssi->dev = dev; + + ret = of_property_match_string(np, "clock-names", "ipg"); + /* Get error code if not found */ + ssi->has_ipg_clk_name = ret >= 0; /* Check if being used in AC97 mode */ sprop = of_get_property(np, "fsl,mode", NULL); - if (sprop) { - if (!strcmp(sprop, "ac97-slave")) - ssi->dai_fmt = SND_SOC_DAIFMT_AC97; + if (sprop && !strcmp(sprop, "ac97-slave")) { + ssi->dai_fmt = FSLSSI_AC97_DAIFMT; + + ret = of_property_read_u32(np, "cell-index", &ssi->card_idx); + if (ret) { + dev_err(dev, "failed to get SSI index property\n"); + return -EINVAL; + } + strcpy(ssi->card_name, "ac97-codec"); + } else if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) { + /* + * In synchronous mode, STCK and STFS ports are used by RX + * as well. So the software should limit the sample rates, + * sample bits and channels to be symmetric. + * + * This is exclusive with FSLSSI_AC97_FORMATS as AC97 runs + * in the SSI synchronous mode however it does not have to + * limit symmetric sample rates and sample bits. + */ + ssi->synchronous = true; } /* Select DMA or FIQ */ ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter"); + /* Fetch FIFO depth; Set to 8 for older DT without this property */ + iprop = of_get_property(np, "fsl,fifo-depth", NULL); + if (iprop) + ssi->fifo_depth = be32_to_cpup(iprop); + else + ssi->fifo_depth = 8; + + /* Use dual FIFO mode depending on the support from SDMA script */ + ret = of_property_read_u32_array(np, "dmas", dmas, 4); + if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) + ssi->use_dual_fifo = true; + + /* + * Backward compatible for older bindings by manually triggering the + * machine driver's probe(). Use /compatible property, including the + * address of CPU DAI driver structure, as the name of machine driver + * + * If card_name is set by AC97 earlier, bypass here since it uses a + * different name to register the device. + */ + if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) { + sprop = of_get_property(of_find_node_by_path("/"), + "compatible", NULL); + /* Strip "fsl," in the compatible name if applicable */ + p = strrchr(sprop, ','); + if (p) + sprop = p + 1; + snprintf(ssi->card_name, sizeof(ssi->card_name), + "snd-soc-%s", sprop); + make_lowercase(ssi->card_name); + ssi->card_idx = 0; + } + + return 0; +} + +static int fsl_ssi_probe(struct platform_device *pdev) +{ + struct regmap_config regconfig = fsl_ssi_regconfig; + struct device *dev = &pdev->dev; + struct fsl_ssi *ssi; + struct resource *res; + void __iomem *iomem; + int ret = 0; + + ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL); + if (!ssi) + return -ENOMEM; + + ssi->dev = dev; + + /* Probe from DT */ + ret = fsl_ssi_probe_from_dt(ssi); + if (ret) + return ret; + if (fsl_ssi_is_ac97(ssi)) { memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai, sizeof(fsl_ssi_ac97_dai)); @@ -1427,15 +1495,11 @@ static int fsl_ssi_probe(struct platform_device *pdev) REG_SSI_SRMSK / sizeof(uint32_t) + 1; } - ret = of_property_match_string(np, "clock-names", "ipg"); - if (ret < 0) { - ssi->has_ipg_clk_name = false; - ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config); - } else { - ssi->has_ipg_clk_name = true; + if (ssi->has_ipg_clk_name) ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem, ®config); - } + else + ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config); if (IS_ERR(ssi->regs)) { dev_err(dev, "failed to init register map\n"); return PTR_ERR(ssi->regs); @@ -1447,23 +1511,13 @@ static int fsl_ssi_probe(struct platform_device *pdev) return ssi->irq; } - /* Set software limitations for synchronous mode */ - if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) { - if (!fsl_ssi_is_ac97(ssi)) { - ssi->cpu_dai_drv.symmetric_rates = 1; - ssi->cpu_dai_drv.symmetric_samplebits = 1; - } - + /* Set software limitations for synchronous mode except AC97 */ + if (ssi->synchronous && !fsl_ssi_is_ac97(ssi)) { + ssi->cpu_dai_drv.symmetric_rates = 1; ssi->cpu_dai_drv.symmetric_channels = 1; + ssi->cpu_dai_drv.symmetric_samplebits = 1; } - /* Fetch FIFO depth; Set to 8 for older DT without this property */ - iprop = of_get_property(np, "fsl,fifo-depth", NULL); - if (iprop) - ssi->fifo_depth = be32_to_cpup(iprop); - else - ssi->fifo_depth = 8; - /* * Configure TX and RX DMA watermarks -- when to send a DMA request * @@ -1528,50 +1582,27 @@ static int fsl_ssi_probe(struct platform_device *pdev) if (ret) goto error_asoc_register; - /* Bypass it if using newer DT bindings of ASoC machine drivers */ - if (!of_get_property(np, "codec-handle", NULL)) - goto done; - - /* - * Backward compatible for older bindings by manually triggering the - * machine driver's probe(). Use /compatible property, including the - * address of CPU DAI driver structure, as the name of machine driver. - */ - sprop = of_get_property(of_find_node_by_path("/"), "compatible", NULL); - /* Sometimes the compatible name has a "fsl," prefix, so we strip it. */ - p = strrchr(sprop, ','); - if (p) - sprop = p + 1; - snprintf(name, sizeof(name), "snd-soc-%s", sprop); - make_lowercase(name); - - ssi->pdev = platform_device_register_data(dev, name, 0, NULL, 0); - if (IS_ERR(ssi->pdev)) { - ret = PTR_ERR(ssi->pdev); - dev_err(dev, "failed to register platform: %d\n", ret); - goto error_sound_card; - } - -done: - if (ssi->dai_fmt) - _fsl_ssi_set_dai_fmt(dev, ssi, ssi->dai_fmt); - - if (fsl_ssi_is_ac97(ssi)) { - u32 ssi_idx; + /* Initially configures SSI registers */ + fsl_ssi_hw_init(ssi); - ret = of_property_read_u32(np, "cell-index", &ssi_idx); - if (ret) { - dev_err(dev, "failed to get SSI index property\n"); - goto error_sound_card; - } - - ssi->pdev = platform_device_register_data(NULL, "ac97-codec", - ssi_idx, NULL, 0); - if (IS_ERR(ssi->pdev)) { - ret = PTR_ERR(ssi->pdev); - dev_err(dev, - "failed to register AC97 codec platform: %d\n", - ret); + /* Register a platform device for older bindings or AC97 */ + if (ssi->card_name[0]) { + struct device *parent = dev; + /* + * Do not set SSI dev as the parent of AC97 CODEC device since + * it does not have a DT node. Otherwise ASoC core will assume + * CODEC has the same DT node as the SSI, so it may bypass the + * dai_probe() of SSI and then cause NULL DMA data pointers. + */ + if (fsl_ssi_is_ac97(ssi)) + parent = NULL; + + ssi->card_pdev = platform_device_register_data(parent, + ssi->card_name, ssi->card_idx, NULL, 0); + if (IS_ERR(ssi->card_pdev)) { + ret = PTR_ERR(ssi->card_pdev); + dev_err(dev, "failed to register %s: %d\n", + ssi->card_name, ret); goto error_sound_card; } } @@ -1599,8 +1630,11 @@ static int fsl_ssi_remove(struct platform_device *pdev) fsl_ssi_debugfs_remove(&ssi->dbg_stats); - if (ssi->pdev) - platform_device_unregister(ssi->pdev); + if (ssi->card_pdev) + platform_device_unregister(ssi->card_pdev); + + /* Clean up SSI registers */ + fsl_ssi_hw_clean(ssi); if (ssi->soc->imx) fsl_ssi_imx_clean(pdev, ssi); diff --git a/sound/soc/fsl/fsl_ssi.h b/sound/soc/fsl/fsl_ssi.h index de2fdc5db726..18f8dd5209d5 100644 --- a/sound/soc/fsl/fsl_ssi.h +++ b/sound/soc/fsl/fsl_ssi.h @@ -12,9 +12,6 @@ #ifndef _MPC8610_I2S_H #define _MPC8610_I2S_H -#define RX 0 -#define TX 1 - /* -- SSI Register Map -- */ /* SSI Transmit Data Register 0 */ diff --git a/sound/soc/fsl/fsl_utils.c b/sound/soc/fsl/fsl_utils.c index b9e42b503a37..7592b0406370 100644 --- a/sound/soc/fsl/fsl_utils.c +++ b/sound/soc/fsl/fsl_utils.c @@ -36,7 +36,7 @@ int fsl_asoc_get_dma_channel(struct device_node *ssi_np, { struct resource res; struct device_node *dma_channel_np, *dma_np; - const u32 *iprop; + const __be32 *iprop; int ret; dma_channel_np = of_parse_phandle(ssi_np, name, 0); diff --git a/sound/soc/fsl/imx-pcm-fiq.c b/sound/soc/fsl/imx-pcm-fiq.c index 4e5fefee111e..0578f3486847 100644 --- a/sound/soc/fsl/imx-pcm-fiq.c +++ b/sound/soc/fsl/imx-pcm-fiq.c @@ -341,7 +341,7 @@ static void imx_pcm_fiq_free(struct snd_pcm *pcm) imx_pcm_free(pcm); } -static const struct snd_soc_platform_driver imx_soc_platform_fiq = { +static const struct snd_soc_component_driver imx_soc_component_fiq = { .ops = &imx_pcm_ops, .pcm_new = imx_pcm_fiq_new, .pcm_free = imx_pcm_fiq_free, @@ -368,7 +368,8 @@ int imx_pcm_fiq_init(struct platform_device *pdev, params->dma_params_tx->maxburst = 4; params->dma_params_rx->maxburst = 6; - ret = snd_soc_register_platform(&pdev->dev, &imx_soc_platform_fiq); + ret = devm_snd_soc_register_component(&pdev->dev, &imx_soc_component_fiq, + NULL, 0); if (ret) goto failed_register; @@ -384,7 +385,6 @@ EXPORT_SYMBOL_GPL(imx_pcm_fiq_init); void imx_pcm_fiq_exit(struct platform_device *pdev) { - snd_soc_unregister_platform(&pdev->dev); } EXPORT_SYMBOL_GPL(imx_pcm_fiq_exit); diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c deleted file mode 100644 index 206b898e554c..000000000000 --- a/sound/soc/fsl/imx-wm8962.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright 2013 Freescale Semiconductor, Inc. - * - * Based on imx-sgtl5000.c - * Copyright 2012 Freescale Semiconductor, Inc. - * Copyright 2012 Linaro Ltd. - * - * The code contained herein is licensed under the GNU General Public - * License. You may obtain a copy of the GNU General Public License - * Version 2 or later at the following locations: - * - * http://www.opensource.org/licenses/gpl-license.html - * http://www.gnu.org/copyleft/gpl.html - */ - -#include <linux/module.h> -#include <linux/of_platform.h> -#include <linux/i2c.h> -#include <linux/slab.h> -#include <linux/clk.h> -#include <sound/soc.h> -#include <sound/pcm_params.h> -#include <sound/soc-dapm.h> -#include <linux/pinctrl/consumer.h> - -#include "../codecs/wm8962.h" -#include "imx-audmux.h" - -#define DAI_NAME_SIZE 32 - -struct imx_wm8962_data { - struct snd_soc_dai_link dai; - struct snd_soc_card card; - char codec_dai_name[DAI_NAME_SIZE]; - char platform_name[DAI_NAME_SIZE]; - unsigned int clk_frequency; -}; - -struct imx_priv { - struct platform_device *pdev; - int sample_rate; - snd_pcm_format_t sample_format; -}; - -static const struct snd_soc_dapm_widget imx_wm8962_dapm_widgets[] = { - SND_SOC_DAPM_HP("Headphone Jack", NULL), - SND_SOC_DAPM_SPK("Ext Spk", NULL), - SND_SOC_DAPM_MIC("AMIC", NULL), - SND_SOC_DAPM_MIC("DMIC", NULL), -}; - -static int imx_hifi_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct imx_priv *priv = snd_soc_card_get_drvdata(rtd->card); - - priv->sample_rate = params_rate(params); - priv->sample_format = params_format(params); - - return 0; -} - -static const struct snd_soc_ops imx_hifi_ops = { - .hw_params = imx_hifi_hw_params, -}; - -static int imx_wm8962_set_bias_level(struct snd_soc_card *card, - struct snd_soc_dapm_context *dapm, - enum snd_soc_bias_level level) -{ - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_dai *codec_dai; - struct imx_priv *priv = snd_soc_card_get_drvdata(card); - struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); - struct device *dev = &priv->pdev->dev; - unsigned int pll_out; - int ret; - - rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name); - codec_dai = rtd->codec_dai; - if (dapm->dev != codec_dai->dev) - return 0; - - switch (level) { - case SND_SOC_BIAS_PREPARE: - if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { - if (priv->sample_format == SNDRV_PCM_FORMAT_S24_LE) - pll_out = priv->sample_rate * 384; - else - pll_out = priv->sample_rate * 256; - - ret = snd_soc_dai_set_pll(codec_dai, WM8962_FLL, - WM8962_FLL_MCLK, data->clk_frequency, - pll_out); - if (ret < 0) { - dev_err(dev, "failed to start FLL: %d\n", ret); - return ret; - } - - ret = snd_soc_dai_set_sysclk(codec_dai, - WM8962_SYSCLK_FLL, pll_out, - SND_SOC_CLOCK_IN); - if (ret < 0) { - dev_err(dev, "failed to set SYSCLK: %d\n", ret); - return ret; - } - } - break; - - case SND_SOC_BIAS_STANDBY: - if (dapm->bias_level == SND_SOC_BIAS_PREPARE) { - ret = snd_soc_dai_set_sysclk(codec_dai, - WM8962_SYSCLK_MCLK, data->clk_frequency, - SND_SOC_CLOCK_IN); - if (ret < 0) { - dev_err(dev, - "failed to switch away from FLL: %d\n", - ret); - return ret; - } - - ret = snd_soc_dai_set_pll(codec_dai, WM8962_FLL, - 0, 0, 0); - if (ret < 0) { - dev_err(dev, "failed to stop FLL: %d\n", ret); - return ret; - } - } - break; - - default: - break; - } - - return 0; -} - -static int imx_wm8962_late_probe(struct snd_soc_card *card) -{ - struct snd_soc_pcm_runtime *rtd; - struct snd_soc_dai *codec_dai; - struct imx_priv *priv = snd_soc_card_get_drvdata(card); - struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card); - struct device *dev = &priv->pdev->dev; - int ret; - - rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name); - codec_dai = rtd->codec_dai; - ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK, - data->clk_frequency, SND_SOC_CLOCK_IN); - if (ret < 0) - dev_err(dev, "failed to set sysclk in %s\n", __func__); - - return ret; -} - -static int imx_wm8962_probe(struct platform_device *pdev) -{ - struct device_node *np = pdev->dev.of_node; - struct device_node *ssi_np, *codec_np; - struct platform_device *ssi_pdev; - struct i2c_client *codec_dev; - struct imx_wm8962_data *data; - struct imx_priv *priv; - struct clk *codec_clk; - int int_port, ext_port; - int ret; - - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - priv->pdev = pdev; - priv->sample_rate = 44100; - priv->sample_format = SNDRV_PCM_FORMAT_S16_LE; - - ret = of_property_read_u32(np, "mux-int-port", &int_port); - if (ret) { - dev_err(&pdev->dev, "mux-int-port missing or invalid\n"); - return ret; - } - ret = of_property_read_u32(np, "mux-ext-port", &ext_port); - if (ret) { - dev_err(&pdev->dev, "mux-ext-port missing or invalid\n"); - return ret; - } - - /* - * The port numbering in the hardware manual starts at 1, while - * the audmux API expects it starts at 0. - */ - int_port--; - ext_port--; - ret = imx_audmux_v2_configure_port(int_port, - IMX_AUDMUX_V2_PTCR_SYN | - IMX_AUDMUX_V2_PTCR_TFSEL(ext_port) | - IMX_AUDMUX_V2_PTCR_TCSEL(ext_port) | - IMX_AUDMUX_V2_PTCR_TFSDIR | - IMX_AUDMUX_V2_PTCR_TCLKDIR, - IMX_AUDMUX_V2_PDCR_RXDSEL(ext_port)); - if (ret) { - dev_err(&pdev->dev, "audmux internal port setup failed\n"); - return ret; - } - ret = imx_audmux_v2_configure_port(ext_port, - IMX_AUDMUX_V2_PTCR_SYN, - IMX_AUDMUX_V2_PDCR_RXDSEL(int_port)); - if (ret) { - dev_err(&pdev->dev, "audmux external port setup failed\n"); - return ret; - } - - ssi_np = of_parse_phandle(pdev->dev.of_node, "ssi-controller", 0); - codec_np = of_parse_phandle(pdev->dev.of_node, "audio-codec", 0); - if (!ssi_np || !codec_np) { - dev_err(&pdev->dev, "phandle missing or invalid\n"); - ret = -EINVAL; - goto fail; - } - - ssi_pdev = of_find_device_by_node(ssi_np); - if (!ssi_pdev) { - dev_err(&pdev->dev, "failed to find SSI platform device\n"); - ret = -EINVAL; - goto fail; - } - codec_dev = of_find_i2c_device_by_node(codec_np); - if (!codec_dev || !codec_dev->dev.driver) { - dev_err(&pdev->dev, "failed to find codec platform device\n"); - ret = -EINVAL; - goto fail; - } - - data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); - if (!data) { - ret = -ENOMEM; - goto fail; - } - - codec_clk = clk_get(&codec_dev->dev, NULL); - if (IS_ERR(codec_clk)) { - ret = PTR_ERR(codec_clk); - dev_err(&codec_dev->dev, "failed to get codec clk: %d\n", ret); - goto fail; - } - - data->clk_frequency = clk_get_rate(codec_clk); - clk_put(codec_clk); - - data->dai.name = "HiFi"; - data->dai.stream_name = "HiFi"; - data->dai.codec_dai_name = "wm8962"; - data->dai.codec_of_node = codec_np; - data->dai.cpu_dai_name = dev_name(&ssi_pdev->dev); - data->dai.platform_of_node = ssi_np; - data->dai.ops = &imx_hifi_ops; - data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBM_CFM; - - data->card.dev = &pdev->dev; - ret = snd_soc_of_parse_card_name(&data->card, "model"); - if (ret) - goto fail; - ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing"); - if (ret) - goto fail; - data->card.num_links = 1; - data->card.owner = THIS_MODULE; - data->card.dai_link = &data->dai; - data->card.dapm_widgets = imx_wm8962_dapm_widgets; - data->card.num_dapm_widgets = ARRAY_SIZE(imx_wm8962_dapm_widgets); - - data->card.late_probe = imx_wm8962_late_probe; - data->card.set_bias_level = imx_wm8962_set_bias_level; - - platform_set_drvdata(pdev, &data->card); - snd_soc_card_set_drvdata(&data->card, data); - - ret = devm_snd_soc_register_card(&pdev->dev, &data->card); - if (ret) { - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); - goto fail; - } - -fail: - of_node_put(ssi_np); - of_node_put(codec_np); - - return ret; -} - -static const struct of_device_id imx_wm8962_dt_ids[] = { - { .compatible = "fsl,imx-audio-wm8962", }, - { /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, imx_wm8962_dt_ids); - -static struct platform_driver imx_wm8962_driver = { - .driver = { - .name = "imx-wm8962", - .pm = &snd_soc_pm_ops, - .of_match_table = imx_wm8962_dt_ids, - }, - .probe = imx_wm8962_probe, -}; -module_platform_driver(imx_wm8962_driver); - -MODULE_AUTHOR("Freescale Semiconductor, Inc."); -MODULE_DESCRIPTION("Freescale i.MX WM8962 ASoC machine driver"); -MODULE_LICENSE("GPL v2"); -MODULE_ALIAS("platform:imx-wm8962"); diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index e63029f1aabc..c1a4544eb16b 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c @@ -22,6 +22,8 @@ #include "mpc5200_dma.h" +#define DRV_NAME "mpc5200_dma" + /* * Interrupt handlers */ @@ -300,12 +302,13 @@ static const struct snd_pcm_ops psc_dma_ops = { static int psc_dma_new(struct snd_soc_pcm_runtime *rtd) { struct snd_card *card = rtd->card->snd_card; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct snd_soc_dai *dai = rtd->cpu_dai; struct snd_pcm *pcm = rtd->pcm; size_t size = psc_dma_hardware.buffer_bytes_max; int rc; - dev_dbg(rtd->platform->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n", + dev_dbg(component->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n", card, dai, pcm); rc = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); @@ -341,10 +344,11 @@ static int psc_dma_new(struct snd_soc_pcm_runtime *rtd) static void psc_dma_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct snd_pcm_substream *substream; int stream; - dev_dbg(rtd->platform->dev, "psc_dma_free(pcm=%p)\n", pcm); + dev_dbg(component->dev, "psc_dma_free(pcm=%p)\n", pcm); for (stream = 0; stream < 2; stream++) { substream = pcm->streams[stream].substream; @@ -356,7 +360,8 @@ static void psc_dma_free(struct snd_pcm *pcm) } } -static const struct snd_soc_platform_driver mpc5200_audio_dma_platform = { +static const struct snd_soc_component_driver mpc5200_audio_dma_component = { + .name = DRV_NAME, .ops = &psc_dma_ops, .pcm_new = &psc_dma_new, .pcm_free = &psc_dma_free, @@ -468,7 +473,8 @@ int mpc5200_audio_dma_create(struct platform_device *op) dev_set_drvdata(&op->dev, psc_dma); /* Tell the ASoC OF helpers about it */ - return snd_soc_register_platform(&op->dev, &mpc5200_audio_dma_platform); + return devm_snd_soc_register_component(&op->dev, + &mpc5200_audio_dma_component, NULL, 0); out_irq: free_irq(psc_dma->irq, psc_dma); free_irq(psc_dma->capture.irq, &psc_dma->capture); @@ -487,8 +493,6 @@ int mpc5200_audio_dma_destroy(struct platform_device *op) dev_dbg(&op->dev, "mpc5200_audio_dma_destroy()\n"); - snd_soc_unregister_platform(&op->dev); - bcom_gen_bd_rx_release(psc_dma->capture.bcom_task); bcom_gen_bd_tx_release(psc_dma->playback.bcom_task); diff --git a/sound/soc/img/pistachio-internal-dac.c b/sound/soc/img/pistachio-internal-dac.c index 53e11c6d4e22..915b894f99ce 100644 --- a/sound/soc/img/pistachio-internal-dac.c +++ b/sound/soc/img/pistachio-internal-dac.c @@ -122,26 +122,26 @@ static struct snd_soc_dai_driver pistachio_internal_dac_dais[] = { }, }; -static int pistachio_internal_dac_codec_probe(struct snd_soc_codec *codec) +static int pistachio_internal_dac_codec_probe(struct snd_soc_component *component) { - struct pistachio_internal_dac *dac = snd_soc_codec_get_drvdata(codec); + struct pistachio_internal_dac *dac = snd_soc_component_get_drvdata(component); - snd_soc_codec_init_regmap(codec, dac->regmap); + snd_soc_component_init_regmap(component, dac->regmap); return 0; } -static const struct snd_soc_codec_driver pistachio_internal_dac_driver = { - .probe = pistachio_internal_dac_codec_probe, - .idle_bias_off = true, - .component_driver = { - .controls = pistachio_internal_dac_snd_controls, - .num_controls = ARRAY_SIZE(pistachio_internal_dac_snd_controls), - .dapm_widgets = pistachio_internal_dac_widgets, - .num_dapm_widgets = ARRAY_SIZE(pistachio_internal_dac_widgets), - .dapm_routes = pistachio_internal_dac_routes, - .num_dapm_routes = ARRAY_SIZE(pistachio_internal_dac_routes), - }, +static const struct snd_soc_component_driver pistachio_internal_dac_driver = { + .probe = pistachio_internal_dac_codec_probe, + .controls = pistachio_internal_dac_snd_controls, + .num_controls = ARRAY_SIZE(pistachio_internal_dac_snd_controls), + .dapm_widgets = pistachio_internal_dac_widgets, + .num_dapm_widgets = ARRAY_SIZE(pistachio_internal_dac_widgets), + .dapm_routes = pistachio_internal_dac_routes, + .num_dapm_routes = ARRAY_SIZE(pistachio_internal_dac_routes), + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static int pistachio_internal_dac_probe(struct platform_device *pdev) @@ -202,11 +202,12 @@ static int pistachio_internal_dac_probe(struct platform_device *pdev) pm_runtime_enable(dev); pm_runtime_idle(dev); - ret = snd_soc_register_codec(dev, &pistachio_internal_dac_driver, + ret = devm_snd_soc_register_component(dev, + &pistachio_internal_dac_driver, pistachio_internal_dac_dais, ARRAY_SIZE(pistachio_internal_dac_dais)); if (ret) { - dev_err(dev, "failed to register codec: %d\n", ret); + dev_err(dev, "failed to register component: %d\n", ret); goto err_pwr; } @@ -225,7 +226,6 @@ static int pistachio_internal_dac_remove(struct platform_device *pdev) { struct pistachio_internal_dac *dac = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); pm_runtime_disable(&pdev->dev); pistachio_internal_dac_pwr_off(dac); regulator_disable(dac->supply); diff --git a/sound/soc/intel/atom/sst-atom-controls.c b/sound/soc/intel/atom/sst-atom-controls.c index 0f3604b55942..3672d36b4b66 100644 --- a/sound/soc/intel/atom/sst-atom-controls.c +++ b/sound/soc/intel/atom/sst-atom-controls.c @@ -1414,11 +1414,11 @@ static int sst_fill_module_list(struct snd_kcontrol *kctl, * name. First part of control name contains the pipe name (widget name). */ static int sst_fill_widget_module_info(struct snd_soc_dapm_widget *w, - struct snd_soc_platform *platform) + struct snd_soc_component *component) { struct snd_kcontrol *kctl; int index, ret = 0; - struct snd_card *card = platform->component.card->snd_card; + struct snd_card *card = component->card->snd_card; char *idx; down_read(&card->controls_rwsem); @@ -1468,13 +1468,13 @@ static int sst_fill_widget_module_info(struct snd_soc_dapm_widget *w, /** * sst_fill_linked_widgets - fill the parent pointer for the linked widget */ -static void sst_fill_linked_widgets(struct snd_soc_platform *platform, +static void sst_fill_linked_widgets(struct snd_soc_component *component, struct sst_ids *ids) { struct snd_soc_dapm_widget *w; unsigned int len = strlen(ids->parent_wname); - list_for_each_entry(w, &platform->component.card->widgets, list) { + list_for_each_entry(w, &component->card->widgets, list) { if (!strncmp(ids->parent_wname, w->name, len)) { ids->parent_w = w; break; @@ -1485,41 +1485,41 @@ static void sst_fill_linked_widgets(struct snd_soc_platform *platform, /** * sst_map_modules_to_pipe - fill algo/gains list for all pipes */ -static int sst_map_modules_to_pipe(struct snd_soc_platform *platform) +static int sst_map_modules_to_pipe(struct snd_soc_component *component) { struct snd_soc_dapm_widget *w; int ret = 0; - list_for_each_entry(w, &platform->component.card->widgets, list) { + list_for_each_entry(w, &component->card->widgets, list) { if (is_sst_dapm_widget(w) && (w->priv)) { struct sst_ids *ids = w->priv; - dev_dbg(platform->dev, "widget type=%d name=%s\n", + dev_dbg(component->dev, "widget type=%d name=%s\n", w->id, w->name); INIT_LIST_HEAD(&ids->algo_list); INIT_LIST_HEAD(&ids->gain_list); - ret = sst_fill_widget_module_info(w, platform); + ret = sst_fill_widget_module_info(w, component); if (ret < 0) return ret; /* fill linked widgets */ if (ids->parent_wname != NULL) - sst_fill_linked_widgets(platform, ids); + sst_fill_linked_widgets(component, ids); } } return 0; } -int sst_dsp_init_v2_dpcm(struct snd_soc_platform *platform) +int sst_dsp_init_v2_dpcm(struct snd_soc_component *component) { int i, ret = 0; struct snd_soc_dapm_context *dapm = - snd_soc_component_get_dapm(&platform->component); - struct sst_data *drv = snd_soc_platform_get_drvdata(platform); + snd_soc_component_get_dapm(component); + struct sst_data *drv = snd_soc_component_get_drvdata(component); unsigned int gains = ARRAY_SIZE(sst_gain_controls)/3; - drv->byte_stream = devm_kzalloc(platform->dev, + drv->byte_stream = devm_kzalloc(component->dev, SST_MAX_BIN_BYTES, GFP_KERNEL); if (!drv->byte_stream) return -ENOMEM; @@ -1537,26 +1537,26 @@ int sst_dsp_init_v2_dpcm(struct snd_soc_platform *platform) sst_gains[i].ramp_duration = SST_GAIN_RAMP_DURATION_DEFAULT; } - ret = snd_soc_add_platform_controls(platform, sst_gain_controls, + ret = snd_soc_add_component_controls(component, sst_gain_controls, ARRAY_SIZE(sst_gain_controls)); if (ret) return ret; /* Initialize algo control params */ - ret = sst_algo_control_init(platform->dev); + ret = sst_algo_control_init(component->dev); if (ret) return ret; - ret = snd_soc_add_platform_controls(platform, sst_algo_controls, + ret = snd_soc_add_component_controls(component, sst_algo_controls, ARRAY_SIZE(sst_algo_controls)); if (ret) return ret; - ret = snd_soc_add_platform_controls(platform, sst_slot_controls, + ret = snd_soc_add_component_controls(component, sst_slot_controls, ARRAY_SIZE(sst_slot_controls)); if (ret) return ret; - ret = sst_map_modules_to_pipe(platform); + ret = sst_map_modules_to_pipe(component); return ret; } diff --git a/sound/soc/intel/atom/sst-mfld-platform-compress.c b/sound/soc/intel/atom/sst-mfld-platform-compress.c index 1dbcab5a6ff0..6a44b19423cf 100644 --- a/sound/soc/intel/atom/sst-mfld-platform-compress.c +++ b/sound/soc/intel/atom/sst-mfld-platform-compress.c @@ -107,8 +107,8 @@ static int sst_platform_compr_set_params(struct snd_compr_stream *cstream, struct snd_sst_params str_params; struct sst_compress_cb cb; struct snd_soc_pcm_runtime *rtd = cstream->private_data; - struct snd_soc_platform *platform = rtd->platform; - struct sst_data *ctx = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_data *ctx = snd_soc_component_get_drvdata(component); stream = cstream->runtime->private_data; /* construct fw structure for this*/ diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c index 43e7fdd19f29..6c36da560877 100644 --- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c +++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c @@ -697,26 +697,22 @@ static int sst_pcm_new(struct snd_soc_pcm_runtime *rtd) return retval; } -static int sst_soc_probe(struct snd_soc_platform *platform) +static int sst_soc_probe(struct snd_soc_component *component) { - struct sst_data *drv = dev_get_drvdata(platform->dev); + struct sst_data *drv = dev_get_drvdata(component->dev); - drv->soc_card = platform->component.card; - return sst_dsp_init_v2_dpcm(platform); + drv->soc_card = component->card; + return sst_dsp_init_v2_dpcm(component); } -static const struct snd_soc_platform_driver sst_soc_platform_drv = { +static const struct snd_soc_component_driver sst_soc_platform_drv = { + .name = DRV_NAME, .probe = sst_soc_probe, .ops = &sst_platform_ops, .compr_ops = &sst_platform_compr_ops, .pcm_new = sst_pcm_new, }; -static const struct snd_soc_component_driver sst_component = { - .name = "sst", -}; - - static int sst_platform_probe(struct platform_device *pdev) { struct sst_data *drv; @@ -740,26 +736,16 @@ static int sst_platform_probe(struct platform_device *pdev) mutex_init(&drv->lock); dev_set_drvdata(&pdev->dev, drv); - ret = snd_soc_register_platform(&pdev->dev, &sst_soc_platform_drv); - if (ret) { - dev_err(&pdev->dev, "registering soc platform failed\n"); - return ret; - } - - ret = snd_soc_register_component(&pdev->dev, &sst_component, + ret = devm_snd_soc_register_component(&pdev->dev, &sst_soc_platform_drv, sst_platform_dai, ARRAY_SIZE(sst_platform_dai)); - if (ret) { + if (ret) dev_err(&pdev->dev, "registering cpu dais failed\n"); - snd_soc_unregister_platform(&pdev->dev); - } + return ret; } static int sst_platform_remove(struct platform_device *pdev) { - - snd_soc_unregister_component(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); dev_dbg(&pdev->dev, "sst_platform_remove success\n"); return 0; } diff --git a/sound/soc/intel/atom/sst-mfld-platform.h b/sound/soc/intel/atom/sst-mfld-platform.h index 31a58c25472c..5f729df57bb5 100644 --- a/sound/soc/intel/atom/sst-mfld-platform.h +++ b/sound/soc/intel/atom/sst-mfld-platform.h @@ -27,6 +27,8 @@ extern struct sst_device *sst; extern const struct snd_compr_ops sst_platform_compr_ops; +#define DRV_NAME "sst" + #define SST_MONO 1 #define SST_STEREO 2 #define SST_MAX_CAP 5 @@ -155,7 +157,7 @@ struct sst_device { struct sst_data; -int sst_dsp_init_v2_dpcm(struct snd_soc_platform *platform); +int sst_dsp_init_v2_dpcm(struct snd_soc_component *component); int sst_send_pipe_gains(struct snd_soc_dai *dai, int stream, int mute); int send_ssp_cmd(struct snd_soc_dai *dai, const char *id, bool enable); int sst_handle_vb_timer(struct snd_soc_dai *dai, bool enable); diff --git a/sound/soc/intel/atom/sst/sst.c b/sound/soc/intel/atom/sst/sst.c index 8afdff457579..0962bc9adc62 100644 --- a/sound/soc/intel/atom/sst/sst.c +++ b/sound/soc/intel/atom/sst/sst.c @@ -449,6 +449,13 @@ static int intel_sst_suspend(struct device *dev) dev_err(dev, "stream %d is running, can't suspend, abort\n", i); return -EBUSY; } + + if (ctx->pdata->streams_lost_on_suspend) { + stream->resume_status = stream->status; + stream->resume_prev = stream->prev; + if (stream->status != STREAM_UN_INIT) + sst_free_stream(ctx, i); + } } synchronize_irq(ctx->irq_num); flush_workqueue(ctx->post_msg_wq); @@ -509,8 +516,8 @@ static int intel_sst_resume(struct device *dev) { struct intel_sst_drv *ctx = dev_get_drvdata(dev); struct sst_fw_save *fw_save = ctx->fw_save; - int ret = 0; struct sst_block *block; + int i, ret = 0; if (!fw_save) return 0; @@ -550,6 +557,21 @@ static int intel_sst_resume(struct device *dev) sst_set_fw_state_locked(ctx, SST_FW_RUNNING); } + if (ctx->pdata->streams_lost_on_suspend) { + for (i = 1; i <= ctx->info.max_streams; i++) { + struct stream_info *stream = &ctx->streams[i]; + + if (stream->resume_status != STREAM_UN_INIT) { + dev_dbg(ctx->dev, "Re-allocing stream %d status %d prev %d\n", + i, stream->resume_status, + stream->resume_prev); + sst_realloc_stream(ctx, i); + stream->status = stream->resume_status; + stream->prev = stream->resume_prev; + } + } + } + sst_free_block(ctx, block); return ret; } diff --git a/sound/soc/intel/atom/sst/sst.h b/sound/soc/intel/atom/sst/sst.h index e02e2b4cc08f..b2a705dc9304 100644 --- a/sound/soc/intel/atom/sst/sst.h +++ b/sound/soc/intel/atom/sst/sst.h @@ -65,9 +65,7 @@ enum sst_stream_states { STREAM_UN_INIT = 0, /* Freed/Not used stream */ STREAM_RUNNING = 1, /* Running */ STREAM_PAUSED = 2, /* Paused stream */ - STREAM_DECODE = 3, /* stream is in decoding only state */ - STREAM_INIT = 4, /* stream init, waiting for data */ - STREAM_RESET = 5, /* force reset on recovery */ + STREAM_INIT = 3, /* stream init, waiting for data */ }; enum sst_ram_type { @@ -181,22 +179,22 @@ struct sst_block { * * @status : stream current state * @prev : stream prev state - * @ops : stream operation pb/cp/drm... - * @bufs: stream buffer list + * @resume_status : stream current state to restore on resume + * @resume_prev : stream prev state to restore on resume * @lock : stream mutex for protecting state + * @alloc_param : parameters used for stream (re-)allocation * @pcm_substream : PCM substream * @period_elapsed : PCM period elapsed callback * @sfreq : stream sampling freq - * @str_type : stream type * @cumm_bytes : cummulative bytes decoded - * @str_type : stream type - * @src : stream source */ struct stream_info { unsigned int status; unsigned int prev; - unsigned int ops; + unsigned int resume_status; + unsigned int resume_prev; struct mutex lock; + struct snd_sst_alloc_mrfld alloc_param; void *pcm_substream; void (*period_elapsed)(void *pcm_substream); @@ -212,7 +210,6 @@ struct stream_info { unsigned int num_ch; unsigned int pipe_id; - unsigned int str_id; unsigned int task_id; }; @@ -438,6 +435,7 @@ struct intel_sst_ops { void (*post_download)(struct intel_sst_drv *sst); }; +int sst_realloc_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); int sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int id); int sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int id); int sst_drop_stream(struct intel_sst_drv *sst_drv_ctx, int id); @@ -501,8 +499,6 @@ int sst_prepare_and_post_msg(struct intel_sst_drv *sst, void sst_process_pending_msg(struct work_struct *work); int sst_assign_pvt_id(struct intel_sst_drv *sst_drv_ctx); -void sst_init_stream(struct stream_info *stream, - int codec, int sst_id, int ops, u8 slot); int sst_validate_strid(struct intel_sst_drv *sst_drv_ctx, int str_id); struct stream_info *get_stream_info(struct intel_sst_drv *sst_drv_ctx, int str_id); diff --git a/sound/soc/intel/atom/sst/sst_acpi.c b/sound/soc/intel/atom/sst/sst_acpi.c index 6cd481bec275..c90b04cc071d 100644 --- a/sound/soc/intel/atom/sst/sst_acpi.c +++ b/sound/soc/intel/atom/sst/sst_acpi.c @@ -143,10 +143,11 @@ static struct sst_platform_info byt_rvp_platform_data = { .lib_info = &byt_lib_dnld_info, .res_info = &byt_rvp_res_info, .platform = "sst-mfld-platform", + .streams_lost_on_suspend = true, }; /* Cherryview (Cherrytrail and Braswell) uses same mrfld dpcm fw as Baytrail, - * so pdata is same as Baytrail. + * so pdata is same as Baytrail, minus the streams_lost_on_suspend quirk. */ static struct sst_platform_info chv_platform_data = { .probe_data = &byt_fwparse_info, diff --git a/sound/soc/intel/atom/sst/sst_drv_interface.c b/sound/soc/intel/atom/sst/sst_drv_interface.c index 71af5449be90..6a8b253c58d2 100644 --- a/sound/soc/intel/atom/sst/sst_drv_interface.c +++ b/sound/soc/intel/atom/sst/sst_drv_interface.c @@ -238,16 +238,7 @@ static int sst_cdev_close(struct device *dev, unsigned int str_id) return -EINVAL; } - if (stream->status == STREAM_RESET) { - dev_dbg(dev, "stream in reset state...\n"); - stream->status = STREAM_UN_INIT; - - retval = 0; - goto put; - } - retval = sst_free_stream(ctx, str_id); -put: stream->compr_cb_param = NULL; stream->compr_cb = NULL; @@ -256,7 +247,6 @@ put: dev_dbg(dev, "End\n"); return retval; - } static int sst_cdev_ack(struct device *dev, unsigned int str_id, @@ -486,16 +476,7 @@ static int sst_close_pcm_stream(struct device *dev, unsigned int str_id) return -EINVAL; } - if (stream->status == STREAM_RESET) { - /* silently fail here as we have cleaned the stream earlier */ - dev_dbg(ctx->dev, "stream in reset state...\n"); - - retval = 0; - goto put; - } - retval = free_stream_context(ctx, str_id); -put: stream->pcm_substream = NULL; stream->status = STREAM_UN_INIT; stream->period_elapsed = NULL; diff --git a/sound/soc/intel/atom/sst/sst_pvt.c b/sound/soc/intel/atom/sst/sst_pvt.c index b1e6b8f34a6a..af93244b4868 100644 --- a/sound/soc/intel/atom/sst/sst_pvt.c +++ b/sound/soc/intel/atom/sst/sst_pvt.c @@ -360,14 +360,6 @@ int sst_assign_pvt_id(struct intel_sst_drv *drv) return local; } -void sst_init_stream(struct stream_info *stream, - int codec, int sst_id, int ops, u8 slot) -{ - stream->status = STREAM_INIT; - stream->prev = STREAM_UN_INIT; - stream->ops = ops; -} - int sst_validate_strid( struct intel_sst_drv *sst_drv_ctx, int str_id) { diff --git a/sound/soc/intel/atom/sst/sst_stream.c b/sound/soc/intel/atom/sst/sst_stream.c index 7ee6aeb7e0af..107271f7dd63 100644 --- a/sound/soc/intel/atom/sst/sst_stream.c +++ b/sound/soc/intel/atom/sst/sst_stream.c @@ -35,29 +35,31 @@ int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params) { - struct snd_sst_alloc_mrfld alloc_param; + struct snd_pcm_params *pcm_params; struct snd_sst_params *str_params; struct snd_sst_tstamp fw_tstamp; struct stream_info *str_info; - struct snd_sst_alloc_response *response; - unsigned int str_id, pipe_id, task_id; - int i, num_ch, ret = 0; - void *data = NULL; + int i, num_ch, str_id; dev_dbg(sst_drv_ctx->dev, "Enter\n"); str_params = (struct snd_sst_params *)params; - memset(&alloc_param, 0, sizeof(alloc_param)); - alloc_param.operation = str_params->ops; - alloc_param.codec_type = str_params->codec; - alloc_param.sg_count = str_params->aparams.sg_count; - alloc_param.ring_buf_info[0].addr = + str_id = str_params->stream_id; + str_info = get_stream_info(sst_drv_ctx, str_id); + if (!str_info) + return -EINVAL; + + memset(&str_info->alloc_param, 0, sizeof(str_info->alloc_param)); + str_info->alloc_param.operation = str_params->ops; + str_info->alloc_param.codec_type = str_params->codec; + str_info->alloc_param.sg_count = str_params->aparams.sg_count; + str_info->alloc_param.ring_buf_info[0].addr = str_params->aparams.ring_buf_info[0].addr; - alloc_param.ring_buf_info[0].size = + str_info->alloc_param.ring_buf_info[0].size = str_params->aparams.ring_buf_info[0].size; - alloc_param.frag_size = str_params->aparams.frag_size; + str_info->alloc_param.frag_size = str_params->aparams.frag_size; - memcpy(&alloc_param.codec_params, &str_params->sparams, + memcpy(&str_info->alloc_param.codec_params, &str_params->sparams, sizeof(struct snd_sst_stream_params)); /* @@ -67,47 +69,62 @@ int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params) * Currently hardcoding as per FW reqm. */ num_ch = sst_get_num_channel(str_params); + pcm_params = &str_info->alloc_param.codec_params.uc.pcm_params; for (i = 0; i < 8; i++) { if (i < num_ch) - alloc_param.codec_params.uc.pcm_params.channel_map[i] = i; + pcm_params->channel_map[i] = i; else - alloc_param.codec_params.uc.pcm_params.channel_map[i] = 0xFF; + pcm_params->channel_map[i] = 0xff; } - str_id = str_params->stream_id; - str_info = get_stream_info(sst_drv_ctx, str_id); - if (str_info == NULL) { - dev_err(sst_drv_ctx->dev, "get stream info returned null\n"); - return -EINVAL; - } - - pipe_id = str_params->device_type; - task_id = str_params->task; - sst_drv_ctx->streams[str_id].pipe_id = pipe_id; - sst_drv_ctx->streams[str_id].task_id = task_id; + sst_drv_ctx->streams[str_id].status = STREAM_INIT; + sst_drv_ctx->streams[str_id].prev = STREAM_UN_INIT; + sst_drv_ctx->streams[str_id].pipe_id = str_params->device_type; + sst_drv_ctx->streams[str_id].task_id = str_params->task; sst_drv_ctx->streams[str_id].num_ch = num_ch; if (sst_drv_ctx->info.lpe_viewpt_rqd) - alloc_param.ts = sst_drv_ctx->info.mailbox_start + + str_info->alloc_param.ts = sst_drv_ctx->info.mailbox_start + sst_drv_ctx->tstamp + (str_id * sizeof(fw_tstamp)); else - alloc_param.ts = sst_drv_ctx->mailbox_add + + str_info->alloc_param.ts = sst_drv_ctx->mailbox_add + sst_drv_ctx->tstamp + (str_id * sizeof(fw_tstamp)); dev_dbg(sst_drv_ctx->dev, "alloc tstamp location = 0x%x\n", - alloc_param.ts); + str_info->alloc_param.ts); dev_dbg(sst_drv_ctx->dev, "assigned pipe id 0x%x to task %d\n", - pipe_id, task_id); + str_info->pipe_id, str_info->task_id); + + return sst_realloc_stream(sst_drv_ctx, str_id); +} + +/** + * sst_realloc_stream - Send msg for (re-)allocating a stream using the + * @sst_drv_ctx intel_sst_drv context pointer + * @str_id: stream ID + * + * Send a msg for (re-)allocating a stream using the parameters previously + * passed to sst_alloc_stream_mrfld() for the same stream ID. + * Return: 0 or negative errno value. + */ +int sst_realloc_stream(struct intel_sst_drv *sst_drv_ctx, int str_id) +{ + struct snd_sst_alloc_response *response; + struct stream_info *str_info; + void *data = NULL; + int ret; - /* allocate device type context */ - sst_init_stream(&sst_drv_ctx->streams[str_id], alloc_param.codec_type, - str_id, alloc_param.operation, 0); + str_info = get_stream_info(sst_drv_ctx, str_id); + if (!str_info) + return -EINVAL; dev_dbg(sst_drv_ctx->dev, "Alloc for str %d pipe %#x\n", - str_id, pipe_id); - ret = sst_prepare_and_post_msg(sst_drv_ctx, task_id, IPC_CMD, - IPC_IA_ALLOC_STREAM_MRFLD, pipe_id, sizeof(alloc_param), - &alloc_param, &data, true, true, false, true); + str_id, str_info->pipe_id); + + ret = sst_prepare_and_post_msg(sst_drv_ctx, str_info->task_id, IPC_CMD, + IPC_IA_ALLOC_STREAM_MRFLD, str_info->pipe_id, + sizeof(str_info->alloc_param), &str_info->alloc_param, + &data, true, true, false, true); if (ret < 0) { dev_err(sst_drv_ctx->dev, "FW alloc failed ret %d\n", ret); @@ -253,7 +270,7 @@ int sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int str_id) if (retval == 0) { str_info->prev = str_info->status; str_info->status = STREAM_PAUSED; - } else if (retval == SST_ERR_INVALID_STREAM_ID) { + } else if (retval == -SST_ERR_INVALID_STREAM_ID) { retval = -EINVAL; mutex_lock(&sst_drv_ctx->sst_lock); sst_clean_stream(str_info); @@ -285,7 +302,29 @@ int sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int str_id) return -EINVAL; if (str_info->status == STREAM_RUNNING) return 0; - if (str_info->status == STREAM_PAUSED) { + + if (str_info->resume_status == STREAM_PAUSED && + str_info->resume_prev == STREAM_RUNNING) { + /* + * Stream was running before suspend and re-created on resume, + * start it to get back to running state. + */ + dev_dbg(sst_drv_ctx->dev, "restart recreated stream after resume\n"); + str_info->status = STREAM_RUNNING; + str_info->prev = STREAM_PAUSED; + retval = sst_start_stream(sst_drv_ctx, str_id); + str_info->resume_status = STREAM_UN_INIT; + } else if (str_info->resume_status == STREAM_PAUSED && + str_info->resume_prev == STREAM_INIT) { + /* + * Stream was idle before suspend and re-created on resume, + * keep it as is. + */ + dev_dbg(sst_drv_ctx->dev, "leaving recreated stream idle after resume\n"); + str_info->status = STREAM_INIT; + str_info->prev = STREAM_PAUSED; + str_info->resume_status = STREAM_UN_INIT; + } else if (str_info->status == STREAM_PAUSED) { retval = sst_prepare_and_post_msg(sst_drv_ctx, str_info->task_id, IPC_CMD, IPC_IA_RESUME_STREAM_MRFLD, str_info->pipe_id, 0, NULL, NULL, diff --git a/sound/soc/intel/baytrail/sst-baytrail-pcm.c b/sound/soc/intel/baytrail/sst-baytrail-pcm.c index c54529320f07..aabb35bf6b96 100644 --- a/sound/soc/intel/baytrail/sst-baytrail-pcm.c +++ b/sound/soc/intel/baytrail/sst-baytrail-pcm.c @@ -23,6 +23,7 @@ #include "../common/sst-dsp-priv.h" #include "../common/sst-dsp.h" +#define DRV_NAME "byt-dai" #define BYT_PCM_COUNT 2 static const struct snd_pcm_hardware sst_byt_pcm_hardware = { @@ -69,8 +70,8 @@ static int sst_byt_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; struct sst_byt *byt = pdata->byt; u32 rate, bits; @@ -141,8 +142,8 @@ static int sst_byt_pcm_hw_free(struct snd_pcm_substream *substream) static int sst_byt_pcm_restore_stream_context(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; struct sst_byt *byt = pdata->byt; int ret; @@ -174,8 +175,8 @@ static void sst_byt_pcm_work(struct work_struct *work) static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; struct sst_byt *byt = pdata->byt; @@ -216,8 +217,8 @@ static u32 byt_notify_pointer(struct sst_byt_stream *stream, void *data) struct snd_pcm_substream *substream = pcm_data->substream; struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt *byt = pdata->byt; u32 pos, hw_pos; @@ -238,8 +239,8 @@ static snd_pcm_uframes_t sst_byt_pcm_pointer(struct snd_pcm_substream *substream { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; dev_dbg(rtd->dev, "PCM: DMA pointer %u bytes\n", pcm_data->hw_ptr); @@ -250,8 +251,8 @@ static snd_pcm_uframes_t sst_byt_pcm_pointer(struct snd_pcm_substream *substream static int sst_byt_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; struct sst_byt *byt = pdata->byt; @@ -278,8 +279,8 @@ static int sst_byt_pcm_open(struct snd_pcm_substream *substream) static int sst_byt_pcm_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct sst_byt_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_byt_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_byt_pcm_data *pcm_data = &pdata->pcm[substream->stream]; struct sst_byt *byt = pdata->byt; int ret; @@ -324,8 +325,8 @@ static int sst_byt_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_pcm *pcm = rtd->pcm; size_t size; - struct snd_soc_platform *platform = rtd->platform; - struct sst_pdata *pdata = dev_get_platdata(platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_pdata *pdata = dev_get_platdata(component->dev); int ret = 0; if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream || @@ -366,21 +367,21 @@ static struct snd_soc_dai_driver byt_dais[] = { }, }; -static int sst_byt_pcm_probe(struct snd_soc_platform *platform) +static int sst_byt_pcm_probe(struct snd_soc_component *component) { - struct sst_pdata *plat_data = dev_get_platdata(platform->dev); + struct sst_pdata *plat_data = dev_get_platdata(component->dev); struct sst_byt_priv_data *priv_data; int i; if (!plat_data) return -ENODEV; - priv_data = devm_kzalloc(platform->dev, sizeof(*priv_data), + priv_data = devm_kzalloc(component->dev, sizeof(*priv_data), GFP_KERNEL); if (!priv_data) return -ENOMEM; priv_data->byt = plat_data->dsp; - snd_soc_platform_set_drvdata(platform, priv_data); + snd_soc_component_set_drvdata(component, priv_data); for (i = 0; i < BYT_PCM_COUNT; i++) { mutex_init(&priv_data->pcm[i].mutex); @@ -390,22 +391,13 @@ static int sst_byt_pcm_probe(struct snd_soc_platform *platform) return 0; } -static int sst_byt_pcm_remove(struct snd_soc_platform *platform) -{ - return 0; -} - -static const struct snd_soc_platform_driver byt_soc_platform = { +static const struct snd_soc_component_driver byt_dai_component = { + .name = DRV_NAME, .probe = sst_byt_pcm_probe, - .remove = sst_byt_pcm_remove, .ops = &sst_byt_pcm_ops, .pcm_new = sst_byt_pcm_new, }; -static const struct snd_soc_component_driver byt_dai_component = { - .name = "byt-dai", -}; - #ifdef CONFIG_PM static int sst_byt_pcm_dev_suspend_late(struct device *dev) { @@ -461,19 +453,13 @@ static int sst_byt_pcm_dev_probe(struct platform_device *pdev) if (ret < 0) return -ENODEV; - ret = snd_soc_register_platform(&pdev->dev, &byt_soc_platform); - if (ret < 0) - goto err_plat; - - ret = snd_soc_register_component(&pdev->dev, &byt_dai_component, + ret = devm_snd_soc_register_component(&pdev->dev, &byt_dai_component, byt_dais, ARRAY_SIZE(byt_dais)); if (ret < 0) - goto err_comp; + goto err_plat; return 0; -err_comp: - snd_soc_unregister_platform(&pdev->dev); err_plat: sst_byt_dsp_free(&pdev->dev, sst_pdata); return ret; @@ -483,8 +469,6 @@ static int sst_byt_pcm_dev_remove(struct platform_device *pdev) { struct sst_pdata *sst_pdata = dev_get_platdata(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); sst_byt_dsp_free(&pdev->dev, sst_pdata); return 0; diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig index fefb1ee9fec6..24797482a3d2 100644 --- a/sound/soc/intel/boards/Kconfig +++ b/sound/soc/intel/boards/Kconfig @@ -125,6 +125,17 @@ config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH Say Y or m if you have such a device. This is a recommended option. If unsure select "N". +config SND_SOC_INTEL_CHT_BSW_NAU8824_MACH + tristate "Cherrytrail & Braswell with NAU88L24 codec" + depends on X86_INTEL_LPSS && I2C && ACPI + select SND_SOC_ACPI + select SND_SOC_NAU8824 + help + This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell + platforms with NAU88L24 audio codec. + Say Y or m if you have such a device. This is a recommended option. + If unsure select "N". + config SND_SOC_INTEL_BYT_CHT_DA7213_MACH tristate "Baytrail & Cherrytrail with DA7212/7213 codec" depends on X86_INTEL_LPSS && I2C && ACPI @@ -256,6 +267,20 @@ config SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH create an alsa sound card for RT5663 + RT5514 + MAX98927. Say Y or m if you have such a device. This is a recommended option. If unsure select "N". + +config SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH + tristate "KBL with DA7219 and MAX98357A in I2S Mode" + depends on MFD_INTEL_LPSS && I2C && ACPI + select SND_SOC_DA7219 + select SND_SOC_MAX98357A + select SND_SOC_DMIC + select SND_SOC_HDAC_HDMI + help + This adds support for ASoC Onboard Codec I2S machine driver. This will + create an alsa sound card for DA7219 + MAX98357A I2S audio codec. + Say Y if you have such a device. + If unsure select "N". + endif ## SND_SOC_INTEL_SKYLAKE endif ## SND_SOC_INTEL_MACH diff --git a/sound/soc/intel/boards/Makefile b/sound/soc/intel/boards/Makefile index 69d2dfaeb00c..92b5507291af 100644 --- a/sound/soc/intel/boards/Makefile +++ b/sound/soc/intel/boards/Makefile @@ -11,9 +11,11 @@ snd-soc-sst-bytcr-rt5651-objs := bytcr_rt5651.o snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o snd-soc-sst-cht-bsw-rt5645-objs := cht_bsw_rt5645.o snd-soc-sst-cht-bsw-max98090_ti-objs := cht_bsw_max98090_ti.o +snd-soc-sst-cht-bsw-nau8824-objs := cht_bsw_nau8824.o snd-soc-sst-byt-cht-da7213-objs := bytcht_da7213.o snd-soc-sst-byt-cht-es8316-objs := bytcht_es8316.o snd-soc-sst-byt-cht-nocodec-objs := bytcht_nocodec.o +snd-soc-kbl_da7219_max98357a-objs := kbl_da7219_max98357a.o snd-soc-kbl_rt5663_max98927-objs := kbl_rt5663_max98927.o snd-soc-kbl_rt5663_rt5514_max98927-objs := kbl_rt5663_rt5514_max98927.o snd-soc-skl_rt286-objs := skl_rt286.o @@ -32,9 +34,11 @@ obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH) += snd-soc-sst-bytcr-rt5651.o obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH) += snd-soc-sst-cht-bsw-rt5672.o obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH) += snd-soc-sst-cht-bsw-rt5645.o obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH) += snd-soc-sst-cht-bsw-max98090_ti.o +obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH) += snd-soc-sst-cht-bsw-nau8824.o obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH) += snd-soc-sst-byt-cht-da7213.o obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH) += snd-soc-sst-byt-cht-es8316.o obj-$(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH) += snd-soc-sst-byt-cht-nocodec.o +obj-$(CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH) += snd-soc-kbl_da7219_max98357a.o obj-$(CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH) += snd-soc-kbl_rt5663_max98927.o obj-$(CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH) += snd-soc-kbl_rt5663_rt5514_max98927.o obj-$(CONFIG_SND_SOC_INTEL_SKL_RT286_MACH) += snd-soc-skl_rt286.o diff --git a/sound/soc/intel/boards/bdw-rt5677.c b/sound/soc/intel/boards/bdw-rt5677.c index 058b8ccedf02..6ea360f33575 100644 --- a/sound/soc/intel/boards/bdw-rt5677.c +++ b/sound/soc/intel/boards/bdw-rt5677.c @@ -34,7 +34,7 @@ struct bdw_rt5677_priv { struct gpio_desc *gpio_hp_en; - struct snd_soc_codec *codec; + struct snd_soc_component *component; }; static int bdw_rt5677_event_hp(struct snd_soc_dapm_widget *w, @@ -183,7 +183,8 @@ static const struct snd_soc_ops bdw_rt5677_ops = { static int bdw_rt5677_rtd_init(struct snd_soc_pcm_runtime *rtd) { - struct sst_pdata *pdata = dev_get_platdata(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_pdata *pdata = dev_get_platdata(component->dev); struct sst_hsw *broadwell = pdata->dsp; int ret; @@ -203,26 +204,26 @@ static int bdw_rt5677_init(struct snd_soc_pcm_runtime *rtd) { struct bdw_rt5677_priv *bdw_rt5677 = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_codec *codec = rtd->codec; - struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); + struct snd_soc_component *component = rtd->codec_dai->component; + struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); int ret; - ret = devm_acpi_dev_add_driver_gpios(codec->dev, bdw_rt5677_gpios); + ret = devm_acpi_dev_add_driver_gpios(component->dev, bdw_rt5677_gpios); if (ret) - dev_warn(codec->dev, "Failed to add driver gpios\n"); + dev_warn(component->dev, "Failed to add driver gpios\n"); /* Enable codec ASRC function for Stereo DAC/Stereo1 ADC/DMIC/I2S1. * The ASRC clock source is clk_i2s1_asrc. */ - rt5677_sel_asrc_clk_src(codec, RT5677_DA_STEREO_FILTER | + rt5677_sel_asrc_clk_src(component, RT5677_DA_STEREO_FILTER | RT5677_AD_STEREO1_FILTER | RT5677_I2S1_SOURCE, RT5677_CLK_SEL_I2S1_ASRC); /* Request rt5677 GPIO for headphone amp control */ - bdw_rt5677->gpio_hp_en = devm_gpiod_get(codec->dev, "headphone-enable", + bdw_rt5677->gpio_hp_en = devm_gpiod_get(component->dev, "headphone-enable", GPIOD_OUT_LOW); if (IS_ERR(bdw_rt5677->gpio_hp_en)) { - dev_err(codec->dev, "Can't find HP_AMP_SHDN_L gpio\n"); + dev_err(component->dev, "Can't find HP_AMP_SHDN_L gpio\n"); return PTR_ERR(bdw_rt5677->gpio_hp_en); } @@ -230,25 +231,25 @@ static int bdw_rt5677_init(struct snd_soc_pcm_runtime *rtd) if (!snd_soc_card_jack_new(rtd->card, "Headphone Jack", SND_JACK_HEADPHONE, &headphone_jack, &headphone_jack_pin, 1)) { - headphone_jack_gpio.gpiod_dev = codec->dev; + headphone_jack_gpio.gpiod_dev = component->dev; if (snd_soc_jack_add_gpios(&headphone_jack, 1, &headphone_jack_gpio)) - dev_err(codec->dev, "Can't add headphone jack gpio\n"); + dev_err(component->dev, "Can't add headphone jack gpio\n"); } else { - dev_err(codec->dev, "Can't create headphone jack\n"); + dev_err(component->dev, "Can't create headphone jack\n"); } /* Create and initialize mic jack */ if (!snd_soc_card_jack_new(rtd->card, "Mic Jack", SND_JACK_MICROPHONE, &mic_jack, &mic_jack_pin, 1)) { - mic_jack_gpio.gpiod_dev = codec->dev; + mic_jack_gpio.gpiod_dev = component->dev; if (snd_soc_jack_add_gpios(&mic_jack, 1, &mic_jack_gpio)) - dev_err(codec->dev, "Can't add mic jack gpio\n"); + dev_err(component->dev, "Can't add mic jack gpio\n"); } else { - dev_err(codec->dev, "Can't create mic jack\n"); + dev_err(component->dev, "Can't create mic jack\n"); } - bdw_rt5677->codec = codec; + bdw_rt5677->component = component; snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); return 0; @@ -301,8 +302,8 @@ static int bdw_rt5677_suspend_pre(struct snd_soc_card *card) struct bdw_rt5677_priv *bdw_rt5677 = snd_soc_card_get_drvdata(card); struct snd_soc_dapm_context *dapm; - if (bdw_rt5677->codec) { - dapm = snd_soc_codec_get_dapm(bdw_rt5677->codec); + if (bdw_rt5677->component) { + dapm = snd_soc_component_get_dapm(bdw_rt5677->component); snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); } return 0; @@ -313,8 +314,8 @@ static int bdw_rt5677_resume_post(struct snd_soc_card *card) struct bdw_rt5677_priv *bdw_rt5677 = snd_soc_card_get_drvdata(card); struct snd_soc_dapm_context *dapm; - if (bdw_rt5677->codec) { - dapm = snd_soc_codec_get_dapm(bdw_rt5677->codec); + if (bdw_rt5677->component) { + dapm = snd_soc_component_get_dapm(bdw_rt5677->component); snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); } return 0; diff --git a/sound/soc/intel/boards/broadwell.c b/sound/soc/intel/boards/broadwell.c index 6dcbbcefc25b..7b0ee67b4fc8 100644 --- a/sound/soc/intel/boards/broadwell.c +++ b/sound/soc/intel/boards/broadwell.c @@ -78,7 +78,7 @@ static const struct snd_soc_dapm_route broadwell_rt286_map[] = { static int broadwell_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; int ret = 0; ret = snd_soc_card_jack_new(rtd->card, "Headset", SND_JACK_HEADSET | SND_JACK_BTN_0, &broadwell_headset, @@ -86,7 +86,7 @@ static int broadwell_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) if (ret) return ret; - rt286_mic_detect(codec, &broadwell_headset); + rt286_mic_detect(component, &broadwell_headset); return 0; } @@ -132,7 +132,8 @@ static const struct snd_soc_ops broadwell_rt286_ops = { static int broadwell_rtd_init(struct snd_soc_pcm_runtime *rtd) { - struct sst_pdata *pdata = dev_get_platdata(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_pdata *pdata = dev_get_platdata(component->dev); struct sst_hsw *broadwell = pdata->dsp; int ret; @@ -224,10 +225,9 @@ static int broadwell_suspend(struct snd_soc_card *card){ list_for_each_entry(component, &card->component_dev_list, card_list) { if (!strcmp(component->name, "i2c-INT343A:00")) { - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n"); - rt286_mic_detect(codec, NULL); + dev_dbg(component->dev, "disabling jack detect before going to suspend.\n"); + rt286_mic_detect(component, NULL); break; } } @@ -239,10 +239,9 @@ static int broadwell_resume(struct snd_soc_card *card){ list_for_each_entry(component, &card->component_dev_list, card_list) { if (!strcmp(component->name, "i2c-INT343A:00")) { - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - dev_dbg(codec->dev, "enabling jack detect for resume.\n"); - rt286_mic_detect(codec, &broadwell_headset); + dev_dbg(component->dev, "enabling jack detect for resume.\n"); + rt286_mic_detect(component, &broadwell_headset); break; } } diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c index f8a91a6f2a17..668c0934e942 100644 --- a/sound/soc/intel/boards/bxt_da7219_max98357a.c +++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c @@ -169,7 +169,7 @@ static int broxton_da7219_codec_init(struct snd_soc_pcm_runtime *rtd) { int ret; struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; /* Configure sysclk for codec */ ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, 19200000, @@ -192,7 +192,7 @@ static int broxton_da7219_codec_init(struct snd_soc_pcm_runtime *rtd) return ret; } - da7219_aad_jack_det(codec, &broxton_headset); + da7219_aad_jack_det(component, &broxton_headset); snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); @@ -522,12 +522,12 @@ static int bxt_card_late_probe(struct snd_soc_card *card) { struct bxt_card_private *ctx = snd_soc_card_get_drvdata(card); struct bxt_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -545,10 +545,10 @@ static int bxt_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* broxton audio machine driver for SPT + da7219 */ diff --git a/sound/soc/intel/boards/bxt_rt298.c b/sound/soc/intel/boards/bxt_rt298.c index 7843104fadcb..c7e9024e65ef 100644 --- a/sound/soc/intel/boards/bxt_rt298.c +++ b/sound/soc/intel/boards/bxt_rt298.c @@ -146,6 +146,9 @@ static const struct snd_soc_dapm_route geminilake_rt298_map[] = { { "dmic01_hifi", NULL, "DMIC01 Rx" }, { "DMIC01 Rx", NULL, "Capture" }, + { "dmic_voice", NULL, "DMIC16k Rx" }, + { "DMIC16k Rx", NULL, "Capture" }, + { "hifi3", NULL, "iDisp3 Tx"}, { "iDisp3 Tx", NULL, "iDisp3_out"}, { "hifi2", NULL, "iDisp2 Tx"}, @@ -167,7 +170,7 @@ static int broxton_rt298_fe_init(struct snd_soc_pcm_runtime *rtd) static int broxton_rt298_codec_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; int ret = 0; ret = snd_soc_card_jack_new(rtd->card, "Headset", @@ -178,7 +181,7 @@ static int broxton_rt298_codec_init(struct snd_soc_pcm_runtime *rtd) if (ret) return ret; - rt298_mic_detect(codec, &broxton_headset); + rt298_mic_detect(component, &broxton_headset); snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); @@ -457,6 +460,18 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = { .no_pcm = 1, }, { + .name = "dmic16k", + .id = 2, + .cpu_dai_name = "DMIC16k Pin", + .codec_name = "dmic-codec", + .codec_dai_name = "dmic-hifi", + .platform_name = "0000:00:0e.0", + .be_hw_params_fixup = broxton_dmic_fixup, + .ignore_suspend = 1, + .dpcm_capture = 1, + .no_pcm = 1, + }, + { .name = "iDisp1", .id = 3, .cpu_dai_name = "iDisp1 Pin", @@ -496,12 +511,12 @@ static int bxt_card_late_probe(struct snd_soc_card *card) { struct bxt_rt286_private *ctx = snd_soc_card_get_drvdata(card); struct bxt_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -519,10 +534,10 @@ static int bxt_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } diff --git a/sound/soc/intel/boards/byt-rt5640.c b/sound/soc/intel/boards/byt-rt5640.c index de9788a3fd06..df902d82145e 100644 --- a/sound/soc/intel/boards/byt-rt5640.c +++ b/sound/soc/intel/boards/byt-rt5640.c @@ -131,7 +131,7 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) { int ret; - struct snd_soc_codec *codec = runtime->codec; + struct snd_soc_component *component = runtime->codec_dai->component; struct snd_soc_card *card = runtime->card; const struct snd_soc_dapm_route *custom_map; int num_routes; @@ -165,7 +165,7 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) return ret; if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) { - ret = rt5640_dmic_enable(codec, 0, 0); + ret = rt5640_dmic_enable(component, 0, 0); if (ret) return ret; } diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c index b6a1cfeec830..a8d8bff788e7 100644 --- a/sound/soc/intel/boards/bytcr_rt5640.c +++ b/sound/soc/intel/boards/bytcr_rt5640.c @@ -444,14 +444,14 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; struct byt_rt5640_private *priv = snd_soc_card_get_drvdata(card); - struct snd_soc_codec *codec = runtime->codec; + struct snd_soc_component *component = runtime->codec_dai->component; const struct snd_soc_dapm_route *custom_map; int num_routes; int ret; card->dapm.idle_bias_off = true; - rt5640_sel_asrc_clk_src(codec, + rt5640_sel_asrc_clk_src(component, RT5640_DA_STEREO_FILTER | RT5640_DA_MONO_L_FILTER | RT5640_DA_MONO_R_FILTER | @@ -522,12 +522,12 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) return ret; if (byt_rt5640_quirk & BYT_RT5640_DIFF_MIC) { - snd_soc_update_bits(codec, RT5640_IN1_IN2, RT5640_IN_DF1, + snd_soc_component_update_bits(component, RT5640_IN1_IN2, RT5640_IN_DF1, RT5640_IN_DF1); } if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) { - ret = rt5640_dmic_enable(codec, 0, 0); + ret = rt5640_dmic_enable(component, 0, 0); if (ret) return ret; } diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c index 456526a93dd5..1b1997f1d60c 100644 --- a/sound/soc/intel/boards/bytcr_rt5651.c +++ b/sound/soc/intel/boards/bytcr_rt5651.c @@ -18,13 +18,16 @@ */ #include <linux/init.h> +#include <linux/i2c.h> #include <linux/module.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/acpi.h> #include <linux/clk.h> #include <linux/device.h> #include <linux/dmi.h> #include <linux/slab.h> +#include <asm/cpu_device_id.h> #include <asm/platform_sst_audio.h> #include <sound/pcm.h> #include <sound/pcm_params.h> @@ -39,22 +42,55 @@ enum { BYT_RT5651_IN1_MAP, BYT_RT5651_IN2_MAP, BYT_RT5651_IN1_IN2_MAP, - BYT_RT5651_IN3_MAP, + BYT_RT5651_IN1_HS_IN3_MAP, + BYT_RT5651_IN2_HS_IN3_MAP, }; -#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(7, 0)) -#define BYT_RT5651_DMIC_EN BIT(16) -#define BYT_RT5651_MCLK_EN BIT(17) -#define BYT_RT5651_MCLK_25MHZ BIT(18) +enum { + BYT_RT5651_JD_NULL = (RT5651_JD_NULL << 4), + BYT_RT5651_JD1_1 = (RT5651_JD1_1 << 4), + BYT_RT5651_JD1_2 = (RT5651_JD1_2 << 4), + BYT_RT5651_JD2 = (RT5651_JD2 << 4), +}; + +enum { + BYT_RT5651_OVCD_TH_600UA = (6 << 8), + BYT_RT5651_OVCD_TH_1500UA = (15 << 8), + BYT_RT5651_OVCD_TH_2000UA = (20 << 8), +}; + +enum { + BYT_RT5651_OVCD_SF_0P5 = (RT5651_OVCD_SF_0P5 << 13), + BYT_RT5651_OVCD_SF_0P75 = (RT5651_OVCD_SF_0P75 << 13), + BYT_RT5651_OVCD_SF_1P0 = (RT5651_OVCD_SF_1P0 << 13), + BYT_RT5651_OVCD_SF_1P5 = (RT5651_OVCD_SF_1P5 << 13), +}; + +#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(3, 0)) +#define BYT_RT5651_JDSRC(quirk) (((quirk) & GENMASK(7, 4)) >> 4) +#define BYT_RT5651_OVCD_TH(quirk) (((quirk) & GENMASK(12, 8)) >> 8) +#define BYT_RT5651_OVCD_SF(quirk) (((quirk) & GENMASK(14, 13)) >> 13) +#define BYT_RT5651_DMIC_EN BIT(16) +#define BYT_RT5651_MCLK_EN BIT(17) +#define BYT_RT5651_MCLK_25MHZ BIT(18) +#define BYT_RT5651_SSP2_AIF2 BIT(19) /* default is using AIF1 */ +#define BYT_RT5651_SSP0_AIF1 BIT(20) +#define BYT_RT5651_SSP0_AIF2 BIT(21) + +/* jack-detect-source + dmic-en + ovcd-th + -sf + terminating empty entry */ +#define MAX_NO_PROPS 5 struct byt_rt5651_private { struct clk *mclk; struct snd_soc_jack jack; }; -static unsigned long byt_rt5651_quirk = BYT_RT5651_DMIC_MAP | - BYT_RT5651_DMIC_EN | - BYT_RT5651_MCLK_EN; +/* Default: jack-detect on JD1_1, internal mic on in2, headsetmic on in3 */ +static unsigned long byt_rt5651_quirk = BYT_RT5651_MCLK_EN | + BYT_RT5651_JD1_1 | + BYT_RT5651_OVCD_TH_2000UA | + BYT_RT5651_OVCD_SF_0P75 | + BYT_RT5651_IN2_HS_IN3_MAP; static void log_quirks(struct device *dev) { @@ -64,17 +100,66 @@ static void log_quirks(struct device *dev) dev_info(dev, "quirk IN1_MAP enabled"); if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN2_MAP) dev_info(dev, "quirk IN2_MAP enabled"); - if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN3_MAP) - dev_info(dev, "quirk IN3_MAP enabled"); + if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_HS_IN3_MAP) + dev_info(dev, "quirk IN1_HS_IN3_MAP enabled"); + if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN2_HS_IN3_MAP) + dev_info(dev, "quirk IN2_HS_IN3_MAP enabled"); + if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) { + dev_info(dev, "quirk realtek,jack-detect-source %ld\n", + BYT_RT5651_JDSRC(byt_rt5651_quirk)); + dev_info(dev, "quirk realtek,over-current-threshold-microamp %ld\n", + BYT_RT5651_OVCD_TH(byt_rt5651_quirk) * 100); + dev_info(dev, "quirk realtek,over-current-scale-factor %ld\n", + BYT_RT5651_OVCD_SF(byt_rt5651_quirk)); + } if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN) dev_info(dev, "quirk DMIC enabled"); if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) dev_info(dev, "quirk MCLK_EN enabled"); if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ) dev_info(dev, "quirk MCLK_25MHZ enabled"); + if (byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) + dev_info(dev, "quirk SSP2_AIF2 enabled\n"); + if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) + dev_info(dev, "quirk SSP0_AIF1 enabled\n"); + if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2) + dev_info(dev, "quirk SSP0_AIF2 enabled\n"); } #define BYT_CODEC_DAI1 "rt5651-aif1" +#define BYT_CODEC_DAI2 "rt5651-aif2" + +static int byt_rt5651_prepare_and_enable_pll1(struct snd_soc_dai *codec_dai, + int rate, int bclk_ratio) +{ + int clk_id, clk_freq, ret; + + /* Configure the PLL before selecting it */ + if (!(byt_rt5651_quirk & BYT_RT5651_MCLK_EN)) { + clk_id = RT5651_PLL1_S_BCLK1, + clk_freq = rate * bclk_ratio; + } else { + clk_id = RT5651_PLL1_S_MCLK; + if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ) + clk_freq = 25000000; + else + clk_freq = 19200000; + } + ret = snd_soc_dai_set_pll(codec_dai, 0, clk_id, clk_freq, rate * 512); + if (ret < 0) { + dev_err(codec_dai->component->dev, "can't set pll: %d\n", ret); + return ret; + } + + ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1, + rate * 512, SND_SOC_CLOCK_IN); + if (ret < 0) { + dev_err(codec_dai->component->dev, "can't set clock %d\n", ret); + return ret; + } + + return 0; +} static int platform_clock_control(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event) @@ -86,6 +171,8 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w, int ret; codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI1); + if (!codec_dai) + codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI2); if (!codec_dai) { dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n"); @@ -101,9 +188,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w, return ret; } } - ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1, - 48000 * 512, - SND_SOC_CLOCK_IN); + ret = byt_rt5651_prepare_and_enable_pll1(codec_dai, 48000, 50); } else { /* * Set codec clock source to internal clock before @@ -145,13 +230,6 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = { {"Speaker", NULL, "Platform Clock"}, {"Line In", NULL, "Platform Clock"}, - {"AIF1 Playback", NULL, "ssp2 Tx"}, - {"ssp2 Tx", NULL, "codec_out0"}, - {"ssp2 Tx", NULL, "codec_out1"}, - {"codec_in0", NULL, "ssp2 Rx"}, - {"codec_in1", NULL, "ssp2 Rx"}, - {"ssp2 Rx", NULL, "AIF1 Capture"}, - {"Headset Mic", NULL, "micbias1"}, /* lowercase for rt5651 */ {"Headphone", NULL, "HPOL"}, {"Headphone", NULL, "HPOR"}, @@ -170,8 +248,8 @@ static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic_map[] = { static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_map[] = { {"Internal Mic", NULL, "micbias1"}, - {"IN2P", NULL, "Headset Mic"}, {"IN1P", NULL, "Internal Mic"}, + {"IN2P", NULL, "Headset Mic"}, }; static const struct snd_soc_dapm_route byt_rt5651_intmic_in2_map[] = { @@ -187,10 +265,52 @@ static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_in2_map[] = { {"IN3P", NULL, "Headset Mic"}, }; -static const struct snd_soc_dapm_route byt_rt5651_intmic_in3_map[] = { +static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_hs_in3_map[] = { {"Internal Mic", NULL, "micbias1"}, - {"IN3P", NULL, "Headset Mic"}, {"IN1P", NULL, "Internal Mic"}, + {"IN3P", NULL, "Headset Mic"}, +}; + +static const struct snd_soc_dapm_route byt_rt5651_intmic_in2_hs_in3_map[] = { + {"Internal Mic", NULL, "micbias1"}, + {"IN2P", NULL, "Internal Mic"}, + {"IN3P", NULL, "Headset Mic"}, +}; + +static const struct snd_soc_dapm_route byt_rt5651_ssp0_aif1_map[] = { + {"ssp0 Tx", NULL, "modem_out"}, + {"modem_in", NULL, "ssp0 Rx"}, + + {"AIF1 Playback", NULL, "ssp0 Tx"}, + {"ssp0 Rx", NULL, "AIF1 Capture"}, +}; + +static const struct snd_soc_dapm_route byt_rt5651_ssp0_aif2_map[] = { + {"ssp0 Tx", NULL, "modem_out"}, + {"modem_in", NULL, "ssp0 Rx"}, + + {"AIF2 Playback", NULL, "ssp0 Tx"}, + {"ssp0 Rx", NULL, "AIF2 Capture"}, +}; + +static const struct snd_soc_dapm_route byt_rt5651_ssp2_aif1_map[] = { + {"ssp2 Tx", NULL, "codec_out0"}, + {"ssp2 Tx", NULL, "codec_out1"}, + {"codec_in0", NULL, "ssp2 Rx"}, + {"codec_in1", NULL, "ssp2 Rx"}, + + {"AIF1 Playback", NULL, "ssp2 Tx"}, + {"ssp2 Rx", NULL, "AIF1 Capture"}, +}; + +static const struct snd_soc_dapm_route byt_rt5651_ssp2_aif2_map[] = { + {"ssp2 Tx", NULL, "codec_out0"}, + {"ssp2 Tx", NULL, "codec_out1"}, + {"codec_in0", NULL, "ssp2 Rx"}, + {"codec_in1", NULL, "ssp2 Rx"}, + + {"AIF2 Playback", NULL, "ssp2 Tx"}, + {"ssp2 Rx", NULL, "AIF2 Capture"}, }; static const struct snd_kcontrol_new byt_rt5651_controls[] = { @@ -217,44 +337,16 @@ static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; - int ret; - - snd_soc_dai_set_bclk_ratio(codec_dai, 50); + snd_pcm_format_t format = params_format(params); + int rate = params_rate(params); + int bclk_ratio; - ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1, - params_rate(params) * 512, - SND_SOC_CLOCK_IN); - if (ret < 0) { - dev_err(rtd->dev, "can't set codec clock %d\n", ret); - return ret; - } + if (format == SNDRV_PCM_FORMAT_S16_LE) + bclk_ratio = 32; + else + bclk_ratio = 50; - if (!(byt_rt5651_quirk & BYT_RT5651_MCLK_EN)) { - /* 2x25 bit slots on SSP2 */ - ret = snd_soc_dai_set_pll(codec_dai, 0, - RT5651_PLL1_S_BCLK1, - params_rate(params) * 50, - params_rate(params) * 512); - } else { - if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ) { - ret = snd_soc_dai_set_pll(codec_dai, 0, - RT5651_PLL1_S_MCLK, - 25000000, - params_rate(params) * 512); - } else { - ret = snd_soc_dai_set_pll(codec_dai, 0, - RT5651_PLL1_S_MCLK, - 19200000, - params_rate(params) * 512); - } - } - - if (ret < 0) { - dev_err(rtd->dev, "can't set codec pll: %d\n", ret); - return ret; - } - - return 0; + return byt_rt5651_prepare_and_enable_pll1(codec_dai, rate, bclk_ratio); } static int byt_rt5651_quirk_cb(const struct dmi_system_id *id) @@ -270,7 +362,7 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = { DMI_MATCH(DMI_SYS_VENDOR, "Circuitco"), DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Max B3 PLATFORM"), }, - .driver_data = (void *)(BYT_RT5651_IN3_MAP), + .driver_data = (void *)(BYT_RT5651_IN1_HS_IN3_MAP), }, { .callback = byt_rt5651_quirk_cb, @@ -279,7 +371,7 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Turbot"), }, .driver_data = (void *)(BYT_RT5651_MCLK_EN | - BYT_RT5651_IN3_MAP), + BYT_RT5651_IN1_HS_IN3_MAP), }, { .callback = byt_rt5651_quirk_cb, @@ -288,15 +380,76 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "KIANO SlimNote 14.2"), }, .driver_data = (void *)(BYT_RT5651_MCLK_EN | + BYT_RT5651_JD1_1 | + BYT_RT5651_OVCD_TH_2000UA | + BYT_RT5651_OVCD_SF_0P75 | + BYT_RT5651_IN1_IN2_MAP), + }, + { + /* Chuwi Vi8 Plus (CWI519) */ + .callback = byt_rt5651_quirk_cb, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"), + DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"), + }, + .driver_data = (void *)(BYT_RT5651_MCLK_EN | + BYT_RT5651_JD1_1 | + BYT_RT5651_OVCD_TH_2000UA | + BYT_RT5651_OVCD_SF_0P75 | + BYT_RT5651_IN2_HS_IN3_MAP), + }, + { + /* VIOS LTH17 */ + .callback = byt_rt5651_quirk_cb, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "VIOS"), + DMI_MATCH(DMI_PRODUCT_NAME, "LTH17"), + }, + .driver_data = (void *)(BYT_RT5651_MCLK_EN | + BYT_RT5651_JD1_1 | + BYT_RT5651_OVCD_TH_2000UA | + BYT_RT5651_OVCD_SF_1P0 | BYT_RT5651_IN1_IN2_MAP), }, {} }; +/* + * Note this MUST be called before snd_soc_register_card(), so that the props + * are in place before the codec component driver's probe function parses them. + */ +static int byt_rt5651_add_codec_device_props(const char *i2c_dev_name) +{ + struct property_entry props[MAX_NO_PROPS] = {}; + struct device *i2c_dev; + int ret, cnt = 0; + + i2c_dev = bus_find_device_by_name(&i2c_bus_type, NULL, i2c_dev_name); + if (!i2c_dev) + return -EPROBE_DEFER; + + props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source", + BYT_RT5651_JDSRC(byt_rt5651_quirk)); + + props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-threshold-microamp", + BYT_RT5651_OVCD_TH(byt_rt5651_quirk) * 100); + + props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-scale-factor", + BYT_RT5651_OVCD_SF(byt_rt5651_quirk)); + + if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN) + props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,dmic-en"); + + ret = device_add_properties(i2c_dev, props); + put_device(i2c_dev); + + return ret; +} + static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; - struct snd_soc_codec *codec = runtime->codec; + struct snd_soc_component *codec = runtime->codec_dai->component; struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card); const struct snd_soc_dapm_route *custom_map; int num_routes; @@ -304,6 +457,11 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) card->dapm.idle_bias_off = true; + /* Start with RC clk for jack-detect (we disable MCLK below) */ + if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) + snd_soc_component_update_bits(codec, RT5651_GLB_CLK, + RT5651_SCLK_SRC_MASK, RT5651_SCLK_SRC_RCCLK); + switch (BYT_RT5651_MAP(byt_rt5651_quirk)) { case BYT_RT5651_IN1_MAP: custom_map = byt_rt5651_intmic_in1_map; @@ -317,9 +475,13 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) custom_map = byt_rt5651_intmic_in1_in2_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_in2_map); break; - case BYT_RT5651_IN3_MAP: - custom_map = byt_rt5651_intmic_in3_map; - num_routes = ARRAY_SIZE(byt_rt5651_intmic_in3_map); + case BYT_RT5651_IN1_HS_IN3_MAP: + custom_map = byt_rt5651_intmic_in1_hs_in3_map; + num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_hs_in3_map); + break; + case BYT_RT5651_IN2_HS_IN3_MAP: + custom_map = byt_rt5651_intmic_in2_hs_in3_map; + num_routes = ARRAY_SIZE(byt_rt5651_intmic_in2_hs_in3_map); break; default: custom_map = byt_rt5651_intmic_dmic_map; @@ -329,6 +491,26 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) if (ret) return ret; + if (byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) { + ret = snd_soc_dapm_add_routes(&card->dapm, + byt_rt5651_ssp2_aif2_map, + ARRAY_SIZE(byt_rt5651_ssp2_aif2_map)); + } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) { + ret = snd_soc_dapm_add_routes(&card->dapm, + byt_rt5651_ssp0_aif1_map, + ARRAY_SIZE(byt_rt5651_ssp0_aif1_map)); + } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2) { + ret = snd_soc_dapm_add_routes(&card->dapm, + byt_rt5651_ssp0_aif2_map, + ARRAY_SIZE(byt_rt5651_ssp0_aif2_map)); + } else { + ret = snd_soc_dapm_add_routes(&card->dapm, + byt_rt5651_ssp2_aif1_map, + ARRAY_SIZE(byt_rt5651_ssp2_aif1_map)); + } + if (ret) + return ret; + ret = snd_soc_add_card_controls(card, byt_rt5651_controls, ARRAY_SIZE(byt_rt5651_controls)); if (ret) { @@ -362,17 +544,21 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) dev_err(card->dev, "unable to set MCLK rate\n"); } - ret = snd_soc_card_jack_new(runtime->card, "Headset", + if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) { + ret = snd_soc_card_jack_new(runtime->card, "Headset", SND_JACK_HEADSET, &priv->jack, bytcr_jack_pins, ARRAY_SIZE(bytcr_jack_pins)); - if (ret) { - dev_err(runtime->dev, "Headset jack creation failed %d\n", ret); - return ret; - } + if (ret) { + dev_err(runtime->dev, "jack creation failed %d\n", ret); + return ret; + } - rt5651_set_jack_detect(codec, &priv->jack); + ret = snd_soc_component_set_jack(codec, &priv->jack, NULL); + if (ret) + return ret; + } - return ret; + return 0; } static const struct snd_soc_pcm_stream byt_rt5651_dai_params = { @@ -390,18 +576,26 @@ static int byt_rt5651_codec_fixup(struct snd_soc_pcm_runtime *rtd, SNDRV_PCM_HW_PARAM_RATE); struct snd_interval *channels = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); - int ret; + int ret, bits; - /* The DSP will covert the FE rate to 48k, stereo, 24bits */ + /* The DSP will covert the FE rate to 48k, stereo */ rate->min = rate->max = 48000; channels->min = channels->max = 2; - /* set SSP2 to 24-bit */ - params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); + if ((byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) || + (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) { + /* set SSP0 to 16-bit */ + params_set_format(params, SNDRV_PCM_FORMAT_S16_LE); + bits = 16; + } else { + /* set SSP2 to 24-bit */ + params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); + bits = 24; + } /* * Default mode for SSP configuration is TDM 4 slot, override config - * with explicit setting to I2S 2ch 24-bit. The word length is set with + * with explicit setting to I2S 2ch. The word length is set with * dai_set_tdm_slot() since there is no other API exposed */ ret = snd_soc_dai_set_fmt(rtd->cpu_dai, @@ -415,7 +609,7 @@ static int byt_rt5651_codec_fixup(struct snd_soc_pcm_runtime *rtd, return ret; } - ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, 24); + ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, bits); if (ret < 0) { dev_err(rtd->dev, "can't set I2S config, err %d\n", ret); return ret; @@ -510,12 +704,32 @@ static struct snd_soc_card byt_rt5651_card = { }; static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN]; +static char byt_rt5651_codec_aif_name[12]; /* = "rt5651-aif[1|2]" */ +static char byt_rt5651_cpu_dai_name[10]; /* = "ssp[0|2]-port" */ + +static bool is_valleyview(void) +{ + static const struct x86_cpu_id cpu_ids[] = { + { X86_VENDOR_INTEL, 6, 55 }, /* Valleyview, Bay Trail */ + {} + }; + + if (!x86_match_cpu(cpu_ids)) + return false; + return true; +} + +struct acpi_chan_package { /* ACPICA seems to require 64 bit integers */ + u64 aif_value; /* 1: AIF1, 2: AIF2 */ + u64 mclock_value; /* usually 25MHz (0x17d7940), ignored */ +}; static int snd_byt_rt5651_mc_probe(struct platform_device *pdev) { struct byt_rt5651_private *priv; struct snd_soc_acpi_mach *mach; const char *i2c_name = NULL; + bool is_bytcr = false; int ret_val = 0; int dai_index = 0; int i; @@ -540,17 +754,105 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev) /* fixup codec name based on HID */ i2c_name = acpi_dev_get_first_match_name(mach->id, NULL, -1); - if (i2c_name) { - snprintf(byt_rt5651_codec_name, sizeof(byt_rt5651_codec_name), - "%s%s", "i2c-", i2c_name); + if (!i2c_name) { + dev_err(&pdev->dev, "Error cannot find '%s' dev\n", mach->id); + return -ENODEV; + } + snprintf(byt_rt5651_codec_name, sizeof(byt_rt5651_codec_name), + "%s%s", "i2c-", i2c_name); + byt_rt5651_dais[dai_index].codec_name = byt_rt5651_codec_name; - byt_rt5651_dais[dai_index].codec_name = byt_rt5651_codec_name; + /* + * swap SSP0 if bytcr is detected + * (will be overridden if DMI quirk is detected) + */ + if (is_valleyview()) { + struct sst_platform_info *p_info = mach->pdata; + const struct sst_res_info *res_info = p_info->res_info; + + if (res_info->acpi_ipc_irq_index == 0) + is_bytcr = true; + } + + if (is_bytcr) { + /* + * Baytrail CR platforms may have CHAN package in BIOS, try + * to find relevant routing quirk based as done on Windows + * platforms. We have to read the information directly from the + * BIOS, at this stage the card is not created and the links + * with the codec driver/pdata are non-existent + */ + + struct acpi_chan_package chan_package; + + /* format specified: 2 64-bit integers */ + struct acpi_buffer format = {sizeof("NN"), "NN"}; + struct acpi_buffer state = {0, NULL}; + struct snd_soc_acpi_package_context pkg_ctx; + bool pkg_found = false; + + state.length = sizeof(chan_package); + state.pointer = &chan_package; + + pkg_ctx.name = "CHAN"; + pkg_ctx.length = 2; + pkg_ctx.format = &format; + pkg_ctx.state = &state; + pkg_ctx.data_valid = false; + + pkg_found = snd_soc_acpi_find_package_from_hid(mach->id, + &pkg_ctx); + if (pkg_found) { + if (chan_package.aif_value == 1) { + dev_info(&pdev->dev, "BIOS Routing: AIF1 connected\n"); + byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF1; + } else if (chan_package.aif_value == 2) { + dev_info(&pdev->dev, "BIOS Routing: AIF2 connected\n"); + byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF2; + } else { + dev_info(&pdev->dev, "BIOS Routing isn't valid, ignored\n"); + pkg_found = false; + } + } + + if (!pkg_found) { + /* no BIOS indications, assume SSP0-AIF2 connection */ + byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF2; + } } /* check quirks before creating card */ dmi_check_system(byt_rt5651_quirk_table); + + /* Must be called before register_card, also see declaration comment. */ + ret_val = byt_rt5651_add_codec_device_props(byt_rt5651_codec_name); + if (ret_val) + return ret_val; + log_quirks(&pdev->dev); + if ((byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) || + (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) { + /* fixup codec aif name */ + snprintf(byt_rt5651_codec_aif_name, + sizeof(byt_rt5651_codec_aif_name), + "%s", "rt5651-aif2"); + + byt_rt5651_dais[dai_index].codec_dai_name = + byt_rt5651_codec_aif_name; + } + + if ((byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) || + (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) { + /* fixup cpu dai name name */ + snprintf(byt_rt5651_cpu_dai_name, + sizeof(byt_rt5651_cpu_dai_name), + "%s", "ssp0-port"); + + byt_rt5651_dais[dai_index].cpu_dai_name = + byt_rt5651_cpu_dai_name; + } + if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) { priv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3"); if (IS_ERR(priv->mclk)) { diff --git a/sound/soc/intel/boards/cht_bsw_nau8824.c b/sound/soc/intel/boards/cht_bsw_nau8824.c new file mode 100644 index 000000000000..680f2b3a24f9 --- /dev/null +++ b/sound/soc/intel/boards/cht_bsw_nau8824.c @@ -0,0 +1,282 @@ +/* + * cht-bsw-nau8824.c - ASoc Machine driver for Intel Cherryview-based + * platforms Cherrytrail and Braswell, with nau8824 codec. + * + * Copyright (C) 2018 Intel Corp + * Copyright (C) 2018 Nuvoton Technology Corp + * + * Author: Wang, Joseph C <joequant@gmail.com> + * Co-author: John Hsu <KCHSU0@nuvoton.com> + * This file is based on cht_bsw_rt5672.c and cht-bsw-max98090.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/slab.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include <sound/jack.h> +#include <linux/input.h> +#include "../atom/sst-atom-controls.h" +#include "../../codecs/nau8824.h" + +struct cht_mc_private { + struct snd_soc_jack jack; +}; + +static struct snd_soc_jack_pin cht_bsw_jack_pins[] = { + { + .pin = "Headphone", + .mask = SND_JACK_HEADPHONE, + }, + { + .pin = "Headset Mic", + .mask = SND_JACK_MICROPHONE, + }, +}; + +static const struct snd_soc_dapm_widget cht_dapm_widgets[] = { + SND_SOC_DAPM_HP("Headphone", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_MIC("Int Mic", NULL), + SND_SOC_DAPM_SPK("Ext Spk", NULL), +}; + +static const struct snd_soc_dapm_route cht_audio_map[] = { + {"Ext Spk", NULL, "SPKOUTL"}, + {"Ext Spk", NULL, "SPKOUTR"}, + {"Headphone", NULL, "HPOL"}, + {"Headphone", NULL, "HPOR"}, + {"MIC1", NULL, "Int Mic"}, + {"MIC2", NULL, "Int Mic"}, + {"HSMIC1", NULL, "Headset Mic"}, + {"HSMIC2", NULL, "Headset Mic"}, + {"Playback", NULL, "ssp2 Tx"}, + {"ssp2 Tx", NULL, "codec_out0"}, + {"ssp2 Tx", NULL, "codec_out1"}, + {"codec_in0", NULL, "ssp2 Rx" }, + {"codec_in1", NULL, "ssp2 Rx" }, + {"ssp2 Rx", NULL, "Capture"}, +}; + +static const struct snd_kcontrol_new cht_mc_controls[] = { + SOC_DAPM_PIN_SWITCH("Headphone"), + SOC_DAPM_PIN_SWITCH("Headset Mic"), + SOC_DAPM_PIN_SWITCH("Int Mic"), + SOC_DAPM_PIN_SWITCH("Ext Spk"), +}; + +static int cht_aif1_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *codec_dai = rtd->codec_dai; + int ret; + + ret = snd_soc_dai_set_sysclk(codec_dai, NAU8824_CLK_FLL_FS, 0, + SND_SOC_CLOCK_IN); + if (ret < 0) { + dev_err(codec_dai->dev, "can't set FS clock %d\n", ret); + return ret; + } + ret = snd_soc_dai_set_pll(codec_dai, 0, 0, params_rate(params), + params_rate(params) * 256); + if (ret < 0) { + dev_err(codec_dai->dev, "can't set FLL: %d\n", ret); + return ret; + } + + return 0; +} + +static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) +{ + struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); + struct snd_soc_jack *jack = &ctx->jack; + struct snd_soc_dai *codec_dai = runtime->codec_dai; + struct snd_soc_component *component = codec_dai->component; + int ret, jack_type; + + /* TDM 4 slots 24 bit, set Rx & Tx bitmask to 4 active slots */ + ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xf, 0x1, 4, 24); + if (ret < 0) { + dev_err(runtime->dev, "can't set codec TDM slot %d\n", ret); + return ret; + } + + /* NAU88L24 supports 4 butons headset detection + * KEY_MEDIA + * KEY_VOICECOMMAND + * KEY_VOLUMEUP + * KEY_VOLUMEDOWN + */ + jack_type = SND_JACK_HEADPHONE | SND_JACK_BTN_0 | SND_JACK_BTN_1 | + SND_JACK_BTN_2 | SND_JACK_BTN_3; + ret = snd_soc_card_jack_new(runtime->card, "Headset", jack_type, jack, + cht_bsw_jack_pins, ARRAY_SIZE(cht_bsw_jack_pins)); + if (ret) { + dev_err(runtime->dev, + "Headset Jack creation failed %d\n", ret); + return ret; + } + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_MEDIA); + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); + + nau8824_enable_jack_detect(component, jack); + + return ret; +} + +static int cht_codec_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *rate = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_RATE); + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + struct snd_mask *fmt = + hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); + + /* The DSP will covert the FE rate to 48k, stereo, 24bits */ + rate->min = rate->max = 48000; + channels->min = channels->max = 2; + + /* set SSP2 to 24-bit */ + snd_mask_none(fmt); + params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); + + return 0; +} + +static int cht_aif1_startup(struct snd_pcm_substream *substream) +{ + return snd_pcm_hw_constraint_single(substream->runtime, + SNDRV_PCM_HW_PARAM_RATE, 48000); +} + +static const struct snd_soc_ops cht_aif1_ops = { + .startup = cht_aif1_startup, +}; + +static const struct snd_soc_ops cht_be_ssp2_ops = { + .hw_params = cht_aif1_hw_params, +}; + +static struct snd_soc_dai_link cht_dailink[] = { + /* Front End DAI links */ + [MERR_DPCM_AUDIO] = { + .name = "Audio Port", + .stream_name = "Audio", + .cpu_dai_name = "media-cpu-dai", + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + .platform_name = "sst-mfld-platform", + .nonatomic = true, + .dynamic = 1, + .dpcm_playback = 1, + .dpcm_capture = 1, + .ops = &cht_aif1_ops, + }, + [MERR_DPCM_DEEP_BUFFER] = { + .name = "Deep-Buffer Audio Port", + .stream_name = "Deep-Buffer Audio", + .cpu_dai_name = "deepbuffer-cpu-dai", + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + .platform_name = "sst-mfld-platform", + .nonatomic = true, + .dynamic = 1, + .dpcm_playback = 1, + .ops = &cht_aif1_ops, + }, + [MERR_DPCM_COMPR] = { + .name = "Compressed Port", + .stream_name = "Compress", + .cpu_dai_name = "compress-cpu-dai", + .codec_dai_name = "snd-soc-dummy-dai", + .codec_name = "snd-soc-dummy", + .platform_name = "sst-mfld-platform", + }, + /* Back End DAI links */ + { + /* SSP2 - Codec */ + .name = "SSP2-Codec", + .id = 1, + .cpu_dai_name = "ssp2-port", + .platform_name = "sst-mfld-platform", + .no_pcm = 1, + .codec_dai_name = NAU8824_CODEC_DAI, + .codec_name = "i2c-10508824:00", + .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF + | SND_SOC_DAIFMT_CBS_CFS, + .init = cht_codec_init, + .be_hw_params_fixup = cht_codec_fixup, + .dpcm_playback = 1, + .dpcm_capture = 1, + .ops = &cht_be_ssp2_ops, + }, +}; + +/* SoC card */ +static struct snd_soc_card snd_soc_card_cht = { + .name = "chtnau8824", + .owner = THIS_MODULE, + .dai_link = cht_dailink, + .num_links = ARRAY_SIZE(cht_dailink), + .dapm_widgets = cht_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(cht_dapm_widgets), + .dapm_routes = cht_audio_map, + .num_dapm_routes = ARRAY_SIZE(cht_audio_map), + .controls = cht_mc_controls, + .num_controls = ARRAY_SIZE(cht_mc_controls), +}; + +static int snd_cht_mc_probe(struct platform_device *pdev) +{ + struct cht_mc_private *drv; + int ret_val; + + drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_ATOMIC); + if (!drv) + return -ENOMEM; + snd_soc_card_set_drvdata(&snd_soc_card_cht, drv); + + /* register the soc card */ + snd_soc_card_cht.dev = &pdev->dev; + ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cht); + if (ret_val) { + dev_err(&pdev->dev, + "snd_soc_register_card failed %d\n", ret_val); + return ret_val; + } + platform_set_drvdata(pdev, &snd_soc_card_cht); + + return ret_val; +} + +static struct platform_driver snd_cht_mc_driver = { + .driver = { + .name = "cht-bsw-nau8824", + }, + .probe = snd_cht_mc_probe, +}; + +module_platform_driver(snd_cht_mc_driver); + +MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver"); +MODULE_AUTHOR("Wang, Joseph C <joequant@gmail.com>"); +MODULE_AUTHOR("John Hsu <KCHSU0@nuvoton.com>"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:cht-bsw-nau8824"); diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c index 31641aab62cd..49ba1a956a06 100644 --- a/sound/soc/intel/boards/cht_bsw_rt5645.c +++ b/sound/soc/intel/boards/cht_bsw_rt5645.c @@ -252,14 +252,14 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); - struct snd_soc_codec *codec = runtime->codec; + struct snd_soc_component *component = runtime->codec_dai->component; int jack_type; int ret; if ((cht_rt5645_quirk & CHT_RT5645_SSP2_AIF2) || (cht_rt5645_quirk & CHT_RT5645_SSP0_AIF2)) { /* Select clk_i2s2_asrc as ASRC clock source */ - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_DA_STEREO_FILTER | RT5645_DA_MONO_L_FILTER | RT5645_DA_MONO_R_FILTER | @@ -267,7 +267,7 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) RT5645_CLK_SEL_I2S2_ASRC); } else { /* Select clk_i2s1_asrc as ASRC clock source */ - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_DA_STEREO_FILTER | RT5645_DA_MONO_L_FILTER | RT5645_DA_MONO_R_FILTER | @@ -310,7 +310,7 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) return ret; } - rt5645_set_jack_detect(codec, &ctx->jack, &ctx->jack, &ctx->jack); + rt5645_set_jack_detect(component, &ctx->jack, &ctx->jack, &ctx->jack); /* diff --git a/sound/soc/intel/boards/cht_bsw_rt5672.c b/sound/soc/intel/boards/cht_bsw_rt5672.c index c14a52d2f714..e68ec32720a4 100644 --- a/sound/soc/intel/boards/cht_bsw_rt5672.c +++ b/sound/soc/intel/boards/cht_bsw_rt5672.c @@ -183,10 +183,10 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_dai *codec_dai = runtime->codec_dai; - struct snd_soc_codec *codec = codec_dai->codec; + struct snd_soc_component *component = codec_dai->component; struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); - if (devm_acpi_dev_add_driver_gpios(codec->dev, cht_rt5672_gpios)) + if (devm_acpi_dev_add_driver_gpios(component->dev, cht_rt5672_gpios)) dev_warn(runtime->dev, "Unable to add GPIO mapping table\n"); /* TDM 4 slots 24 bit, set Rx & Tx bitmask to 4 active slots */ @@ -201,7 +201,7 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) * be supported by RT5672. Otherwise, ASRC will be disabled and cause * noise. */ - rt5670_sel_asrc_clk_src(codec, + rt5670_sel_asrc_clk_src(component, RT5670_DA_STEREO_FILTER | RT5670_DA_MONO_L_FILTER | RT5670_DA_MONO_R_FILTER @@ -219,7 +219,7 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) if (ret) return ret; - rt5670_set_jack_detect(codec, &ctx->headset); + rt5670_set_jack_detect(component, &ctx->headset); if (ctx->mclk) { /* * The firmware might enable the clock at @@ -333,10 +333,9 @@ static int cht_suspend_pre(struct snd_soc_card *card) list_for_each_entry(component, &card->component_dev_list, card_list) { if (!strncmp(component->name, ctx->codec_name, sizeof(ctx->codec_name))) { - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n"); - rt5670_jack_suspend(codec); + dev_dbg(component->dev, "disabling jack detect before going to suspend.\n"); + rt5670_jack_suspend(component); break; } } @@ -351,10 +350,9 @@ static int cht_resume_post(struct snd_soc_card *card) list_for_each_entry(component, &card->component_dev_list, card_list) { if (!strncmp(component->name, ctx->codec_name, sizeof(ctx->codec_name))) { - struct snd_soc_codec *codec = snd_soc_component_to_codec(component); - dev_dbg(codec->dev, "enabling jack detect for resume.\n"); - rt5670_jack_resume(codec); + dev_dbg(component->dev, "enabling jack detect for resume.\n"); + rt5670_jack_resume(component); break; } } diff --git a/sound/soc/intel/boards/haswell.c b/sound/soc/intel/boards/haswell.c index 3c5160779204..eab1f439dd3f 100644 --- a/sound/soc/intel/boards/haswell.c +++ b/sound/soc/intel/boards/haswell.c @@ -87,7 +87,8 @@ static const struct snd_soc_ops haswell_rt5640_ops = { static int haswell_rtd_init(struct snd_soc_pcm_runtime *rtd) { - struct sst_pdata *pdata = dev_get_platdata(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_pdata *pdata = dev_get_platdata(component->dev); struct sst_hsw *haswell = pdata->dsp; int ret; diff --git a/sound/soc/intel/boards/kbl_da7219_max98357a.c b/sound/soc/intel/boards/kbl_da7219_max98357a.c new file mode 100644 index 000000000000..e84baafd5f63 --- /dev/null +++ b/sound/soc/intel/boards/kbl_da7219_max98357a.c @@ -0,0 +1,613 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright(c) 2017-18 Intel Corporation. + +/* + * Intel Kabylake I2S Machine Driver with MAX98357A & DA7219 Codecs + * + * Modified from: + * Intel Kabylake I2S Machine driver supporting MAXIM98927 and + * RT5663 codecs + */ + +#include <linux/input.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <sound/core.h> +#include <sound/jack.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> +#include "../../codecs/da7219.h" +#include "../../codecs/hdac_hdmi.h" +#include "../skylake/skl.h" +#include "../../codecs/da7219-aad.h" + +#define KBL_DIALOG_CODEC_DAI "da7219-hifi" +#define KBL_MAXIM_CODEC_DAI "HiFi" +#define MAXIM_DEV0_NAME "MX98357A:00" +#define DUAL_CHANNEL 2 +#define QUAD_CHANNEL 4 + +static struct snd_soc_card *kabylake_audio_card; +static struct snd_soc_jack skylake_hdmi[3]; + +struct kbl_hdmi_pcm { + struct list_head head; + struct snd_soc_dai *codec_dai; + int device; +}; + +struct kbl_codec_private { + struct snd_soc_jack kabylake_headset; + struct list_head hdmi_pcm_list; +}; + +enum { + KBL_DPCM_AUDIO_PB = 0, + KBL_DPCM_AUDIO_CP, + KBL_DPCM_AUDIO_DMIC_CP, + KBL_DPCM_AUDIO_HDMI1_PB, + KBL_DPCM_AUDIO_HDMI2_PB, + KBL_DPCM_AUDIO_HDMI3_PB, +}; + +static int platform_clock_control(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *k, int event) +{ + struct snd_soc_dapm_context *dapm = w->dapm; + struct snd_soc_card *card = dapm->card; + struct snd_soc_dai *codec_dai; + int ret = 0; + + codec_dai = snd_soc_card_get_codec_dai(card, KBL_DIALOG_CODEC_DAI); + if (!codec_dai) { + dev_err(card->dev, "Codec dai not found; Unable to set/unset codec pll\n"); + return -EIO; + } + + /* Configure sysclk for codec */ + ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK, 24576000, + SND_SOC_CLOCK_IN); + if (ret) { + dev_err(card->dev, "can't set codec sysclk configuration\n"); + return ret; + } + + if (SND_SOC_DAPM_EVENT_OFF(event)) { + ret = snd_soc_dai_set_pll(codec_dai, 0, + DA7219_SYSCLK_MCLK, 0, 0); + if (ret) + dev_err(card->dev, "failed to stop PLL: %d\n", ret); + } else if (SND_SOC_DAPM_EVENT_ON(event)) { + ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM, + 0, DA7219_PLL_FREQ_OUT_98304); + if (ret) + dev_err(card->dev, "failed to start PLL: %d\n", ret); + } + + return ret; +} + +static const struct snd_kcontrol_new kabylake_controls[] = { + SOC_DAPM_PIN_SWITCH("Headphone Jack"), + SOC_DAPM_PIN_SWITCH("Headset Mic"), + SOC_DAPM_PIN_SWITCH("Spk"), +}; + +static const struct snd_soc_dapm_widget kabylake_widgets[] = { + SND_SOC_DAPM_HP("Headphone Jack", NULL), + SND_SOC_DAPM_MIC("Headset Mic", NULL), + SND_SOC_DAPM_SPK("Spk", NULL), + SND_SOC_DAPM_MIC("SoC DMIC", NULL), + SND_SOC_DAPM_SPK("DP", NULL), + SND_SOC_DAPM_SPK("HDMI", NULL), + SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0, + platform_clock_control, SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), +}; + +static const struct snd_soc_dapm_route kabylake_map[] = { + { "Headphone Jack", NULL, "HPL" }, + { "Headphone Jack", NULL, "HPR" }, + + /* speaker */ + { "Spk", NULL, "Speaker" }, + + /* other jacks */ + { "MIC", NULL, "Headset Mic" }, + { "DMic", NULL, "SoC DMIC" }, + + { "HDMI", NULL, "hif5 Output" }, + { "DP", NULL, "hif6 Output" }, + + /* CODEC BE connections */ + { "HiFi Playback", NULL, "ssp0 Tx" }, + { "ssp0 Tx", NULL, "codec0_out" }, + + { "Playback", NULL, "ssp1 Tx" }, + { "ssp1 Tx", NULL, "codec1_out" }, + + { "codec0_in", NULL, "ssp1 Rx" }, + { "ssp1 Rx", NULL, "Capture" }, + + /* DMIC */ + { "dmic01_hifi", NULL, "DMIC01 Rx" }, + { "DMIC01 Rx", NULL, "DMIC AIF" }, + + { "hifi1", NULL, "iDisp1 Tx" }, + { "iDisp1 Tx", NULL, "iDisp1_out" }, + { "hifi2", NULL, "iDisp2 Tx" }, + { "iDisp2 Tx", NULL, "iDisp2_out" }, + { "hifi3", NULL, "iDisp3 Tx"}, + { "iDisp3 Tx", NULL, "iDisp3_out"}, + + { "Headphone Jack", NULL, "Platform Clock" }, + { "Headset Mic", NULL, "Platform Clock" }, +}; + +static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *rate = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_RATE); + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); + + /* The ADSP will convert the FE rate to 48k, stereo */ + rate->min = rate->max = 48000; + channels->min = channels->max = DUAL_CHANNEL; + + /* set SSP to 24 bit */ + snd_mask_none(fmt); + snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE); + + return 0; +} + +static int kabylake_da7219_codec_init(struct snd_soc_pcm_runtime *rtd) +{ + struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_component *component = rtd->codec_dai->component; + struct snd_soc_jack *jack; + int ret; + + /* + * Headset buttons map to the google Reference headset. + * These can be configured by userspace. + */ + ret = snd_soc_card_jack_new(kabylake_audio_card, "Headset Jack", + SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | + SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_LINEOUT, + &ctx->kabylake_headset, NULL, 0); + if (ret) { + dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); + return ret; + } + + jack = &ctx->kabylake_headset; + + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_MEDIA); + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); + da7219_aad_jack_det(component, &ctx->kabylake_headset); + + ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); + if (ret) + dev_err(rtd->dev, "SoC DMIC - Ignore suspend failed %d\n", ret); + + return ret; +} + +static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device) +{ + struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_dai *dai = rtd->codec_dai; + struct kbl_hdmi_pcm *pcm; + + pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); + if (!pcm) + return -ENOMEM; + + pcm->device = device; + pcm->codec_dai = dai; + + list_add_tail(&pcm->head, &ctx->hdmi_pcm_list); + + return 0; +} + +static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd) +{ + return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB); +} + +static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd) +{ + return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB); +} + +static int kabylake_hdmi3_init(struct snd_soc_pcm_runtime *rtd) +{ + return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI3_PB); +} + +static int kabylake_da7219_fe_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_dapm_context *dapm; + struct snd_soc_component *component = rtd->cpu_dai->component; + + dapm = snd_soc_component_get_dapm(component); + snd_soc_dapm_ignore_suspend(dapm, "Reference Capture"); + + return 0; +} + +static const unsigned int rates[] = { + 48000, +}; + +static const struct snd_pcm_hw_constraint_list constraints_rates = { + .count = ARRAY_SIZE(rates), + .list = rates, + .mask = 0, +}; + +static const unsigned int channels[] = { + DUAL_CHANNEL, +}; + +static const struct snd_pcm_hw_constraint_list constraints_channels = { + .count = ARRAY_SIZE(channels), + .list = channels, + .mask = 0, +}; + +static unsigned int channels_quad[] = { + QUAD_CHANNEL, +}; + +static struct snd_pcm_hw_constraint_list constraints_channels_quad = { + .count = ARRAY_SIZE(channels_quad), + .list = channels_quad, + .mask = 0, +}; + +static int kbl_fe_startup(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + /* + * On this platform for PCM device we support, + * 48Khz + * stereo + * 16 bit audio + */ + + runtime->hw.channels_max = DUAL_CHANNEL; + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, + &constraints_channels); + + runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; + snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16); + + snd_pcm_hw_constraint_list(runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); + + return 0; +} + +static const struct snd_soc_ops kabylake_da7219_fe_ops = { + .startup = kbl_fe_startup, +}; + +static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *channels = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_CHANNELS); + + /* + * set BE channel constraint as user FE channels + */ + + if (params_channels(params) == 2) + channels->min = channels->max = 2; + else + channels->min = channels->max = 4; + + return 0; +} + +static int kabylake_dmic_startup(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + runtime->hw.channels_min = runtime->hw.channels_max = QUAD_CHANNEL; + snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, + &constraints_channels_quad); + + return snd_pcm_hw_constraint_list(substream->runtime, 0, + SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); +} + +static struct snd_soc_ops kabylake_dmic_ops = { + .startup = kabylake_dmic_startup, +}; + +static const unsigned int rates_16000[] = { + 16000, +}; + +static const struct snd_pcm_hw_constraint_list constraints_16000 = { + .count = ARRAY_SIZE(rates_16000), + .list = rates_16000, +}; + +static const unsigned int ch_mono[] = { + 1, +}; + +/* kabylake digital audio interface glue - connects codec <--> CPU */ +static struct snd_soc_dai_link kabylake_dais[] = { + /* Front End DAI links */ + [KBL_DPCM_AUDIO_PB] = { + .name = "Kbl Audio Port", + .stream_name = "Audio", + .cpu_dai_name = "System Pin", + .platform_name = "0000:00:1f.3", + .dynamic = 1, + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .nonatomic = 1, + .init = kabylake_da7219_fe_init, + .trigger = { + SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, + .dpcm_playback = 1, + .ops = &kabylake_da7219_fe_ops, + }, + [KBL_DPCM_AUDIO_CP] = { + .name = "Kbl Audio Capture Port", + .stream_name = "Audio Record", + .cpu_dai_name = "System Pin", + .platform_name = "0000:00:1f.3", + .dynamic = 1, + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .nonatomic = 1, + .trigger = { + SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, + .dpcm_capture = 1, + }, + [KBL_DPCM_AUDIO_DMIC_CP] = { + .name = "Kbl Audio DMIC cap", + .stream_name = "dmiccap", + .cpu_dai_name = "DMIC Pin", + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .platform_name = "0000:00:1f.3", + .init = NULL, + .dpcm_capture = 1, + .nonatomic = 1, + .dynamic = 1, + .ops = &kabylake_dmic_ops, + }, + [KBL_DPCM_AUDIO_HDMI1_PB] = { + .name = "Kbl HDMI Port1", + .stream_name = "Hdmi1", + .cpu_dai_name = "HDMI1 Pin", + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .platform_name = "0000:00:1f.3", + .dpcm_playback = 1, + .init = NULL, + .trigger = { + SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, + .nonatomic = 1, + .dynamic = 1, + }, + [KBL_DPCM_AUDIO_HDMI2_PB] = { + .name = "Kbl HDMI Port2", + .stream_name = "Hdmi2", + .cpu_dai_name = "HDMI2 Pin", + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .platform_name = "0000:00:1f.3", + .dpcm_playback = 1, + .init = NULL, + .trigger = { + SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, + .nonatomic = 1, + .dynamic = 1, + }, + [KBL_DPCM_AUDIO_HDMI3_PB] = { + .name = "Kbl HDMI Port3", + .stream_name = "Hdmi3", + .cpu_dai_name = "HDMI3 Pin", + .codec_name = "snd-soc-dummy", + .codec_dai_name = "snd-soc-dummy-dai", + .platform_name = "0000:00:1f.3", + .trigger = { + SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, + .dpcm_playback = 1, + .init = NULL, + .nonatomic = 1, + .dynamic = 1, + }, + + /* Back End DAI links */ + { + /* SSP0 - Codec */ + .name = "SSP0-Codec", + .id = 0, + .cpu_dai_name = "SSP0 Pin", + .platform_name = "0000:00:1f.3", + .no_pcm = 1, + .codec_name = MAXIM_DEV0_NAME, + .codec_dai_name = KBL_MAXIM_CODEC_DAI, + .dai_fmt = SND_SOC_DAIFMT_I2S | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS, + .ignore_pmdown_time = 1, + .be_hw_params_fixup = kabylake_ssp_fixup, + .dpcm_playback = 1, + }, + { + /* SSP1 - Codec */ + .name = "SSP1-Codec", + .id = 1, + .cpu_dai_name = "SSP1 Pin", + .platform_name = "0000:00:1f.3", + .no_pcm = 1, + .codec_name = "i2c-DLGS7219:00", + .codec_dai_name = KBL_DIALOG_CODEC_DAI, + .init = kabylake_da7219_codec_init, + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS, + .ignore_pmdown_time = 1, + .be_hw_params_fixup = kabylake_ssp_fixup, + .dpcm_playback = 1, + .dpcm_capture = 1, + }, + { + .name = "dmic01", + .id = 2, + .cpu_dai_name = "DMIC01 Pin", + .codec_name = "dmic-codec", + .codec_dai_name = "dmic-hifi", + .platform_name = "0000:00:1f.3", + .be_hw_params_fixup = kabylake_dmic_fixup, + .ignore_suspend = 1, + .dpcm_capture = 1, + .no_pcm = 1, + }, + { + .name = "iDisp1", + .id = 3, + .cpu_dai_name = "iDisp1 Pin", + .codec_name = "ehdaudio0D2", + .codec_dai_name = "intel-hdmi-hifi1", + .platform_name = "0000:00:1f.3", + .dpcm_playback = 1, + .init = kabylake_hdmi1_init, + .no_pcm = 1, + }, + { + .name = "iDisp2", + .id = 4, + .cpu_dai_name = "iDisp2 Pin", + .codec_name = "ehdaudio0D2", + .codec_dai_name = "intel-hdmi-hifi2", + .platform_name = "0000:00:1f.3", + .init = kabylake_hdmi2_init, + .dpcm_playback = 1, + .no_pcm = 1, + }, + { + .name = "iDisp3", + .id = 5, + .cpu_dai_name = "iDisp3 Pin", + .codec_name = "ehdaudio0D2", + .codec_dai_name = "intel-hdmi-hifi3", + .platform_name = "0000:00:1f.3", + .init = kabylake_hdmi3_init, + .dpcm_playback = 1, + .no_pcm = 1, + }, +}; + +#define NAME_SIZE 32 +static int kabylake_card_late_probe(struct snd_soc_card *card) +{ + struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card); + struct kbl_hdmi_pcm *pcm; + struct snd_soc_component *component = NULL; + int err, i = 0; + char jack_name[NAME_SIZE]; + + list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { + component = pcm->codec_dai->component; + snprintf(jack_name, sizeof(jack_name), + "HDMI/DP, pcm=%d Jack", pcm->device); + err = snd_soc_card_jack_new(card, jack_name, + SND_JACK_AVOUT, &skylake_hdmi[i], + NULL, 0); + + if (err) + return err; + + err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device, + &skylake_hdmi[i]); + if (err < 0) + return err; + + i++; + + } + + if (!component) + return -EINVAL; + + return hdac_hdmi_jack_port_init(component, &card->dapm); +} + +/* kabylake audio machine driver for SPT + DA7219 */ +static struct snd_soc_card kabylake_audio_card_da7219_m98357a = { + .name = "kblda7219max", + .owner = THIS_MODULE, + .dai_link = kabylake_dais, + .num_links = ARRAY_SIZE(kabylake_dais), + .controls = kabylake_controls, + .num_controls = ARRAY_SIZE(kabylake_controls), + .dapm_widgets = kabylake_widgets, + .num_dapm_widgets = ARRAY_SIZE(kabylake_widgets), + .dapm_routes = kabylake_map, + .num_dapm_routes = ARRAY_SIZE(kabylake_map), + .fully_routed = true, + .late_probe = kabylake_card_late_probe, +}; + +static int kabylake_audio_probe(struct platform_device *pdev) +{ + struct kbl_codec_private *ctx; + + ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC); + if (!ctx) + return -ENOMEM; + + INIT_LIST_HEAD(&ctx->hdmi_pcm_list); + + kabylake_audio_card = + (struct snd_soc_card *)pdev->id_entry->driver_data; + + kabylake_audio_card->dev = &pdev->dev; + snd_soc_card_set_drvdata(kabylake_audio_card, ctx); + return devm_snd_soc_register_card(&pdev->dev, kabylake_audio_card); +} + +static const struct platform_device_id kbl_board_ids[] = { + { + .name = "kbl_da7219_max98357a", + .driver_data = + (kernel_ulong_t)&kabylake_audio_card_da7219_m98357a, + }, + { } +}; + +static struct platform_driver kabylake_audio = { + .probe = kabylake_audio_probe, + .driver = { + .name = "kbl_da7219_max98357a", + .pm = &snd_soc_pm_ops, + }, + .id_table = kbl_board_ids, +}; + +module_platform_driver(kabylake_audio) + +/* Module information */ +MODULE_DESCRIPTION("Audio Machine driver-DA7219 & MAX98357A in I2S mode"); +MODULE_AUTHOR("Naveen Manohar <naveen.m@intel.com>"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:kbl_da7219_max98357a"); diff --git a/sound/soc/intel/boards/kbl_rt5663_max98927.c b/sound/soc/intel/boards/kbl_rt5663_max98927.c index f5df6bca3156..0e6b7e79441c 100644 --- a/sound/soc/intel/boards/kbl_rt5663_max98927.c +++ b/sound/soc/intel/boards/kbl_rt5663_max98927.c @@ -204,13 +204,18 @@ static const struct snd_soc_dapm_widget kabylake_5663_widgets[] = { SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_SPK("DP", NULL), SND_SOC_DAPM_SPK("HDMI", NULL), + SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0, + platform_clock_control, SND_SOC_DAPM_PRE_PMU | + SND_SOC_DAPM_POST_PMD), }; static const struct snd_soc_dapm_route kabylake_5663_map[] = { + { "Headphone Jack", NULL, "Platform Clock" }, { "Headphone Jack", NULL, "HPOL" }, { "Headphone Jack", NULL, "HPOR" }, /* other jacks */ + { "Headset Mic", NULL, "Platform Clock" }, { "IN1P", NULL, "Headset Mic" }, { "IN1N", NULL, "Headset Mic" }, @@ -272,7 +277,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd) { int ret; struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; struct snd_soc_jack *jack; /* @@ -294,7 +299,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd) snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); - rt5663_set_jack_detect(codec, &ctx->kabylake_headset); + rt5663_set_jack_detect(component, &ctx->kabylake_headset); return ret; } @@ -448,7 +453,7 @@ static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream, int ret; /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */ - rt5663_sel_asrc_clk_src(codec_dai->codec, + rt5663_sel_asrc_clk_src(codec_dai->component, RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER, RT5663_CLK_SEL_I2S1_ASRC); @@ -898,12 +903,12 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) { struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(card); struct kbl_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -921,10 +926,10 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* kabylake audio machine driver for SPT + RT5663 */ diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c index 90ea98f01c4c..69c3d8446f06 100644 --- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c +++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c @@ -178,7 +178,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd) { int ret; struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; struct snd_soc_jack *jack; /* @@ -200,7 +200,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd) snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); - rt5663_set_jack_detect(codec, &ctx->kabylake_headset); + rt5663_set_jack_detect(component, &ctx->kabylake_headset); ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "DMIC"); if (ret) @@ -333,7 +333,7 @@ static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream, int ret; /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */ - rt5663_sel_asrc_clk_src(codec_dai->codec, + rt5663_sel_asrc_clk_src(codec_dai->component, RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER, RT5663_CLK_SEL_I2S1_ASRC); @@ -599,12 +599,12 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) { struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card); struct kbl_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP,pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -620,10 +620,10 @@ static int kabylake_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* diff --git a/sound/soc/intel/boards/skl_nau88l25_max98357a.c b/sound/soc/intel/boards/skl_nau88l25_max98357a.c index 1b5a689dc99b..9a7a0646bffe 100644 --- a/sound/soc/intel/boards/skl_nau88l25_max98357a.c +++ b/sound/soc/intel/boards/skl_nau88l25_max98357a.c @@ -165,7 +165,7 @@ static int skylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd, static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) { int ret; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; /* * Headset buttons map to the google Reference headset. @@ -180,7 +180,7 @@ static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) return ret; } - nau8825_enable_jack_detect(codec, &skylake_headset); + nau8825_enable_jack_detect(component, &skylake_headset); snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); @@ -592,12 +592,12 @@ static int skylake_card_late_probe(struct snd_soc_card *card) { struct skl_nau8825_private *ctx = snd_soc_card_get_drvdata(card); struct skl_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -616,10 +616,10 @@ static int skylake_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* skylake audio machine driver for SPT + NAU88L25 */ diff --git a/sound/soc/intel/boards/skl_nau88l25_ssm4567.c b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c index 7bea4bc77481..212ac8971e55 100644 --- a/sound/soc/intel/boards/skl_nau88l25_ssm4567.c +++ b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c @@ -195,7 +195,7 @@ static int skylake_ssm4567_codec_init(struct snd_soc_pcm_runtime *rtd) static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) { int ret; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; /* * 4 buttons here map to the google Reference headset @@ -210,7 +210,7 @@ static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd) return ret; } - nau8825_enable_jack_detect(codec, &skylake_headset); + nau8825_enable_jack_detect(component, &skylake_headset); snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); @@ -643,12 +643,12 @@ static int skylake_card_late_probe(struct snd_soc_card *card) { struct skl_nau88125_private *ctx = snd_soc_card_get_drvdata(card); struct skl_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -667,10 +667,10 @@ static int skylake_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* skylake audio machine driver for SPT + NAU88L25 */ diff --git a/sound/soc/intel/boards/skl_rt286.c b/sound/soc/intel/boards/skl_rt286.c index 2bc4cfca594e..737d5615b0ef 100644 --- a/sound/soc/intel/boards/skl_rt286.c +++ b/sound/soc/intel/boards/skl_rt286.c @@ -130,7 +130,7 @@ static int skylake_rt286_fe_init(struct snd_soc_pcm_runtime *rtd) static int skylake_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; int ret; ret = snd_soc_card_jack_new(rtd->card, "Headset", @@ -141,7 +141,7 @@ static int skylake_rt286_codec_init(struct snd_soc_pcm_runtime *rtd) if (ret) return ret; - rt286_mic_detect(codec, &skylake_headset); + rt286_mic_detect(component, &skylake_headset); snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); @@ -478,12 +478,12 @@ static int skylake_card_late_probe(struct snd_soc_card *card) { struct skl_rt286_private *ctx = snd_soc_card_get_drvdata(card); struct skl_hdmi_pcm *pcm; - struct snd_soc_codec *codec = NULL; + struct snd_soc_component *component = NULL; int err, i = 0; char jack_name[NAME_SIZE]; list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) { - codec = pcm->codec_dai->codec; + component = pcm->codec_dai->component; snprintf(jack_name, sizeof(jack_name), "HDMI/DP, pcm=%d Jack", pcm->device); err = snd_soc_card_jack_new(card, jack_name, @@ -501,10 +501,10 @@ static int skylake_card_late_probe(struct snd_soc_card *card) i++; } - if (!codec) + if (!component) return -EINVAL; - return hdac_hdmi_jack_port_init(codec, &card->dapm); + return hdac_hdmi_jack_port_init(component, &card->dapm); } /* skylake audio machine driver for SPT + RT286S */ diff --git a/sound/soc/intel/common/soc-acpi-intel-cht-match.c b/sound/soc/intel/common/soc-acpi-intel-cht-match.c index b50a0d53846b..ad1eb2d644be 100644 --- a/sound/soc/intel/common/soc-acpi-intel-cht-match.c +++ b/sound/soc/intel/common/soc-acpi-intel-cht-match.c @@ -118,6 +118,15 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cherrytrail_machines[] = { .asoc_plat_name = "sst-mfld-platform", }, { + .id = "10508824", + .drv_name = "cht-bsw-nau8824", + .fw_filename = "intel/fw_sst_22a8.bin", + .board = "cht-bsw", + .sof_fw_filename = "intel/reef-cht.ri", + .sof_tplg_filename = "intel/reef-cht-nau8824.tplg", + .asoc_plat_name = "sst-mfld-platform", + }, + { .id = "DLGS7212", .drv_name = "bytcht_da7213", .fw_filename = "intel/fw_sst_22a8.bin", diff --git a/sound/soc/intel/haswell/sst-haswell-ipc.h b/sound/soc/intel/haswell/sst-haswell-ipc.h index 06d71aefa1fe..fbc14df139e4 100644 --- a/sound/soc/intel/haswell/sst-haswell-ipc.h +++ b/sound/soc/intel/haswell/sst-haswell-ipc.h @@ -22,6 +22,8 @@ #include <linux/platform_device.h> #include <sound/asound.h> +#define DRV_NAME "haswell-dai" + #define SST_HSW_NO_CHANNELS 4 #define SST_HSW_MAX_DX_REGIONS 14 #define SST_HSW_DX_CONTEXT_SIZE (640 * 1024) diff --git a/sound/soc/intel/haswell/sst-haswell-pcm.c b/sound/soc/intel/haswell/sst-haswell-pcm.c index c044400540ec..fe2c826e710c 100644 --- a/sound/soc/intel/haswell/sst-haswell-pcm.c +++ b/sound/soc/intel/haswell/sst-haswell-pcm.c @@ -181,11 +181,11 @@ static inline unsigned int hsw_ipc_to_mixer(u32 value) static int hsw_stream_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(platform); + snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; u32 volume; @@ -230,11 +230,11 @@ static int hsw_stream_volume_put(struct snd_kcontrol *kcontrol, static int hsw_stream_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(platform); + snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; u32 volume; @@ -273,8 +273,8 @@ static int hsw_stream_volume_get(struct snd_kcontrol *kcontrol, static int hsw_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; u32 volume; @@ -302,8 +302,8 @@ static int hsw_volume_put(struct snd_kcontrol *kcontrol, static int hsw_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; unsigned int volume = 0; @@ -322,8 +322,8 @@ static int hsw_volume_get(struct snd_kcontrol *kcontrol, static int hsw_waves_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES; @@ -336,8 +336,8 @@ static int hsw_waves_switch_get(struct snd_kcontrol *kcontrol, static int hsw_waves_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; int ret = 0; enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES; @@ -370,8 +370,8 @@ static int hsw_waves_switch_put(struct snd_kcontrol *kcontrol, static int hsw_waves_param_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; /* return a matching line from param buffer */ @@ -381,8 +381,8 @@ static int hsw_waves_param_get(struct snd_kcontrol *kcontrol, static int hsw_waves_param_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_platform *platform = snd_soc_kcontrol_platform(kcontrol); - struct hsw_priv_data *pdata = snd_soc_platform_get_drvdata(platform); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; int ret; enum sst_hsw_module_id id = SST_HSW_MODULE_WAVES; @@ -472,8 +472,8 @@ static int hsw_pcm_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; struct sst_module *module_data; @@ -674,8 +674,8 @@ static int hsw_pcm_hw_free(struct snd_pcm_substream *substream) static int hsw_pcm_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw_stream *sst_stream; struct sst_hsw *hsw = pdata->hsw; @@ -718,8 +718,8 @@ static u32 hsw_notify_pointer(struct sst_hsw_stream *stream, void *data) struct snd_pcm_substream *substream = pcm_data->substream; struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct sst_hsw *hsw = pdata->hsw; u32 pos; snd_pcm_uframes_t position = bytes_to_frames(runtime, @@ -783,8 +783,8 @@ static snd_pcm_uframes_t hsw_pcm_pointer(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime *runtime = substream->runtime; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; snd_pcm_uframes_t offset; @@ -807,8 +807,8 @@ static snd_pcm_uframes_t hsw_pcm_pointer(struct snd_pcm_substream *substream) static int hsw_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; int dai; @@ -840,8 +840,8 @@ static int hsw_pcm_open(struct snd_pcm_substream *substream) static int hsw_pcm_close(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct hsw_priv_data *pdata = - snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct hsw_priv_data *pdata = snd_soc_component_get_drvdata(component); struct hsw_pcm_data *pcm_data; struct sst_hsw *hsw = pdata->hsw; int ret, dai; @@ -942,9 +942,9 @@ static void hsw_pcm_free_modules(struct hsw_priv_data *pdata) static int hsw_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_pcm *pcm = rtd->pcm; - struct snd_soc_platform *platform = rtd->platform; - struct sst_pdata *pdata = dev_get_platdata(platform->dev); - struct hsw_priv_data *priv_data = dev_get_drvdata(platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct sst_pdata *pdata = dev_get_platdata(component->dev); + struct hsw_priv_data *priv_data = dev_get_drvdata(component->dev); struct device *dev = pdata->dma_dev; int ret = 0; @@ -1052,23 +1052,23 @@ static const struct snd_soc_dapm_route graph[] = { {"Analog Capture", NULL, "SSP0 CODEC IN"}, }; -static int hsw_pcm_probe(struct snd_soc_platform *platform) +static int hsw_pcm_probe(struct snd_soc_component *component) { - struct hsw_priv_data *priv_data = snd_soc_platform_get_drvdata(platform); - struct sst_pdata *pdata = dev_get_platdata(platform->dev); + struct hsw_priv_data *priv_data = snd_soc_component_get_drvdata(component); + struct sst_pdata *pdata = dev_get_platdata(component->dev); struct device *dma_dev, *dev; int i, ret = 0; if (!pdata) return -ENODEV; - dev = platform->dev; + dev = component->dev; dma_dev = pdata->dma_dev; priv_data->hsw = pdata->dsp; - priv_data->dev = platform->dev; + priv_data->dev = dev; priv_data->pm_state = HSW_PM_STATE_D0; - priv_data->soc_card = platform->component.card; + priv_data->soc_card = component->card; /* allocate DSP buffer page tables */ for (i = 0; i < ARRAY_SIZE(hsw_dais); i++) { @@ -1098,11 +1098,10 @@ static int hsw_pcm_probe(struct snd_soc_platform *platform) goto err; /* enable runtime PM with auto suspend */ - pm_runtime_set_autosuspend_delay(platform->dev, - SST_RUNTIME_SUSPEND_DELAY); - pm_runtime_use_autosuspend(platform->dev); - pm_runtime_enable(platform->dev); - pm_runtime_idle(platform->dev); + pm_runtime_set_autosuspend_delay(dev, SST_RUNTIME_SUSPEND_DELAY); + pm_runtime_use_autosuspend(dev); + pm_runtime_enable(dev); + pm_runtime_idle(dev); return 0; @@ -1116,13 +1115,13 @@ err: return ret; } -static int hsw_pcm_remove(struct snd_soc_platform *platform) +static void hsw_pcm_remove(struct snd_soc_component *component) { struct hsw_priv_data *priv_data = - snd_soc_platform_get_drvdata(platform); + snd_soc_component_get_drvdata(component); int i; - pm_runtime_disable(platform->dev); + pm_runtime_disable(component->dev); hsw_pcm_free_modules(priv_data); for (i = 0; i < ARRAY_SIZE(hsw_dais); i++) { @@ -1131,24 +1130,19 @@ static int hsw_pcm_remove(struct snd_soc_platform *platform) if (hsw_dais[i].capture.channels_min) snd_dma_free_pages(&priv_data->dmab[i][1]); } - - return 0; } -static const struct snd_soc_platform_driver hsw_soc_platform = { +static const struct snd_soc_component_driver hsw_dai_component = { + .name = DRV_NAME, .probe = hsw_pcm_probe, .remove = hsw_pcm_remove, .ops = &hsw_pcm_ops, .pcm_new = hsw_pcm_new, -}; - -static const struct snd_soc_component_driver hsw_dai_component = { - .name = "haswell-dai", - .controls = hsw_volume_controls, - .num_controls = ARRAY_SIZE(hsw_volume_controls), - .dapm_widgets = widgets, + .controls = hsw_volume_controls, + .num_controls = ARRAY_SIZE(hsw_volume_controls), + .dapm_widgets = widgets, .num_dapm_widgets = ARRAY_SIZE(widgets), - .dapm_routes = graph, + .dapm_routes = graph, .num_dapm_routes = ARRAY_SIZE(graph), }; @@ -1172,19 +1166,13 @@ static int hsw_pcm_dev_probe(struct platform_device *pdev) priv_data->hsw = sst_pdata->dsp; platform_set_drvdata(pdev, priv_data); - ret = snd_soc_register_platform(&pdev->dev, &hsw_soc_platform); - if (ret < 0) - goto err_plat; - - ret = snd_soc_register_component(&pdev->dev, &hsw_dai_component, + ret = devm_snd_soc_register_component(&pdev->dev, &hsw_dai_component, hsw_dais, ARRAY_SIZE(hsw_dais)); if (ret < 0) - goto err_comp; + goto err_plat; return 0; -err_comp: - snd_soc_unregister_platform(&pdev->dev); err_plat: sst_hsw_dsp_free(&pdev->dev, sst_pdata); return 0; @@ -1194,8 +1182,6 @@ static int hsw_pcm_dev_remove(struct platform_device *pdev) { struct sst_pdata *sst_pdata = dev_get_platdata(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); sst_hsw_dsp_free(&pdev->dev, sst_pdata); return 0; diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c index dc20d91f62e6..a016455a6ddb 100644 --- a/sound/soc/intel/skylake/skl-debug.c +++ b/sound/soc/intel/skylake/skl-debug.c @@ -231,7 +231,7 @@ struct skl_debug *skl_debugfs_init(struct skl *skl) /* create the debugfs dir with platform component's debugfs as parent */ d->fs = debugfs_create_dir("dsp", - skl->platform->component.debugfs_root); + skl->component->debugfs_root); if (IS_ERR(d->fs) || !d->fs) { dev_err(&skl->pci->dev, "debugfs root creation failed\n"); return NULL; diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c index 60d76adade43..57d4a58522a6 100644 --- a/sound/soc/intel/skylake/skl-messages.c +++ b/sound/soc/intel/skylake/skl-messages.c @@ -417,11 +417,16 @@ int skl_resume_dsp(struct skl *skl) if (skl->skl_sst->is_first_boot == true) return 0; - /* disable dynamic clock gating during fw and lib download */ + /* + * Disable dynamic clock and power gating during firmware + * and library download + */ ctx->enable_miscbdcge(ctx->dev, false); + ctx->clock_power_gating(ctx->dev, false); ret = skl_dsp_wake(ctx->dsp); ctx->enable_miscbdcge(ctx->dev, true); + ctx->clock_power_gating(ctx->dev, true); if (ret < 0) return ret; @@ -1210,7 +1215,7 @@ out: static int skl_set_pipe_state(struct skl_sst *ctx, struct skl_pipe *pipe, enum skl_ipc_pipeline_state state) { - dev_dbg(ctx->dev, "%s: pipe_satate = %d\n", __func__, state); + dev_dbg(ctx->dev, "%s: pipe_state = %d\n", __func__, state); return skl_ipc_set_pipeline_state(&ctx->ipc, pipe->ppl_id, state); } diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c index e46828533826..15cb8ac3e374 100644 --- a/sound/soc/intel/skylake/skl-pcm.c +++ b/sound/soc/intel/skylake/skl-pcm.c @@ -959,6 +959,17 @@ static struct snd_soc_dai_driver skl_platform_dai[] = { }, }, { + .name = "DMIC16k Pin", + .ops = &skl_dmic_dai_ops, + .capture = { + .stream_name = "DMIC16k Rx", + .channels_min = HDA_MONO, + .channels_max = HDA_QUAD, + .rates = SNDRV_PCM_RATE_16000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, +}, +{ .name = "HD-Codec Pin", .ops = &skl_link_dai_ops, .playback = { @@ -1307,29 +1318,31 @@ static int skl_populate_modules(struct skl *skl) "query module info failed\n"); return ret; } + + skl_tplg_add_moduleid_in_bind_params(skl, w); } } return ret; } -static int skl_platform_soc_probe(struct snd_soc_platform *platform) +static int skl_platform_soc_probe(struct snd_soc_component *component) { - struct hdac_ext_bus *ebus = dev_get_drvdata(platform->dev); + struct hdac_ext_bus *ebus = dev_get_drvdata(component->dev); struct skl *skl = ebus_to_skl(ebus); const struct skl_dsp_ops *ops; int ret; - pm_runtime_get_sync(platform->dev); + pm_runtime_get_sync(component->dev); if ((ebus_to_hbus(ebus))->ppcap) { - skl->platform = platform; + skl->component = component; /* init debugfs */ skl->debugfs = skl_debugfs_init(skl); - ret = skl_tplg_init(platform, ebus); + ret = skl_tplg_init(component, ebus); if (ret < 0) { - dev_err(platform->dev, "Failed to init topology!\n"); + dev_err(component->dev, "Failed to init topology!\n"); return ret; } @@ -1339,17 +1352,22 @@ static int skl_platform_soc_probe(struct snd_soc_platform *platform) return -EIO; if (skl->skl_sst->is_first_boot == false) { - dev_err(platform->dev, "DSP reports first boot done!!!\n"); + dev_err(component->dev, "DSP reports first boot done!!!\n"); return -EIO; } - /* disable dynamic clock gating during fw and lib download */ - skl->skl_sst->enable_miscbdcge(platform->dev, false); + /* + * Disable dynamic clock and power gating during firmware + * and library download + */ + skl->skl_sst->enable_miscbdcge(component->dev, false); + skl->skl_sst->clock_power_gating(component->dev, false); - ret = ops->init_fw(platform->dev, skl->skl_sst); - skl->skl_sst->enable_miscbdcge(platform->dev, true); + ret = ops->init_fw(component->dev, skl->skl_sst); + skl->skl_sst->enable_miscbdcge(component->dev, true); + skl->skl_sst->clock_power_gating(component->dev, true); if (ret < 0) { - dev_err(platform->dev, "Failed to boot first fw: %d\n", ret); + dev_err(component->dev, "Failed to boot first fw: %d\n", ret); return ret; } skl_populate_modules(skl); @@ -1362,22 +1380,20 @@ static int skl_platform_soc_probe(struct snd_soc_platform *platform) skl->cfg.astate_cfg); } } - pm_runtime_mark_last_busy(platform->dev); - pm_runtime_put_autosuspend(platform->dev); + pm_runtime_mark_last_busy(component->dev); + pm_runtime_put_autosuspend(component->dev); return 0; } -static const struct snd_soc_platform_driver skl_platform_drv = { + +static const struct snd_soc_component_driver skl_component = { + .name = "pcm", .probe = skl_platform_soc_probe, .ops = &skl_platform_ops, .pcm_new = skl_pcm_new, .pcm_free = skl_pcm_free, }; -static const struct snd_soc_component_driver skl_component = { - .name = "pcm", -}; - int skl_platform_register(struct device *dev) { int ret; @@ -1389,12 +1405,6 @@ int skl_platform_register(struct device *dev) INIT_LIST_HEAD(&skl->ppl_list); INIT_LIST_HEAD(&skl->bind_list); - ret = snd_soc_register_platform(dev, &skl_platform_drv); - if (ret) { - dev_err(dev, "soc platform registration failed %d\n", ret); - return ret; - } - skl->dais = kmemdup(skl_platform_dai, sizeof(skl_platform_dai), GFP_KERNEL); if (!skl->dais) { @@ -1416,18 +1426,12 @@ int skl_platform_register(struct device *dev) num_dais += ARRAY_SIZE(skl_fe_dai); } - ret = snd_soc_register_component(dev, &skl_component, + ret = devm_snd_soc_register_component(dev, &skl_component, skl->dais, num_dais); - if (ret) { + if (ret) dev_err(dev, "soc component registration failed %d\n", ret); - goto err; - } - - return 0; err: - snd_soc_unregister_platform(dev); return ret; - } int skl_platform_unregister(struct device *dev) @@ -1443,8 +1447,6 @@ int skl_platform_unregister(struct device *dev) } } - snd_soc_unregister_component(dev); - snd_soc_unregister_platform(dev); kfree(skl->dais); return 0; diff --git a/sound/soc/intel/skylake/skl-ssp-clk.c b/sound/soc/intel/skylake/skl-ssp-clk.c index 7fbddf5e3b00..cda1b5fa7436 100644 --- a/sound/soc/intel/skylake/skl-ssp-clk.c +++ b/sound/soc/intel/skylake/skl-ssp-clk.c @@ -247,8 +247,8 @@ static unsigned long skl_clk_recalc_rate(struct clk_hw *hw, } /* Not supported by clk driver. Implemented to satisfy clk fw */ -long skl_clk_round_rate(struct clk_hw *hw, unsigned long rate, - unsigned long *parent_rate) +static long skl_clk_round_rate(struct clk_hw *hw, unsigned long rate, + unsigned long *parent_rate) { return rate; } diff --git a/sound/soc/intel/skylake/skl-sst-ipc.h b/sound/soc/intel/skylake/skl-sst-ipc.h index 55f2d2ce09df..f74f040dfd83 100644 --- a/sound/soc/intel/skylake/skl-sst-ipc.h +++ b/sound/soc/intel/skylake/skl-sst-ipc.h @@ -118,6 +118,9 @@ struct skl_sst { struct skl_d0i3_data d0i3; const struct skl_dsp_ops *dsp_ops; + + /* Callback to update dynamic clock and power gating registers */ + void (*clock_power_gating)(struct device *dev, bool enable); }; struct skl_ipc_init_instance_msg { diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c index 73af6e19ebbd..3b1dca419883 100644 --- a/sound/soc/intel/skylake/skl-topology.c +++ b/sound/soc/intel/skylake/skl-topology.c @@ -94,8 +94,12 @@ void skl_tplg_d0i3_put(struct skl *skl, enum d0i3_capability caps) * SKL DSP driver modelling uses only few DAPM widgets so for rest we will * ignore. This helpers checks if the SKL driver handles this widget type */ -static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w) +static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w, + struct device *dev) { + if (w->dapm->dev != dev) + return false; + switch (w->id) { case snd_soc_dapm_dai_link: case snd_soc_dapm_dai_in: @@ -826,7 +830,7 @@ static int skl_fill_sink_instance_id(struct skl_sst *ctx, u32 *params, if (mcfg->m_type == SKL_MODULE_TYPE_KPB) { struct skl_kpb_params *kpb_params = (struct skl_kpb_params *)params; - struct skl_mod_inst_map *inst = kpb_params->map; + struct skl_mod_inst_map *inst = kpb_params->u.map; for (i = 0; i < kpb_params->num_modules; i++) { pvt_id = skl_get_pvt_instance_id_map(ctx, inst->mod_id, @@ -911,6 +915,87 @@ static int skl_tplg_set_module_bind_params(struct snd_soc_dapm_widget *w, return 0; } +static int skl_get_module_id(struct skl_sst *ctx, uuid_le *uuid) +{ + struct uuid_module *module; + + list_for_each_entry(module, &ctx->uuid_list, list) { + if (uuid_le_cmp(*uuid, module->uuid) == 0) + return module->id; + } + + return -EINVAL; +} + +static int skl_tplg_find_moduleid_from_uuid(struct skl *skl, + const struct snd_kcontrol_new *k) +{ + struct soc_bytes_ext *sb = (void *) k->private_value; + struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private; + struct skl_kpb_params *uuid_params, *params; + struct hdac_bus *bus = ebus_to_hbus(skl_to_ebus(skl)); + int i, size, module_id; + + if (bc->set_params == SKL_PARAM_BIND && bc->max) { + uuid_params = (struct skl_kpb_params *)bc->params; + size = uuid_params->num_modules * + sizeof(struct skl_mod_inst_map) + + sizeof(uuid_params->num_modules); + + params = devm_kzalloc(bus->dev, size, GFP_KERNEL); + if (!params) + return -ENOMEM; + + params->num_modules = uuid_params->num_modules; + + for (i = 0; i < uuid_params->num_modules; i++) { + module_id = skl_get_module_id(skl->skl_sst, + &uuid_params->u.map_uuid[i].mod_uuid); + if (module_id < 0) { + devm_kfree(bus->dev, params); + return -EINVAL; + } + + params->u.map[i].mod_id = module_id; + params->u.map[i].inst_id = + uuid_params->u.map_uuid[i].inst_id; + } + + devm_kfree(bus->dev, bc->params); + bc->params = (char *)params; + bc->max = size; + } + + return 0; +} + +/* + * Retrieve the module id from UUID mentioned in the + * post bind params + */ +void skl_tplg_add_moduleid_in_bind_params(struct skl *skl, + struct snd_soc_dapm_widget *w) +{ + struct skl_module_cfg *mconfig = w->priv; + int i; + + /* + * Post bind params are used for only for KPB + * to set copier instances to drain the data + * in fast mode + */ + if (mconfig->m_type != SKL_MODULE_TYPE_KPB) + return; + + for (i = 0; i < w->num_kcontrols; i++) + if ((w->kcontrol_news[i].access & + SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) && + (skl_tplg_find_moduleid_from_uuid(skl, + &w->kcontrol_news[i]) < 0)) + dev_err(skl->skl_sst->dev, + "%s: invalid kpb post bind params\n", + __func__); +} static int skl_tplg_module_add_deferred_bind(struct skl *skl, struct skl_module_cfg *src, struct skl_module_cfg *dst) @@ -969,7 +1054,7 @@ static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w, next_sink = p->sink; - if (!is_skl_dsp_widget_type(p->sink)) + if (!is_skl_dsp_widget_type(p->sink, ctx->dev)) return skl_tplg_bind_sinks(p->sink, skl, src_w, src_mconfig); /* @@ -978,7 +1063,7 @@ static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w, * they are ones used for SKL so check that first */ if ((p->sink->priv != NULL) && - is_skl_dsp_widget_type(p->sink)) { + is_skl_dsp_widget_type(p->sink, ctx->dev)) { sink = p->sink; sink_mconfig = sink->priv; @@ -1092,7 +1177,7 @@ static struct snd_soc_dapm_widget *skl_get_src_dsp_widget( * ones used for SKL so check that first */ if ((p->source->priv != NULL) && - is_skl_dsp_widget_type(p->source)) { + is_skl_dsp_widget_type(p->source, ctx->dev)) { return p->source; } } @@ -1654,7 +1739,7 @@ skl_tplg_fe_get_cpr_module(struct snd_soc_dai *dai, int stream) w = dai->playback_widget; snd_soc_dapm_widget_for_each_sink_path(w, p) { if (p->connect && p->sink->power && - !is_skl_dsp_widget_type(p->sink)) + !is_skl_dsp_widget_type(p->sink, dai->dev)) continue; if (p->sink->priv) { @@ -1667,7 +1752,7 @@ skl_tplg_fe_get_cpr_module(struct snd_soc_dai *dai, int stream) w = dai->capture_widget; snd_soc_dapm_widget_for_each_source_path(w, p) { if (p->connect && p->source->power && - !is_skl_dsp_widget_type(p->source)) + !is_skl_dsp_widget_type(p->source, dai->dev)) continue; if (p->source->priv) { @@ -1819,7 +1904,7 @@ static int skl_tplg_be_set_src_pipe_params(struct snd_soc_dai *dai, int ret = -EIO; snd_soc_dapm_widget_for_each_source_path(w, p) { - if (p->connect && is_skl_dsp_widget_type(p->source) && + if (p->connect && is_skl_dsp_widget_type(p->source, dai->dev) && p->source->priv) { ret = skl_tplg_be_fill_pipe_params(dai, @@ -1844,7 +1929,7 @@ static int skl_tplg_be_set_sink_pipe_params(struct snd_soc_dai *dai, int ret = -EIO; snd_soc_dapm_widget_for_each_sink_path(w, p) { - if (p->connect && is_skl_dsp_widget_type(p->sink) && + if (p->connect && is_skl_dsp_widget_type(p->sink, dai->dev) && p->sink->priv) { ret = skl_tplg_be_fill_pipe_params(dai, @@ -2710,15 +2795,15 @@ static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w, return 0; } -static void skl_clear_pin_config(struct snd_soc_platform *platform, +static void skl_clear_pin_config(struct snd_soc_component *component, struct snd_soc_dapm_widget *w) { int i; struct skl_module_cfg *mconfig; struct skl_pipe *pipe; - if (!strncmp(w->dapm->component->name, platform->component.name, - strlen(platform->component.name))) { + if (!strncmp(w->dapm->component->name, component->name, + strlen(component->name))) { mconfig = w->priv; pipe = mconfig->pipe; for (i = 0; i < mconfig->module->max_input_pins; i++) { @@ -2737,14 +2822,14 @@ static void skl_clear_pin_config(struct snd_soc_platform *platform, void skl_cleanup_resources(struct skl *skl) { struct skl_sst *ctx = skl->skl_sst; - struct snd_soc_platform *soc_platform = skl->platform; + struct snd_soc_component *soc_component = skl->component; struct snd_soc_dapm_widget *w; struct snd_soc_card *card; - if (soc_platform == NULL) + if (soc_component == NULL) return; - card = soc_platform->component.card; + card = soc_component->card; if (!card || !card->instantiated) return; @@ -2752,8 +2837,8 @@ void skl_cleanup_resources(struct skl *skl) skl->resource.mcps = 0; list_for_each_entry(w, &card->widgets, list) { - if (is_skl_dsp_widget_type(w) && (w->priv != NULL)) - skl_clear_pin_config(soc_platform, w); + if (is_skl_dsp_widget_type(w, ctx->dev) && w->priv != NULL) + skl_clear_pin_config(soc_component, w); } skl_clear_module_cnt(ctx->dsp); @@ -3400,19 +3485,19 @@ static struct snd_soc_tplg_ops skl_tplg_ops = { * widgets in a pipelines, so this helper - skl_tplg_create_pipe_widget_list() * helps to get the SKL type widgets in that pipeline */ -static int skl_tplg_create_pipe_widget_list(struct snd_soc_platform *platform) +static int skl_tplg_create_pipe_widget_list(struct snd_soc_component *component) { struct snd_soc_dapm_widget *w; struct skl_module_cfg *mcfg = NULL; struct skl_pipe_module *p_module = NULL; struct skl_pipe *pipe; - list_for_each_entry(w, &platform->component.card->widgets, list) { - if (is_skl_dsp_widget_type(w) && w->priv != NULL) { + list_for_each_entry(w, &component->card->widgets, list) { + if (is_skl_dsp_widget_type(w, component->dev) && w->priv) { mcfg = w->priv; pipe = mcfg->pipe; - p_module = devm_kzalloc(platform->dev, + p_module = devm_kzalloc(component->dev, sizeof(*p_module), GFP_KERNEL); if (!p_module) return -ENOMEM; @@ -3455,7 +3540,7 @@ static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe) /* * SKL topology init routine */ -int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus) +int skl_tplg_init(struct snd_soc_component *component, struct hdac_ext_bus *ebus) { int ret; const struct firmware *fw; @@ -3479,7 +3564,7 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus) * The complete tplg for SKL is loaded as index 0, we don't use * any other index */ - ret = snd_soc_tplg_component_load(&platform->component, + ret = snd_soc_tplg_component_load(component, &skl_tplg_ops, fw, 0); if (ret < 0) { dev_err(bus->dev, "tplg component load failed%d\n", ret); @@ -3491,7 +3576,7 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus) skl->resource.max_mem = SKL_FW_MAX_MEM; skl->tplg = fw; - ret = skl_tplg_create_pipe_widget_list(platform); + ret = skl_tplg_create_pipe_widget_list(component); if (ret < 0) return ret; diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h index b6496513fe55..b1e0667c0ae0 100644 --- a/sound/soc/intel/skylake/skl-topology.h +++ b/sound/soc/intel/skylake/skl-topology.h @@ -221,9 +221,18 @@ struct skl_mod_inst_map { u16 inst_id; }; +struct skl_uuid_inst_map { + u16 inst_id; + u16 reserved; + uuid_le mod_uuid; +} __packed; + struct skl_kpb_params { u32 num_modules; - struct skl_mod_inst_map map[0]; + union { + struct skl_mod_inst_map map[0]; + struct skl_uuid_inst_map map_uuid[0]; + } u; }; struct skl_module_inst_id { @@ -460,7 +469,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps, u32 caps_size, u32 node_id); void skl_tplg_set_be_dmic_config(struct snd_soc_dai *dai, struct skl_pipe_params *params, int stream); -int skl_tplg_init(struct snd_soc_platform *platform, +int skl_tplg_init(struct snd_soc_component *component, struct hdac_ext_bus *ebus); struct skl_module_cfg *skl_tplg_fe_get_cpr_module( struct snd_soc_dai *dai, int stream); @@ -505,4 +514,6 @@ int skl_pcm_link_dma_prepare(struct device *dev, int skl_dai_load(struct snd_soc_component *cmp, struct snd_soc_dai_driver *pcm_dai); +void skl_tplg_add_moduleid_in_bind_params(struct skl *skl, + struct snd_soc_dapm_widget *w); #endif diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c index 32ce64c6b2dc..abf324747b29 100644 --- a/sound/soc/intel/skylake/skl.c +++ b/sound/soc/intel/skylake/skl.c @@ -94,6 +94,32 @@ static void skl_enable_miscbdcge(struct device *dev, bool enable) update_pci_dword(pci, AZX_PCIREG_CGCTL, AZX_CGCTL_MISCBDCGE_MASK, val); } +/** + * skl_clock_power_gating: Enable/Disable clock and power gating + * + * @dev: Device pointer + * @enable: Enable/Disable flag + */ +static void skl_clock_power_gating(struct device *dev, bool enable) +{ + struct pci_dev *pci = to_pci_dev(dev); + struct hdac_ext_bus *ebus = pci_get_drvdata(pci); + struct hdac_bus *bus = ebus_to_hbus(ebus); + u32 val; + + /* Update PDCGE bit of CGCTL register */ + val = enable ? AZX_CGCTL_ADSPDCGE : 0; + update_pci_dword(pci, AZX_PCIREG_CGCTL, AZX_CGCTL_ADSPDCGE, val); + + /* Update L1SEN bit of EM2 register */ + val = enable ? AZX_REG_VS_EM2_L1SEN : 0; + snd_hdac_chip_updatel(bus, VS_EM2, AZX_REG_VS_EM2_L1SEN, val); + + /* Update ADSPPGD bit of PGCTL register */ + val = enable ? 0 : AZX_PGCTL_ADSPPGD; + update_pci_dword(pci, AZX_PCIREG_PGCTL, AZX_PGCTL_ADSPPGD, val); +} + /* * While performing reset, controller may not come back properly causing * issues, so recommendation is to set CGCTL.MISCBDCGE to 0 then do reset @@ -916,6 +942,7 @@ static int skl_probe(struct pci_dev *pci, goto out_nhlt_free; } skl->skl_sst->enable_miscbdcge = skl_enable_miscbdcge; + skl->skl_sst->clock_power_gating = skl_clock_power_gating; } if (bus->mlcap) snd_hdac_ext_bus_get_ml_capabilities(ebus); @@ -1017,6 +1044,11 @@ static struct snd_soc_acpi_codecs kbl_5663_5514_codecs = { .codecs = {"10EC5663", "10EC5514"} }; +static struct snd_soc_acpi_codecs kbl_7219_98357_codecs = { + .num_codecs = 1, + .codecs = {"MX98357A"} +}; + static struct skl_machine_pdata cnl_pdata = { .use_tplg_pcm = true, }; @@ -1105,6 +1137,14 @@ static struct snd_soc_acpi_mach sst_kbl_devdata[] = { .drv_name = "kbl_rt5663", .fw_filename = "intel/dsp_fw_kbl.bin", }, + { + .id = "DLGS7219", + .drv_name = "kbl_da7219_max98357a", + .fw_filename = "intel/dsp_fw_kbl.bin", + .machine_quirk = snd_soc_acpi_codec_list, + .quirk_data = &kbl_7219_98357_codecs, + .pdata = &skl_dmic_data + }, {} }; diff --git a/sound/soc/intel/skylake/skl.h b/sound/soc/intel/skylake/skl.h index 2d13f3fd988a..0d5375cbcf6e 100644 --- a/sound/soc/intel/skylake/skl.h +++ b/sound/soc/intel/skylake/skl.h @@ -33,8 +33,10 @@ #define AZX_PCIREG_PGCTL 0x44 #define AZX_PGCTL_LSRMD_MASK (1 << 4) +#define AZX_PGCTL_ADSPPGD BIT(2) #define AZX_PCIREG_CGCTL 0x48 #define AZX_CGCTL_MISCBDCGE_MASK (1 << 6) +#define AZX_CGCTL_ADSPDCGE BIT(1) /* D0I3C Register fields */ #define AZX_REG_VS_D0I3C_CIP 0x1 /* Command in progress */ #define AZX_REG_VS_D0I3C_I3 0x4 /* D0i3 enable */ @@ -43,6 +45,8 @@ #define DMA_TRANSMITION_START 2 #define DMA_TRANSMITION_STOP 3 +#define AZX_REG_VS_EM2_L1SEN BIT(13) + struct skl_dsp_resource { u32 max_mcps; u32 max_mem; @@ -74,7 +78,7 @@ struct skl { struct platform_device *dmic_dev; struct platform_device *i2s_dev; struct platform_device *clk_dev; - struct snd_soc_platform *platform; + struct snd_soc_component *component; struct snd_soc_dai_driver *dais; struct nhlt_acpi_table *nhlt; /* nhlt ptr */ diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c index 505b0ff03c3b..c6a58520d377 100644 --- a/sound/soc/kirkwood/kirkwood-dma.c +++ b/sound/soc/kirkwood/kirkwood-dma.c @@ -318,7 +318,8 @@ static void kirkwood_dma_free_dma_buffers(struct snd_pcm *pcm) } } -const struct snd_soc_platform_driver kirkwood_soc_platform = { +const struct snd_soc_component_driver kirkwood_soc_component = { + .name = DRV_NAME, .ops = &kirkwood_dma_ops, .pcm_new = kirkwood_dma_new, .pcm_free = kirkwood_dma_free_dma_buffers, diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 105a73cc5158..9a2777b72dcd 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -26,8 +26,6 @@ #include "kirkwood.h" -#define DRV_NAME "mvebu-audio" - #define KIRKWOOD_I2S_FORMATS \ (SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S24_LE | \ @@ -524,10 +522,6 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk[2] = { }, }; -static const struct snd_soc_component_driver kirkwood_i2s_component = { - .name = DRV_NAME, -}; - static int kirkwood_i2s_dev_probe(struct platform_device *pdev) { struct kirkwood_asoc_platform_data *data = pdev->dev.platform_data; @@ -601,24 +595,17 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) priv->ctl_rec |= KIRKWOOD_RECCTL_BURST_128; } - err = snd_soc_register_component(&pdev->dev, &kirkwood_i2s_component, + err = devm_snd_soc_register_component(&pdev->dev, &kirkwood_soc_component, soc_dai, 2); if (err) { dev_err(&pdev->dev, "snd_soc_register_component failed\n"); goto err_component; } - err = snd_soc_register_platform(&pdev->dev, &kirkwood_soc_platform); - if (err) { - dev_err(&pdev->dev, "snd_soc_register_platform failed\n"); - goto err_platform; - } - kirkwood_i2s_init(priv); return 0; - err_platform: - snd_soc_unregister_component(&pdev->dev); + err_component: if (!IS_ERR(priv->extclk)) clk_disable_unprepare(priv->extclk); @@ -631,9 +618,6 @@ static int kirkwood_i2s_dev_remove(struct platform_device *pdev) { struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); - if (!IS_ERR(priv->extclk)) clk_disable_unprepare(priv->extclk); clk_disable_unprepare(priv->clk); diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h index 783cb1a4f30e..c13ee5f69446 100644 --- a/sound/soc/kirkwood/kirkwood.h +++ b/sound/soc/kirkwood/kirkwood.h @@ -12,6 +12,8 @@ #ifndef _KIRKWOOD_AUDIO_H #define _KIRKWOOD_AUDIO_H +#define DRV_NAME "mvebu-audio" + #define KIRKWOOD_RECORD_WIN 0 #define KIRKWOOD_PLAYBACK_WIN 1 #define KIRKWOOD_MAX_AUDIO_WIN 2 @@ -143,6 +145,6 @@ struct kirkwood_dma_data { int burst; }; -extern const struct snd_soc_platform_driver kirkwood_soc_platform; +extern const struct snd_soc_component_driver kirkwood_soc_component; #endif diff --git a/sound/soc/mediatek/common/mtk-afe-fe-dai.c b/sound/soc/mediatek/common/mtk-afe-fe-dai.c index ac231d33d8fe..c91e5f4cd902 100644 --- a/sound/soc/mediatek/common/mtk-afe-fe-dai.c +++ b/sound/soc/mediatek/common/mtk-afe-fe-dai.c @@ -18,6 +18,7 @@ #include <linux/pm_runtime.h> #include <linux/regmap.h> #include <sound/soc.h> +#include "mtk-afe-platform-driver.h" #include "mtk-afe-fe-dai.h" #include "mtk-base-afe.h" @@ -43,7 +44,8 @@ int mtk_afe_fe_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *runtime = substream->runtime; int memif_num = rtd->cpu_dai->id; struct mtk_base_afe_memif *memif = &afe->memif[memif_num]; @@ -105,7 +107,8 @@ void mtk_afe_fe_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; int irq_id; @@ -128,7 +131,8 @@ int mtk_afe_fe_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; int msb_at_bit33 = 0; int ret, fs = 0; @@ -192,7 +196,8 @@ int mtk_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime * const runtime = substream->runtime; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; struct mtk_base_afe_irq *irqs = &afe->irqs[memif->irq_usage]; const struct mtk_base_irq_data *irq_data = irqs->irq_data; @@ -255,7 +260,8 @@ int mtk_afe_fe_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; int hd_audio = 0; diff --git a/sound/soc/mediatek/common/mtk-afe-platform-driver.c b/sound/soc/mediatek/common/mtk-afe-platform-driver.c index 82d439c15f4e..53215b52e4f2 100644 --- a/sound/soc/mediatek/common/mtk-afe-platform-driver.c +++ b/sound/soc/mediatek/common/mtk-afe-platform-driver.c @@ -25,7 +25,8 @@ static snd_pcm_uframes_t mtk_afe_pcm_pointer (struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; const struct mtk_base_memif_data *memif_data = memif->data; struct regmap *regmap = afe->regmap; @@ -65,7 +66,8 @@ static int mtk_afe_pcm_new(struct snd_soc_pcm_runtime *rtd) size_t size; struct snd_card *card = rtd->card->snd_card; struct snd_pcm *pcm = rtd->pcm; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); size = afe->mtk_afe_hardware->buffer_bytes_max; return snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, @@ -77,7 +79,8 @@ static void mtk_afe_pcm_free(struct snd_pcm *pcm) snd_pcm_lib_preallocate_free_for_all(pcm); } -const struct snd_soc_platform_driver mtk_afe_pcm_platform = { +const struct snd_soc_component_driver mtk_afe_pcm_platform = { + .name = AFE_PCM_NAME, .ops = &mtk_afe_pcm_ops, .pcm_new = mtk_afe_pcm_new, .pcm_free = mtk_afe_pcm_free, diff --git a/sound/soc/mediatek/common/mtk-afe-platform-driver.h b/sound/soc/mediatek/common/mtk-afe-platform-driver.h index a973fc9253b4..8dcdbed959ea 100644 --- a/sound/soc/mediatek/common/mtk-afe-platform-driver.h +++ b/sound/soc/mediatek/common/mtk-afe-platform-driver.h @@ -17,7 +17,8 @@ #ifndef _MTK_AFE_PLATFORM_DRIVER_H_ #define _MTK_AFE_PLATFORM_DRIVER_H_ -extern const struct snd_soc_platform_driver mtk_afe_pcm_platform; +#define AFE_PCM_NAME "mtk-afe-pcm" +extern const struct snd_soc_component_driver mtk_afe_pcm_platform; #endif diff --git a/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c b/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c index d68b53f7cefe..73cce33fa439 100644 --- a/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c +++ b/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c @@ -93,7 +93,8 @@ static int mt2701_afe_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id); if (i2s_num < 0) @@ -108,7 +109,8 @@ static int mt2701_afe_i2s_path_shutdown(struct snd_pcm_substream *substream, int dir_invert) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[i2s_num]; const struct mt2701_i2s_data *i2s_data; @@ -144,7 +146,8 @@ static void mt2701_afe_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id); struct mt2701_i2s_path *i2s_path; @@ -176,7 +179,8 @@ static int mt2701_i2s_path_prepare_enable(struct snd_pcm_substream *substream, int dir_invert) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; struct mt2701_i2s_path *i2s_path = &afe_priv->i2s_path[i2s_num]; const struct mt2701_i2s_data *i2s_data; @@ -247,7 +251,8 @@ static int mt2701_afe_i2s_prepare(struct snd_pcm_substream *substream, { int clk_domain; struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id); struct mt2701_i2s_path *i2s_path; @@ -312,7 +317,8 @@ static int mt2701_btmrg_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; int ret; @@ -329,14 +335,15 @@ static int mt2701_btmrg_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); int stream_fs; u32 val, msk; stream_fs = params_rate(params); if ((stream_fs != 8000) && (stream_fs != 16000)) { - dev_err(afe->dev, "%s() btmgr not supprt this stream_fs %d\n", + dev_err(afe->dev, "%s() btmgr not support this stream_fs %d\n", __func__, stream_fs); return -EINVAL; } @@ -372,7 +379,8 @@ static void mt2701_btmrg_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt2701_afe_private *afe_priv = afe->platform_priv; /* if the other direction stream is not occupied */ @@ -392,7 +400,8 @@ static int mt2701_simple_fe_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); int stream_dir = substream->stream; int memif_num = rtd->cpu_dai->id; struct mtk_base_afe_memif *memif_tmp; @@ -414,7 +423,8 @@ static int mt2701_simple_fe_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); int stream_dir = substream->stream; /* single DL use PAIR_INTERLEAVE */ @@ -431,7 +441,8 @@ static int mt2701_dlm_fe_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif_tmp; const struct mtk_base_memif_data *memif_data; int i; @@ -458,7 +469,8 @@ static void mt2701_dlm_fe_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); const struct mtk_base_memif_data *memif_data; int i; @@ -477,7 +489,8 @@ static int mt2701_dlm_fe_hw_params(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); int channels = params_channels(params); regmap_update_bits(afe->regmap, @@ -500,7 +513,8 @@ static int mt2701_dlm_fe_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif_tmp = &afe->memif[MT2701_MEMIF_DL1]; switch (cmd) { @@ -1517,7 +1531,8 @@ static int mt2701_afe_pcm_dev_probe(struct platform_device *pdev) } pm_runtime_get_sync(dev); - ret = snd_soc_register_platform(dev, &mtk_afe_pcm_platform); + ret = devm_snd_soc_register_component(&pdev->dev, &mtk_afe_pcm_platform, + NULL, 0); if (ret) { dev_warn(dev, "err_platform\n"); goto err_platform; @@ -1526,13 +1541,11 @@ static int mt2701_afe_pcm_dev_probe(struct platform_device *pdev) ret = mt2701_afe_add_component(afe); if (ret) { dev_warn(dev, "err_dai_component\n"); - goto err_dai_component; + goto err_platform; } return 0; -err_dai_component: - snd_soc_unregister_platform(dev); err_platform: pm_runtime_put_sync(dev); err_pm_disable: @@ -1548,9 +1561,6 @@ static int mt2701_afe_pcm_dev_remove(struct platform_device *pdev) if (!pm_runtime_status_suspended(&pdev->dev)) mt2701_afe_runtime_suspend(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - return 0; } diff --git a/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c b/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c index c7f7f8add5d9..65d1433a0944 100644 --- a/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c +++ b/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c @@ -304,7 +304,8 @@ static int mt8173_afe_i2s_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); if (dai->active) return 0; @@ -318,7 +319,8 @@ static void mt8173_afe_i2s_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); if (dai->active) return; @@ -334,7 +336,8 @@ static int mt8173_afe_i2s_prepare(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime * const runtime = substream->runtime; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt8173_afe_private *afe_priv = afe->platform_priv; int ret; @@ -356,7 +359,8 @@ static int mt8173_afe_hdmi_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt8173_afe_private *afe_priv = afe->platform_priv; if (dai->active) @@ -371,7 +375,8 @@ static void mt8173_afe_hdmi_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt8173_afe_private *afe_priv = afe->platform_priv; if (dai->active) @@ -386,7 +391,8 @@ static int mt8173_afe_hdmi_prepare(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_runtime * const runtime = substream->runtime; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mt8173_afe_private *afe_priv = afe->platform_priv; unsigned int val; @@ -449,7 +455,8 @@ static int mt8173_afe_hdmi_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); dev_info(afe->dev, "%s cmd=%d %s\n", __func__, cmd, dai->name); @@ -498,7 +505,8 @@ static int mt8173_memif_fs(struct snd_pcm_substream *substream, unsigned int rate) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct mtk_base_afe *afe = snd_soc_platform_get_drvdata(rtd->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component); struct mtk_base_afe_memif *memif = &afe->memif[rtd->cpu_dai->id]; int fs; @@ -1172,31 +1180,29 @@ static int mt8173_afe_pcm_dev_probe(struct platform_device *pdev) afe->runtime_resume = mt8173_afe_runtime_resume; afe->runtime_suspend = mt8173_afe_runtime_suspend; - ret = snd_soc_register_platform(&pdev->dev, &mtk_afe_pcm_platform); + ret = devm_snd_soc_register_component(&pdev->dev, + &mtk_afe_pcm_platform, + NULL, 0); if (ret) goto err_pm_disable; - ret = snd_soc_register_component(&pdev->dev, + ret = devm_snd_soc_register_component(&pdev->dev, &mt8173_afe_pcm_dai_component, mt8173_afe_pcm_dais, ARRAY_SIZE(mt8173_afe_pcm_dais)); if (ret) - goto err_platform; + goto err_pm_disable; - ret = snd_soc_register_component(&pdev->dev, + ret = devm_snd_soc_register_component(&pdev->dev, &mt8173_afe_hdmi_dai_component, mt8173_afe_hdmi_dais, ARRAY_SIZE(mt8173_afe_hdmi_dais)); if (ret) - goto err_comp; + goto err_pm_disable; dev_info(&pdev->dev, "MT8173 AFE driver initialized.\n"); return 0; -err_comp: - snd_soc_unregister_component(&pdev->dev); -err_platform: - snd_soc_unregister_platform(&pdev->dev); err_pm_disable: pm_runtime_disable(&pdev->dev); return ret; @@ -1207,8 +1213,6 @@ static int mt8173_afe_pcm_dev_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); if (!pm_runtime_status_suspended(&pdev->dev)) mt8173_afe_runtime_suspend(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); return 0; } diff --git a/sound/soc/mediatek/mt8173/mt8173-max98090.c b/sound/soc/mediatek/mt8173/mt8173-max98090.c index e0c2b23ec711..b49b527a7cf9 100644 --- a/sound/soc/mediatek/mt8173/mt8173-max98090.c +++ b/sound/soc/mediatek/mt8173/mt8173-max98090.c @@ -75,7 +75,7 @@ static int mt8173_max98090_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_card *card = runtime->card; - struct snd_soc_codec *codec = runtime->codec; + struct snd_soc_component *component = runtime->codec_dai->component; /* enable jack detection */ ret = snd_soc_card_jack_new(card, "Headphone", SND_JACK_HEADPHONE, @@ -87,7 +87,7 @@ static int mt8173_max98090_init(struct snd_soc_pcm_runtime *runtime) return ret; } - return max98090_mic_detect(codec, &mt8173_max98090_jack); + return max98090_mic_detect(component, &mt8173_max98090_jack); } /* Digital audio interface glue - connects codec <---> CPU */ diff --git a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c index 5a9a5482976e..904f3ee6b0eb 100644 --- a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c +++ b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c @@ -82,10 +82,10 @@ static struct snd_soc_jack mt8173_rt5650_rt5514_jack; static int mt8173_rt5650_rt5514_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; - struct snd_soc_codec *codec = runtime->codec_dais[0]->codec; + struct snd_soc_component *component = runtime->codec_dais[0]->component; int ret; - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_DA_STEREO_FILTER | RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); @@ -101,7 +101,7 @@ static int mt8173_rt5650_rt5514_init(struct snd_soc_pcm_runtime *runtime) return ret; } - return rt5645_set_jack_detect(codec, + return rt5645_set_jack_detect(component, &mt8173_rt5650_rt5514_jack, &mt8173_rt5650_rt5514_jack, &mt8173_rt5650_rt5514_jack); diff --git a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c index b7248085ca04..9c61b8c099c5 100644 --- a/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c +++ b/sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c @@ -86,19 +86,19 @@ static struct snd_soc_jack mt8173_rt5650_rt5676_jack; static int mt8173_rt5650_rt5676_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; - struct snd_soc_codec *codec = runtime->codec_dais[0]->codec; - struct snd_soc_codec *codec_sub = runtime->codec_dais[1]->codec; + struct snd_soc_component *component = runtime->codec_dais[0]->component; + struct snd_soc_component *component_sub = runtime->codec_dais[1]->component; int ret; - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_DA_STEREO_FILTER | RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); - rt5677_sel_asrc_clk_src(codec_sub, + rt5677_sel_asrc_clk_src(component_sub, RT5677_DA_STEREO_FILTER | RT5677_AD_STEREO1_FILTER, RT5677_CLK_SEL_I2S1_ASRC); - rt5677_sel_asrc_clk_src(codec_sub, + rt5677_sel_asrc_clk_src(component_sub, RT5677_AD_STEREO2_FILTER | RT5677_I2S2_SOURCE, RT5677_CLK_SEL_I2S2_ASRC); @@ -114,7 +114,7 @@ static int mt8173_rt5650_rt5676_init(struct snd_soc_pcm_runtime *runtime) return ret; } - return rt5645_set_jack_detect(codec, + return rt5645_set_jack_detect(component, &mt8173_rt5650_rt5676_jack, &mt8173_rt5650_rt5676_jack, &mt8173_rt5650_rt5676_jack); diff --git a/sound/soc/mediatek/mt8173/mt8173-rt5650.c b/sound/soc/mediatek/mt8173/mt8173-rt5650.c index 679fc8bea0a3..84aa09d3dd98 100644 --- a/sound/soc/mediatek/mt8173/mt8173-rt5650.c +++ b/sound/soc/mediatek/mt8173/mt8173-rt5650.c @@ -112,26 +112,26 @@ static struct snd_soc_jack mt8173_rt5650_jack; static int mt8173_rt5650_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; - struct snd_soc_codec *codec = runtime->codec_dais[0]->codec; + struct snd_soc_component *component = runtime->codec_dais[0]->component; const char *codec_capture_dai = runtime->codec_dais[1]->name; int ret; - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_DA_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); if (!strcmp(codec_capture_dai, "rt5645-aif1")) { - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); } else if (!strcmp(codec_capture_dai, "rt5645-aif2")) { - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S2_ASRC); } else { dev_warn(card->dev, "Only one dai codec found in DTS, enabled rt5645 AD filter\n"); - rt5645_sel_asrc_clk_src(codec, + rt5645_sel_asrc_clk_src(component, RT5645_AD_STEREO_FILTER, RT5645_CLK_SEL_I2S1_ASRC); } @@ -147,7 +147,7 @@ static int mt8173_rt5650_init(struct snd_soc_pcm_runtime *runtime) return ret; } - return rt5645_set_jack_detect(codec, + return rt5645_set_jack_detect(component, &mt8173_rt5650_jack, &mt8173_rt5650_jack, &mt8173_rt5650_jack); diff --git a/sound/soc/nuc900/nuc900-pcm.c b/sound/soc/nuc900/nuc900-pcm.c index bd6dfa218d59..ad8392a87df9 100644 --- a/sound/soc/nuc900/nuc900-pcm.c +++ b/sound/soc/nuc900/nuc900-pcm.c @@ -299,14 +299,15 @@ static int nuc900_dma_new(struct snd_soc_pcm_runtime *rtd) return 0; } -static const struct snd_soc_platform_driver nuc900_soc_platform = { +static const struct snd_soc_component_driver nuc900_soc_component = { .ops = &nuc900_dma_ops, .pcm_new = nuc900_dma_new, }; static int nuc900_soc_platform_probe(struct platform_device *pdev) { - return devm_snd_soc_register_platform(&pdev->dev, &nuc900_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, &nuc900_soc_component, + NULL, 0); } static struct platform_driver nuc900_pcm_driver = { diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c index cb72c1e57da0..77a30f0f0c96 100644 --- a/sound/soc/omap/ams-delta.c +++ b/sound/soc/omap/ams-delta.c @@ -93,7 +93,7 @@ static unsigned short ams_delta_audio_agc; * Used for passing a codec structure pointer * from the board initialization code to the tty line discipline. */ -static struct snd_soc_codec *cx20442_codec; +static struct snd_soc_component *cx20442_codec; static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) @@ -105,7 +105,7 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol, int pin, changed = 0; /* Refuse any mode changes if we are not able to control the codec. */ - if (!cx20442_codec->component.card->pop_time) + if (!cx20442_codec->card->pop_time) return -EUNATCH; if (ucontrol->value.enumerated.item[0] >= control->items) @@ -300,15 +300,15 @@ static int cx81801_open(struct tty_struct *tty) /* Line discipline .close() */ static void cx81801_close(struct tty_struct *tty) { - struct snd_soc_codec *codec = tty->disc_data; - struct snd_soc_dapm_context *dapm = &codec->component.card->dapm; + struct snd_soc_component *component = tty->disc_data; + struct snd_soc_dapm_context *dapm = &component->card->dapm; del_timer_sync(&cx81801_timer); /* Prevent the hook switch from further changing the DAPM pins */ INIT_LIST_HEAD(&ams_delta_hook_switch.pins); - if (!codec) + if (!component) return; v253_ops.close(tty); @@ -338,14 +338,14 @@ static int cx81801_hangup(struct tty_struct *tty) static void cx81801_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) { - struct snd_soc_codec *codec = tty->disc_data; + struct snd_soc_component *component = tty->disc_data; const unsigned char *c; int apply, ret; - if (!codec) + if (!component) return; - if (!codec->component.card->pop_time) { + if (!component->card->pop_time) { /* First modem response, complete setup procedure */ /* Initialize timer used for config pulse generation */ @@ -358,7 +358,7 @@ static void cx81801_receive(struct tty_struct *tty, ARRAY_SIZE(ams_delta_hook_switch_pins), ams_delta_hook_switch_pins); if (ret) - dev_warn(codec->dev, + dev_warn(component->dev, "Failed to link hook switch to DAPM pins, " "will continue with hook switch unlinked.\n"); @@ -467,7 +467,7 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd) /* Codec is ready, now add/activate board specific controls */ /* Store a pointer to the codec structure for tty ldisc use */ - cx20442_codec = rtd->codec; + cx20442_codec = rtd->codec_dai->component; /* Set up digital mute if not provided by the codec */ if (!codec_dai->driver->ops) { diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c index 614b18d2f631..15ccbf479c96 100644 --- a/sound/soc/omap/omap-abe-twl6040.c +++ b/sound/soc/omap/omap-abe-twl6040.c @@ -52,7 +52,7 @@ static int omap_abe_hw_params(struct snd_pcm_substream *substream, int clk_id, freq; int ret; - clk_id = twl6040_get_clk_id(rtd->codec); + clk_id = twl6040_get_clk_id(codec_dai->component); if (clk_id == TWL6040_SYSCLK_SEL_HPPLL) freq = priv->mclk_freq; else if (clk_id == TWL6040_SYSCLK_SEL_LPPLL) @@ -166,7 +166,7 @@ static const struct snd_soc_dapm_route audio_map[] = { static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; struct snd_soc_card *card = rtd->card; struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card); int hs_trim; @@ -176,7 +176,7 @@ static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) * Configure McPDM offset cancellation based on the HSOTRIM value from * twl6040. */ - hs_trim = twl6040_get_trim_value(codec, TWL6040_TRIM_HSOTRIM); + hs_trim = twl6040_get_trim_value(component, TWL6040_TRIM_HSOTRIM); omap_mcpdm_configure_dn_offsets(rtd, TWL6040_HSF_TRIM_LEFT(hs_trim), TWL6040_HSF_TRIM_RIGHT(hs_trim)); @@ -189,7 +189,7 @@ static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) if (ret) return ret; - twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET); + twl6040_hs_jack_detect(component, &hs_jack, SND_JACK_HEADSET); } return 0; diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index aca2c43d0f03..778cc8f75b6a 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -243,7 +243,7 @@ out: return ret; } -static const struct snd_soc_platform_driver omap_soc_platform = { +static const struct snd_soc_component_driver omap_soc_component = { .ops = &omap_pcm_ops, .pcm_new = omap_pcm_new, .pcm_free = omap_pcm_free_dma_buffers, @@ -252,7 +252,8 @@ static const struct snd_soc_platform_driver omap_soc_platform = { int omap_pcm_platform_register(struct device *dev) { omap_pcm_limit_supported_formats(); - return devm_snd_soc_register_platform(dev, &omap_soc_platform); + return devm_snd_soc_register_component(dev, &omap_soc_component, + NULL, 0); } EXPORT_SYMBOL_GPL(omap_pcm_platform_register); diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c index c4c6fbedc723..47052fe3f5f4 100644 --- a/sound/soc/pxa/mioa701_wm9713.c +++ b/sound/soc/pxa/mioa701_wm9713.c @@ -58,20 +58,20 @@ #define AC97_GPIO_PULL 0x58 /* Use GPIO8 for rear speaker amplifier */ -static int rear_amp_power(struct snd_soc_codec *codec, int power) +static int rear_amp_power(struct snd_soc_component *component, int power) { unsigned short reg; if (power) { - reg = snd_soc_read(codec, AC97_GPIO_CFG); - snd_soc_write(codec, AC97_GPIO_CFG, reg | 0x0100); - reg = snd_soc_read(codec, AC97_GPIO_PULL); - snd_soc_write(codec, AC97_GPIO_PULL, reg | (1<<15)); + reg = snd_soc_component_read32(component, AC97_GPIO_CFG); + snd_soc_component_write(component, AC97_GPIO_CFG, reg | 0x0100); + reg = snd_soc_component_read32(component, AC97_GPIO_PULL); + snd_soc_component_write(component, AC97_GPIO_PULL, reg | (1<<15)); } else { - reg = snd_soc_read(codec, AC97_GPIO_CFG); - snd_soc_write(codec, AC97_GPIO_CFG, reg & ~0x0100); - reg = snd_soc_read(codec, AC97_GPIO_PULL); - snd_soc_write(codec, AC97_GPIO_PULL, reg & ~(1<<15)); + reg = snd_soc_component_read32(component, AC97_GPIO_CFG); + snd_soc_component_write(component, AC97_GPIO_CFG, reg & ~0x0100); + reg = snd_soc_component_read32(component, AC97_GPIO_PULL); + snd_soc_component_write(component, AC97_GPIO_PULL, reg & ~(1<<15)); } return 0; @@ -82,11 +82,11 @@ static int rear_amp_event(struct snd_soc_dapm_widget *widget, { struct snd_soc_card *card = widget->dapm->card; struct snd_soc_pcm_runtime *rtd; - struct snd_soc_codec *codec; + struct snd_soc_component *component; rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name); - codec = rtd->codec; - return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event)); + component = rtd->codec_dai->component; + return rear_amp_power(component, SND_SOC_DAPM_EVENT_ON(event)); } /* mioa701 machine dapm widgets */ @@ -129,13 +129,13 @@ static const struct snd_soc_dapm_route audio_map[] = { static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; /* Prepare GPIO8 for rear speaker amplifier */ - snd_soc_update_bits(codec, AC97_GPIO_CFG, 0x100, 0x100); + snd_soc_component_update_bits(component, AC97_GPIO_CFG, 0x100, 0x100); /* Prepare MIC input */ - snd_soc_update_bits(codec, AC97_3D_CONTROL, 0xc000, 0xc000); + snd_soc_component_update_bits(component, AC97_3D_CONTROL, 0xc000, 0xc000); return 0; } diff --git a/sound/soc/pxa/mmp-pcm.c b/sound/soc/pxa/mmp-pcm.c index 624d9bd5dadd..d2d4652de32c 100644 --- a/sound/soc/pxa/mmp-pcm.c +++ b/sound/soc/pxa/mmp-pcm.c @@ -25,6 +25,8 @@ #include <sound/soc.h> #include <sound/dmaengine_pcm.h> +#define DRV_NAME "mmp-pcm" + struct mmp_dma_data { int ssp_id; struct resource *dma_res; @@ -100,7 +102,8 @@ static bool filter(struct dma_chan *chan, void *param) static int mmp_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct platform_device *pdev = to_platform_device(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct platform_device *pdev = to_platform_device(component->dev); struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct mmp_dma_data dma_data; struct resource *r; @@ -211,7 +214,8 @@ err: return ret; } -static const struct snd_soc_platform_driver mmp_soc_platform = { +static const struct snd_soc_component_driver mmp_soc_component = { + .name = DRV_NAME, .ops = &mmp_pcm_ops, .pcm_new = mmp_pcm_new, .pcm_free = mmp_pcm_free_dma_buffers, @@ -231,7 +235,8 @@ static int mmp_pcm_probe(struct platform_device *pdev) mmp_pcm_hardware[SNDRV_PCM_STREAM_CAPTURE].period_bytes_max = pdata->period_max_capture; } - return devm_snd_soc_register_platform(&pdev->dev, &mmp_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, &mmp_soc_component, + NULL, 0); } static struct platform_driver mmp_pcm_driver = { diff --git a/sound/soc/pxa/mmp-sspa.c b/sound/soc/pxa/mmp-sspa.c index 64b85e30c1f8..7c998ea4ebee 100644 --- a/sound/soc/pxa/mmp-sspa.c +++ b/sound/soc/pxa/mmp-sspa.c @@ -377,7 +377,6 @@ static int mmp_sspa_probe(struct snd_soc_dai *dai) #define MMP_SSPA_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S24_LE | \ - SNDRV_PCM_FMTBIT_S24_LE | \ SNDRV_PCM_FMTBIT_S32_LE) static const struct snd_soc_dai_ops mmp_sspa_dai_ops = { diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c index e64958d8bff0..8b6a70e94c01 100644 --- a/sound/soc/pxa/pxa2xx-pcm.c +++ b/sound/soc/pxa/pxa2xx-pcm.c @@ -84,7 +84,7 @@ static int pxa2xx_soc_pcm_new(struct snd_soc_pcm_runtime *rtd) return ret; } -static const struct snd_soc_platform_driver pxa2xx_soc_platform = { +static const struct snd_soc_component_driver pxa2xx_soc_platform = { .ops = &pxa2xx_pcm_ops, .pcm_new = pxa2xx_soc_pcm_new, .pcm_free = pxa2xx_pcm_free_dma_buffers, @@ -92,7 +92,8 @@ static const struct snd_soc_platform_driver pxa2xx_soc_platform = { static int pxa2xx_soc_platform_probe(struct platform_device *pdev) { - return devm_snd_soc_register_platform(&pdev->dev, &pxa2xx_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, &pxa2xx_soc_platform, + NULL, 0); } #ifdef CONFIG_OF diff --git a/sound/soc/pxa/ttc-dkb.c b/sound/soc/pxa/ttc-dkb.c index 65c20f779177..5d6e61a4bb7e 100644 --- a/sound/soc/pxa/ttc-dkb.c +++ b/sound/soc/pxa/ttc-dkb.c @@ -75,7 +75,7 @@ static const struct snd_soc_dapm_route ttc_audio_map[] = { static int ttc_pm860x_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; /* Headset jack detection */ snd_soc_card_jack_new(rtd->card, "Headphone Jack", SND_JACK_HEADPHONE | @@ -86,9 +86,9 @@ static int ttc_pm860x_init(struct snd_soc_pcm_runtime *rtd) ARRAY_SIZE(mic_jack_pins)); /* headphone, microphone detection & headset short detection */ - pm860x_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADPHONE, + pm860x_hs_jack_detect(component, &hs_jack, SND_JACK_HEADPHONE, SND_JACK_BTN_0, SND_JACK_BTN_1, SND_JACK_BTN_2); - pm860x_mic_jack_detect(codec, &hs_jack, SND_JACK_MICROPHONE); + pm860x_mic_jack_detect(component, &hs_jack, SND_JACK_MICROPHONE); return 0; } diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index caf71aab8196..31fe78aa207f 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -24,6 +24,8 @@ #include "lpass-lpaif-reg.h" #include "lpass.h" +#define DRV_NAME "lpass-platform" + struct lpass_pcm_data { int dma_ch; int i2s_port; @@ -61,8 +63,8 @@ static int lpass_platform_pcmops_open(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct lpass_variant *v = drvdata->variant; int ret, dma_ch, dir = substream->stream; struct lpass_pcm_data *data; @@ -115,8 +117,8 @@ static int lpass_platform_pcmops_close(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct lpass_variant *v = drvdata->variant; struct lpass_pcm_data *data; @@ -132,8 +134,8 @@ static int lpass_platform_pcmops_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *rt = substream->runtime; struct lpass_pcm_data *pcm_data = rt->private_data; struct lpass_variant *v = drvdata->variant; @@ -225,8 +227,8 @@ static int lpass_platform_pcmops_hw_params(struct snd_pcm_substream *substream, static int lpass_platform_pcmops_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *rt = substream->runtime; struct lpass_pcm_data *pcm_data = rt->private_data; struct lpass_variant *v = drvdata->variant; @@ -246,8 +248,8 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *rt = substream->runtime; struct lpass_pcm_data *pcm_data = rt->private_data; struct lpass_variant *v = drvdata->variant; @@ -298,8 +300,8 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *rt = substream->runtime; struct lpass_pcm_data *pcm_data = rt->private_data; struct lpass_variant *v = drvdata->variant; @@ -372,8 +374,8 @@ static snd_pcm_uframes_t lpass_platform_pcmops_pointer( struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *soc_runtime = substream->private_data; - struct lpass_data *drvdata = - snd_soc_platform_get_drvdata(soc_runtime->platform); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); struct snd_pcm_runtime *rt = substream->runtime; struct lpass_pcm_data *pcm_data = rt->private_data; struct lpass_variant *v = drvdata->variant; @@ -509,13 +511,14 @@ static int lpass_platform_pcm_new(struct snd_soc_pcm_runtime *soc_runtime) { struct snd_pcm *pcm = soc_runtime->pcm; struct snd_pcm_substream *psubstream, *csubstream; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(soc_runtime, DRV_NAME); int ret = -EINVAL; size_t size = lpass_platform_pcm_hardware.buffer_bytes_max; psubstream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; if (psubstream) { ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, - soc_runtime->platform->dev, + component->dev, size, &psubstream->dma_buffer); if (ret) { dev_err(soc_runtime->dev, "Cannot allocate buffer(s)\n"); @@ -526,7 +529,7 @@ static int lpass_platform_pcm_new(struct snd_soc_pcm_runtime *soc_runtime) csubstream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; if (csubstream) { ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, - soc_runtime->platform->dev, + component->dev, size, &csubstream->dma_buffer); if (ret) { dev_err(soc_runtime->dev, "Cannot allocate buffer(s)\n"); @@ -555,7 +558,8 @@ static void lpass_platform_pcm_free(struct snd_pcm *pcm) } } -static const struct snd_soc_platform_driver lpass_platform_driver = { +static const struct snd_soc_component_driver lpass_component_driver = { + .name = DRV_NAME, .pcm_new = lpass_platform_pcm_new, .pcm_free = lpass_platform_pcm_free, .ops = &lpass_platform_pcm_ops, @@ -591,8 +595,8 @@ int asoc_qcom_lpass_platform_register(struct platform_device *pdev) } - return devm_snd_soc_register_platform(&pdev->dev, - &lpass_platform_driver); + return devm_snd_soc_register_component(&pdev->dev, + &lpass_component_driver, NULL, 0); } EXPORT_SYMBOL_GPL(asoc_qcom_lpass_platform_register); diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig index b0825370d262..957046ac6c8c 100644 --- a/sound/soc/rockchip/Kconfig +++ b/sound/soc/rockchip/Kconfig @@ -56,6 +56,9 @@ config SND_SOC_RK3288_HDMI_ANALOG depends on SND_SOC_ROCKCHIP && I2C && GPIOLIB && CLKDEV_LOOKUP select SND_SOC_ROCKCHIP_I2S select SND_SOC_HDMI_CODEC + select SND_SOC_ES8328_I2C + select SND_SOC_ES8328_SPI if SPI_MASTER + select DRM_DW_HDMI_I2S_AUDIO if DRM_DW_HDMI help Say Y or M here if you want to add support for SoC audio on Rockchip RK3288 boards using an analog output and the built-in HDMI audio. diff --git a/sound/soc/rockchip/rk3288_hdmi_analog.c b/sound/soc/rockchip/rk3288_hdmi_analog.c index fa44e3901336..929b3fe289b0 100644 --- a/sound/soc/rockchip/rk3288_hdmi_analog.c +++ b/sound/soc/rockchip/rk3288_hdmi_analog.c @@ -155,7 +155,7 @@ static struct snd_soc_dai_link_component rk_codecs[] = { { }, { .name = "hdmi-audio-codec.2.auto", - .dai_name = "hdmi-hifi.0", + .dai_name = "i2s-hifi", }, }; diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c index 214bfc78cf5c..9a10181a0811 100644 --- a/sound/soc/rockchip/rk3399_gru_sound.c +++ b/sound/soc/rockchip/rk3399_gru_sound.c @@ -176,7 +176,7 @@ static int rockchip_sound_da7219_hw_params(struct snd_pcm_substream *substream, static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd) { - struct snd_soc_codec *codec = rtd->codec_dais[0]->codec; + struct snd_soc_component *component = rtd->codec_dais[0]->component; struct snd_soc_dai *codec_dai = rtd->codec_dai; int ret; @@ -215,7 +215,7 @@ static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd) snd_jack_set_key( rockchip_sound_jack.jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); - da7219_aad_jack_det(codec, &rockchip_sound_jack); + da7219_aad_jack_det(component, &rockchip_sound_jack); return 0; } diff --git a/sound/soc/rockchip/rockchip_rt5645.c b/sound/soc/rockchip/rockchip_rt5645.c index 9e0c17805807..4db4fd56db35 100644 --- a/sound/soc/rockchip/rockchip_rt5645.c +++ b/sound/soc/rockchip/rockchip_rt5645.c @@ -29,16 +29,12 @@ #include <sound/pcm_params.h> #include <sound/soc.h> #include "rockchip_i2s.h" +#include "../codecs/rt5645.h" #define DRV_NAME "rockchip-snd-rt5645" static struct snd_soc_jack headset_jack; -/* Jack detect via rt5645 driver. */ -extern int rt5645_set_jack_detect(struct snd_soc_codec *codec, - struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack, - struct snd_soc_jack *btn_jack); - static const struct snd_soc_dapm_widget rk_dapm_widgets[] = { SND_SOC_DAPM_HP("Headphones", NULL), SND_SOC_DAPM_SPK("Speakers", NULL), @@ -129,7 +125,7 @@ static int rk_init(struct snd_soc_pcm_runtime *runtime) return ret; } - return rt5645_set_jack_detect(runtime->codec, + return rt5645_set_jack_detect(runtime->codec_dai->component, &headset_jack, &headset_jack, &headset_jack); diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile index 030949e1e434..c3b76035f69c 100644 --- a/sound/soc/samsung/Makefile +++ b/sound/soc/samsung/Makefile @@ -21,8 +21,6 @@ obj-$(CONFIG_SND_SAMSUNG_I2S) += snd-soc-idma.o # S3C24XX Machine Support snd-soc-jive-wm8750-objs := jive_wm8750.o snd-soc-neo1973-wm8753-objs := neo1973_wm8753.o -snd-soc-smdk2443-wm9710-objs := smdk2443_wm9710.o -snd-soc-ln2440sbc-alc650-objs := ln2440sbc_alc650.o snd-soc-s3c24xx-uda134x-objs := s3c24xx_uda134x.o snd-soc-s3c24xx-simtec-objs := s3c24xx_simtec.o snd-soc-s3c24xx-simtec-hermes-objs := s3c24xx_simtec_hermes.o @@ -32,7 +30,6 @@ snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o snd-soc-smdk-wm8580-objs := smdk_wm8580.o snd-soc-smdk-wm8994-objs := smdk_wm8994.o snd-soc-snow-objs := snow.o -snd-soc-smdk-wm9713-objs := smdk_wm9713.o snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o snd-soc-smdk-spdif-objs := smdk_spdif.o snd-soc-smdk-wm8994pcm-objs := smdk_wm8994pcm.o diff --git a/sound/soc/samsung/i2s-regs.h b/sound/soc/samsung/i2s-regs.h index fe6914005494..964985ea2e80 100644 --- a/sound/soc/samsung/i2s-regs.h +++ b/sound/soc/samsung/i2s-regs.h @@ -65,11 +65,12 @@ #define CON_RXDMA_ACTIVE (1 << 1) #define CON_ACTIVE (1 << 0) -#define MOD_OPCLK_CDCLK_OUT (0 << 30) -#define MOD_OPCLK_CDCLK_IN (1 << 30) -#define MOD_OPCLK_BCLK_OUT (2 << 30) -#define MOD_OPCLK_PCLK (3 << 30) -#define MOD_OPCLK_MASK (3 << 30) +#define MOD_OPCLK_SHIFT 30 +#define MOD_OPCLK_CDCLK_OUT (0 << MOD_OPCLK_SHIFT) +#define MOD_OPCLK_CDCLK_IN (1 << MOD_OPCLK_SHIFT) +#define MOD_OPCLK_BCLK_OUT (2 << MOD_OPCLK_SHIFT) +#define MOD_OPCLK_PCLK (3 << MOD_OPCLK_SHIFT) +#define MOD_OPCLK_MASK (3 << MOD_OPCLK_SHIFT) #define MOD_TXS_IDMA (1 << 28) /* Sec_TXFIFO use I-DMA */ #define MOD_BLCS_SHIFT 26 diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index 233f1c9a4b6c..f914ed45db7d 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c @@ -489,7 +489,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, switch (clk_id) { case SAMSUNG_I2S_OPCLK: mask = MOD_OPCLK_MASK; - val = dir; + val = (dir << MOD_OPCLK_SHIFT) & MOD_OPCLK_MASK; break; case SAMSUNG_I2S_CDCLK: mask = 1 << i2s_regs->cdclkcon_off; @@ -656,8 +656,12 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, tmp |= mod_slave; break; case SND_SOC_DAIFMT_CBS_CFS: - /* Set default source clock in Master mode */ - if (i2s->rclk_srcrate == 0) + /* + * Set default source clock in Master mode, only when the + * CLK_I2S_RCLK_SRC clock is not exposed so we ensure any + * clock configuration assigned in DT is not overwritten. + */ + if (i2s->rclk_srcrate == 0 && i2s->clk_data.clks == NULL) i2s_set_sysclk(dai, SAMSUNG_I2S_RCLKSRC_0, 0, SND_SOC_CLOCK_IN); break; @@ -881,6 +885,11 @@ static int config_setup(struct i2s_dai *i2s) return 0; if (!(i2s->quirks & QUIRK_NO_MUXPSR)) { + struct clk *rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC]; + + if (rclksrc && !IS_ERR(rclksrc)) + i2s->rclk_srcrate = clk_get_rate(rclksrc); + psr = i2s->rclk_srcrate / i2s->frmclk / rfs; writel(((psr - 1) << 8) | PSR_PSREN, i2s->addr + I2SPSR); dev_dbg(&i2s->pdev->dev, @@ -1184,11 +1193,13 @@ static void i2s_unregister_clock_provider(struct platform_device *pdev) static int i2s_register_clock_provider(struct platform_device *pdev) { - struct device *dev = &pdev->dev; - struct i2s_dai *i2s = dev_get_drvdata(dev); + const char * const i2s_clk_desc[] = { "cdclk", "rclk_src", "prescaler" }; const char *clk_name[2] = { "i2s_opclk0", "i2s_opclk1" }; const char *p_names[2] = { NULL }; + struct device *dev = &pdev->dev; + struct i2s_dai *i2s = dev_get_drvdata(dev); const struct samsung_i2s_variant_regs *reg_info = i2s->variant_regs; + const char *i2s_clk_name[ARRAY_SIZE(i2s_clk_desc)]; struct clk *rclksrc; int ret, i; @@ -1205,30 +1216,38 @@ static int i2s_register_clock_provider(struct platform_device *pdev) clk_put(rclksrc); } + for (i = 0; i < ARRAY_SIZE(i2s_clk_desc); i++) { + i2s_clk_name[i] = devm_kasprintf(dev, GFP_KERNEL, "%s_%s", + dev_name(dev), i2s_clk_desc[i]); + if (!i2s_clk_name[i]) + return -ENOMEM; + } + if (!(i2s->quirks & QUIRK_NO_MUXPSR)) { /* Activate the prescaler */ u32 val = readl(i2s->addr + I2SPSR); writel(val | PSR_PSREN, i2s->addr + I2SPSR); i2s->clk_table[CLK_I2S_RCLK_SRC] = clk_register_mux(dev, - "i2s_rclksrc", p_names, ARRAY_SIZE(p_names), + i2s_clk_name[CLK_I2S_RCLK_SRC], p_names, + ARRAY_SIZE(p_names), CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, i2s->addr + I2SMOD, reg_info->rclksrc_off, 1, 0, i2s->lock); i2s->clk_table[CLK_I2S_RCLK_PSR] = clk_register_divider(dev, - "i2s_presc", "i2s_rclksrc", + i2s_clk_name[CLK_I2S_RCLK_PSR], + i2s_clk_name[CLK_I2S_RCLK_SRC], CLK_SET_RATE_PARENT, i2s->addr + I2SPSR, 8, 6, 0, i2s->lock); - p_names[0] = "i2s_presc"; + p_names[0] = i2s_clk_name[CLK_I2S_RCLK_PSR]; i2s->clk_data.clk_num = 2; } - of_property_read_string_index(dev->of_node, - "clock-output-names", 0, &clk_name[0]); - i2s->clk_table[CLK_I2S_CDCLK] = clk_register_gate(dev, clk_name[0], - p_names[0], CLK_SET_RATE_PARENT, + i2s->clk_table[CLK_I2S_CDCLK] = clk_register_gate(dev, + i2s_clk_name[CLK_I2S_CDCLK], p_names[0], + CLK_SET_RATE_PARENT, i2s->addr + I2SMOD, reg_info->cdclkcon_off, CLK_GATE_SET_TO_DISABLE, i2s->lock); @@ -1385,9 +1404,14 @@ static int samsung_i2s_probe(struct platform_device *pdev) pm_runtime_enable(&pdev->dev); ret = i2s_register_clock_provider(pdev); - if (!ret) - return 0; + if (ret < 0) + goto err_disable_pm; + + pri_dai->op_clk = clk_get_parent(pri_dai->clk_table[CLK_I2S_RCLK_SRC]); + + return 0; +err_disable_pm: pm_runtime_disable(&pdev->dev); err_disable_clk: clk_disable_unprepare(pri_dai->clk); diff --git a/sound/soc/samsung/i2s.h b/sound/soc/samsung/i2s.h index 79781de2f247..a9832a9555cb 100644 --- a/sound/soc/samsung/i2s.h +++ b/sound/soc/samsung/i2s.h @@ -16,11 +16,16 @@ #define SAMSUNG_I2S_DAI "samsung-i2s" #define SAMSUNG_I2S_DAI_SEC "samsung-i2s-sec" -#define SAMSUNG_I2S_DIV_BCLK 1 +#define SAMSUNG_I2S_DIV_BCLK 1 -#define SAMSUNG_I2S_RCLKSRC_0 0 -#define SAMSUNG_I2S_RCLKSRC_1 1 +#define SAMSUNG_I2S_RCLKSRC_0 0 +#define SAMSUNG_I2S_RCLKSRC_1 1 #define SAMSUNG_I2S_CDCLK 2 +/* Operation clock for IIS logic */ #define SAMSUNG_I2S_OPCLK 3 +#define SAMSUNG_I2S_OPCLK_CDCLK_OUT 0 /* CODEC clock out */ +#define SAMSUNG_I2S_OPCLK_CDCLK_IN 1 /* CODEC clock in */ +#define SAMSUNG_I2S_OPCLK_BCLK_OUT 2 /* Bit clock out */ +#define SAMSUNG_I2S_OPCLK_PCLK 3 /* Audio bus clock */ #endif /* __SND_SOC_SAMSUNG_I2S_H */ diff --git a/sound/soc/samsung/idma.c b/sound/soc/samsung/idma.c index a635df61f928..b1f09b942410 100644 --- a/sound/soc/samsung/idma.c +++ b/sound/soc/samsung/idma.c @@ -399,7 +399,7 @@ void idma_reg_addr_init(void __iomem *regs, dma_addr_t addr) } EXPORT_SYMBOL_GPL(idma_reg_addr_init); -static const struct snd_soc_platform_driver asoc_idma_platform = { +static const struct snd_soc_component_driver asoc_idma_platform = { .ops = &idma_ops, .pcm_new = idma_new, .pcm_free = idma_free, @@ -411,7 +411,8 @@ static int asoc_idma_platform_probe(struct platform_device *pdev) if (idma_irq < 0) return idma_irq; - return devm_snd_soc_register_platform(&pdev->dev, &asoc_idma_platform); + return devm_snd_soc_register_component(&pdev->dev, &asoc_idma_platform, + NULL, 0); } static struct platform_driver asoc_idma_driver = { diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c index 44b6de5a331a..e7b371b07230 100644 --- a/sound/soc/samsung/odroid.c +++ b/sound/soc/samsung/odroid.c @@ -36,23 +36,24 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct odroid_priv *priv = snd_soc_card_get_drvdata(rtd->card); - unsigned int pll_freq, rclk_freq; + unsigned int pll_freq, rclk_freq, rfs; int ret; switch (params_rate(params)) { - case 32000: case 64000: - pll_freq = 131072006U; + pll_freq = 196608001U; + rfs = 384; break; case 44100: case 88200: - case 176400: pll_freq = 180633609U; + rfs = 512; break; + case 32000: case 48000: case 96000: - case 192000: pll_freq = 196608001U; + rfs = 512; break; default: return -EINVAL; @@ -67,7 +68,7 @@ static int odroid_card_hw_params(struct snd_pcm_substream *substream, * frequency values due to the EPLL output frequency not being exact * multiple of the audio sampling rate. */ - rclk_freq = params_rate(params) * 256 + 1; + rclk_freq = params_rate(params) * rfs + 1; ret = clk_set_rate(priv->sclk_i2s, rclk_freq); if (ret < 0) @@ -90,18 +91,6 @@ static const struct snd_soc_ops odroid_card_ops = { .hw_params = odroid_card_hw_params, }; -static void odroid_put_codec_of_nodes(struct snd_soc_dai_link *link) -{ - struct snd_soc_dai_link_component *component = link->codecs; - int i; - - for (i = 0; i < link->num_codecs; i++, component++) { - if (!component->of_node) - break; - of_node_put(component->of_node); - } -} - static int odroid_audio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -196,7 +185,7 @@ err_put_sclk: err_put_i2s_n: of_node_put(link->cpu_of_node); err_put_codec_n: - odroid_put_codec_of_nodes(link); + snd_soc_of_put_dai_link_codecs(link); return ret; } @@ -205,7 +194,7 @@ static int odroid_audio_remove(struct platform_device *pdev) struct odroid_priv *priv = platform_get_drvdata(pdev); of_node_put(priv->dai_link.cpu_of_node); - odroid_put_codec_of_nodes(&priv->dai_link); + snd_soc_of_put_dai_link_codecs(&priv->dai_link); clk_put(priv->sclk_i2s); clk_put(priv->clk_i2s_bus); @@ -213,8 +202,10 @@ static int odroid_audio_remove(struct platform_device *pdev) } static const struct of_device_id odroid_audio_of_match[] = { + { .compatible = "hardkernel,odroid-xu3-audio" }, + { .compatible = "hardkernel,odroid-xu4-audio" }, { .compatible = "samsung,odroid-xu3-audio" }, - { .compatible = "samsung,odroid-xu4-audio"}, + { .compatible = "samsung,odroid-xu4-audio" }, { }, }; MODULE_DEVICE_TABLE(of, odroid_audio_of_match); diff --git a/sound/soc/samsung/snow.c b/sound/soc/samsung/snow.c index d8ac907bbb0d..5d8efc2d5c38 100644 --- a/sound/soc/samsung/snow.c +++ b/sound/soc/samsung/snow.c @@ -11,97 +11,207 @@ * General Public License for more details. */ +#include <linux/clk.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_device.h> - +#include <sound/pcm_params.h> #include <sound/soc.h> #include "i2s.h" #define FIN_PLL_RATE 24000000 -static struct snd_soc_dai_link snow_dai[] = { - { - .name = "Primary", - .stream_name = "Primary", - .codec_dai_name = "HiFi", - .dai_fmt = SND_SOC_DAIFMT_I2S | - SND_SOC_DAIFMT_NB_NF | - SND_SOC_DAIFMT_CBS_CFS, - }, +struct snow_priv { + struct snd_soc_dai_link dai_link; + struct clk *clk_i2s_bus; +}; + +static int snow_card_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + static const unsigned int pll_rate[] = { + 73728000U, 67737602U, 49152000U, 45158401U, 32768001U + }; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snow_priv *priv = snd_soc_card_get_drvdata(rtd->card); + int bfs, psr, rfs, bitwidth; + unsigned long int rclk; + long int freq = -EINVAL; + int ret, i; + + bitwidth = snd_pcm_format_width(params_format(params)); + if (bitwidth < 0) { + dev_err(rtd->card->dev, "Invalid bit-width: %d\n", bitwidth); + return bitwidth; + } + + if (bitwidth != 16 && bitwidth != 24) { + dev_err(rtd->card->dev, "Unsupported bit-width: %d\n", bitwidth); + return -EINVAL; + } + + bfs = 2 * bitwidth; + + switch (params_rate(params)) { + case 16000: + case 22050: + case 24000: + case 32000: + case 44100: + case 48000: + case 88200: + case 96000: + rfs = 8 * bfs; + break; + case 64000: + rfs = 384; + break; + case 8000: + case 11025: + case 12000: + rfs = 16 * bfs; + break; + default: + return -EINVAL; + } + + rclk = params_rate(params) * rfs; + + for (psr = 8; psr > 0; psr /= 2) { + for (i = 0; i < ARRAY_SIZE(pll_rate); i++) { + if ((pll_rate[i] - rclk * psr) <= 2) { + freq = pll_rate[i]; + break; + } + } + } + if (freq < 0) { + dev_err(rtd->card->dev, "Unsupported RCLK rate: %lu\n", rclk); + return -EINVAL; + } + + ret = clk_set_rate(priv->clk_i2s_bus, freq); + if (ret < 0) { + dev_err(rtd->card->dev, "I2S bus clock rate set failed\n"); + return ret; + } + + return 0; +} + +static const struct snd_soc_ops snow_card_ops = { + .hw_params = snow_card_hw_params, }; static int snow_late_probe(struct snd_soc_card *card) { struct snd_soc_pcm_runtime *rtd; struct snd_soc_dai *codec_dai; - struct snd_soc_dai *cpu_dai; - int ret; rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name); - codec_dai = rtd->codec_dai; - cpu_dai = rtd->cpu_dai; - /* Set the MCLK rate for the codec */ - ret = snd_soc_dai_set_sysclk(codec_dai, 0, - FIN_PLL_RATE, SND_SOC_CLOCK_IN); - if (ret < 0) - return ret; + /* In the multi-codec case codec_dais 0 is MAX98095 and 1 is HDMI. */ + if (rtd->num_codecs > 1) + codec_dai = rtd->codec_dais[0]; + else + codec_dai = rtd->codec_dai; - /* Select I2S Bus clock to set RCLK and BCLK */ - ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_RCLKSRC_0, - 0, SND_SOC_CLOCK_IN); - if (ret < 0) - return ret; - - return 0; + /* Set the MCLK rate for the codec */ + return snd_soc_dai_set_sysclk(codec_dai, 0, + FIN_PLL_RATE, SND_SOC_CLOCK_IN); } static struct snd_soc_card snow_snd = { .name = "Snow-I2S", .owner = THIS_MODULE, - .dai_link = snow_dai, - .num_links = ARRAY_SIZE(snow_dai), - .late_probe = snow_late_probe, }; static int snow_probe(struct platform_device *pdev) { + struct device *dev = &pdev->dev; struct snd_soc_card *card = &snow_snd; - struct device_node *i2s_node, *codec_node; - int i, ret; - - i2s_node = of_parse_phandle(pdev->dev.of_node, - "samsung,i2s-controller", 0); - if (!i2s_node) { - dev_err(&pdev->dev, - "Property 'i2s-controller' missing or invalid\n"); - return -EINVAL; - } + struct device_node *cpu, *codec; + struct snd_soc_dai_link *link; + struct snow_priv *priv; + int ret; - codec_node = of_parse_phandle(pdev->dev.of_node, - "samsung,audio-codec", 0); - if (!codec_node) { - dev_err(&pdev->dev, - "Property 'audio-codec' missing or invalid\n"); - return -EINVAL; - } + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + link = &priv->dai_link; + + link->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS; + + link->name = "Primary"; + link->stream_name = link->name; + + card->dai_link = link; + card->num_links = 1; + card->dev = dev; + + /* Try new DT bindings with HDMI support first. */ + cpu = of_get_child_by_name(dev->of_node, "cpu"); + + if (cpu) { + link->ops = &snow_card_ops; - for (i = 0; i < ARRAY_SIZE(snow_dai); i++) { - snow_dai[i].codec_of_node = codec_node; - snow_dai[i].cpu_of_node = i2s_node; - snow_dai[i].platform_of_node = i2s_node; + link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); + of_node_put(cpu); + + if (!link->cpu_of_node) { + dev_err(dev, "Failed parsing cpu/sound-dai property\n"); + return -EINVAL; + } + + codec = of_get_child_by_name(dev->of_node, "codec"); + ret = snd_soc_of_get_dai_link_codecs(dev, codec, link); + of_node_put(codec); + + if (ret < 0) { + of_node_put(link->cpu_of_node); + dev_err(dev, "Failed parsing codec node\n"); + return ret; + } + + priv->clk_i2s_bus = of_clk_get_by_name(link->cpu_of_node, + "i2s_opclk0"); + if (IS_ERR(priv->clk_i2s_bus)) { + snd_soc_of_put_dai_link_codecs(link); + of_node_put(link->cpu_of_node); + return PTR_ERR(priv->clk_i2s_bus); + } + } else { + link->codec_dai_name = "HiFi", + + link->cpu_of_node = of_parse_phandle(dev->of_node, + "samsung,i2s-controller", 0); + if (!link->cpu_of_node) { + dev_err(dev, "i2s-controller property parse error\n"); + return -EINVAL; + } + + link->codec_of_node = of_parse_phandle(dev->of_node, + "samsung,audio-codec", 0); + if (!link->codec_of_node) { + of_node_put(link->cpu_of_node); + dev_err(dev, "audio-codec property parse error\n"); + return -EINVAL; + } } - card->dev = &pdev->dev; + link->platform_of_node = link->cpu_of_node; /* Update card-name if provided through DT, else use default name */ snd_soc_of_parse_card_name(card, "samsung,model"); - ret = devm_snd_soc_register_card(&pdev->dev, card); + snd_soc_card_set_drvdata(card, priv); + + ret = devm_snd_soc_register_card(dev, card); if (ret) { dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); return ret; @@ -110,6 +220,20 @@ static int snow_probe(struct platform_device *pdev) return ret; } +static int snow_remove(struct platform_device *pdev) +{ + struct snow_priv *priv = platform_get_drvdata(pdev); + struct snd_soc_dai_link *link = &priv->dai_link; + + of_node_put(link->cpu_of_node); + of_node_put(link->codec_of_node); + snd_soc_of_put_dai_link_codecs(link); + + clk_put(priv->clk_i2s_bus); + + return 0; +} + static const struct of_device_id snow_of_match[] = { { .compatible = "google,snow-audio-max98090", }, { .compatible = "google,snow-audio-max98091", }, @@ -125,6 +249,7 @@ static struct platform_driver snow_driver = { .of_match_table = snow_of_match, }, .probe = snow_probe, + .remove = snow_remove, }; module_platform_driver(snow_driver); diff --git a/sound/soc/samsung/tm2_wm5110.c b/sound/soc/samsung/tm2_wm5110.c index a55d18703fe7..43332c32d7e9 100644 --- a/sound/soc/samsung/tm2_wm5110.c +++ b/sound/soc/samsung/tm2_wm5110.c @@ -31,7 +31,7 @@ #define TM2_DAI_AIF2 1 struct tm2_machine_priv { - struct snd_soc_codec *codec; + struct snd_soc_component *component; unsigned int sysclk_rate; struct gpio_desc *gpio_mic_bias; }; @@ -39,33 +39,33 @@ struct tm2_machine_priv { static int tm2_start_sysclk(struct snd_soc_card *card) { struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card); - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; int ret; - ret = snd_soc_codec_set_pll(codec, WM5110_FLL1_REFCLK, + ret = snd_soc_component_set_pll(component, WM5110_FLL1_REFCLK, ARIZONA_FLL_SRC_MCLK1, MCLK_RATE, priv->sysclk_rate); if (ret < 0) { - dev_err(codec->dev, "Failed to set FLL1 source: %d\n", ret); + dev_err(component->dev, "Failed to set FLL1 source: %d\n", ret); return ret; } - ret = snd_soc_codec_set_pll(codec, WM5110_FLL1, + ret = snd_soc_component_set_pll(component, WM5110_FLL1, ARIZONA_FLL_SRC_MCLK1, MCLK_RATE, priv->sysclk_rate); if (ret < 0) { - dev_err(codec->dev, "Failed to start FLL1: %d\n", ret); + dev_err(component->dev, "Failed to start FLL1: %d\n", ret); return ret; } - ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, + ret = snd_soc_component_set_sysclk(component, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, priv->sysclk_rate, SND_SOC_CLOCK_IN); if (ret < 0) { - dev_err(codec->dev, "Failed to set SYSCLK source: %d\n", ret); + dev_err(component->dev, "Failed to set SYSCLK source: %d\n", ret); return ret; } @@ -75,19 +75,19 @@ static int tm2_start_sysclk(struct snd_soc_card *card) static int tm2_stop_sysclk(struct snd_soc_card *card) { struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card); - struct snd_soc_codec *codec = priv->codec; + struct snd_soc_component *component = priv->component; int ret; - ret = snd_soc_codec_set_pll(codec, WM5110_FLL1, 0, 0, 0); + ret = snd_soc_component_set_pll(component, WM5110_FLL1, 0, 0, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to stop FLL1: %d\n", ret); + dev_err(component->dev, "Failed to stop FLL1: %d\n", ret); return ret; } - ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, + ret = snd_soc_component_set_sysclk(component, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, 0, 0); if (ret < 0) { - dev_err(codec->dev, "Failed to stop SYSCLK: %d\n", ret); + dev_err(component->dev, "Failed to stop SYSCLK: %d\n", ret); return ret; } @@ -98,7 +98,7 @@ static int tm2_aif1_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(rtd->card); switch (params_rate(params)) { @@ -123,7 +123,7 @@ static int tm2_aif1_hw_params(struct snd_pcm_substream *substream, priv->sysclk_rate = 135475200U; break; default: - dev_err(codec->dev, "Not supported sample rate: %d\n", + dev_err(component->dev, "Not supported sample rate: %d\n", params_rate(params)); return -EINVAL; } @@ -139,7 +139,7 @@ static int tm2_aif2_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; unsigned int asyncclk_rate; int ret; @@ -155,35 +155,35 @@ static int tm2_aif2_hw_params(struct snd_pcm_substream *substream, asyncclk_rate = 45158400U; break; default: - dev_err(codec->dev, "Not supported sample rate: %d\n", + dev_err(component->dev, "Not supported sample rate: %d\n", params_rate(params)); return -EINVAL; } - ret = snd_soc_codec_set_pll(codec, WM5110_FLL2_REFCLK, + ret = snd_soc_component_set_pll(component, WM5110_FLL2_REFCLK, ARIZONA_FLL_SRC_MCLK1, MCLK_RATE, asyncclk_rate); if (ret < 0) { - dev_err(codec->dev, "Failed to set FLL2 source: %d\n", ret); + dev_err(component->dev, "Failed to set FLL2 source: %d\n", ret); return ret; } - ret = snd_soc_codec_set_pll(codec, WM5110_FLL2, + ret = snd_soc_component_set_pll(component, WM5110_FLL2, ARIZONA_FLL_SRC_MCLK1, MCLK_RATE, asyncclk_rate); if (ret < 0) { - dev_err(codec->dev, "Failed to start FLL2: %d\n", ret); + dev_err(component->dev, "Failed to start FLL2: %d\n", ret); return ret; } - ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK, + ret = snd_soc_component_set_sysclk(component, ARIZONA_CLK_ASYNCCLK, ARIZONA_CLK_SRC_FLL2, asyncclk_rate, SND_SOC_CLOCK_IN); if (ret < 0) { - dev_err(codec->dev, "Failed to set ASYNCCLK source: %d\n", ret); + dev_err(component->dev, "Failed to set ASYNCCLK source: %d\n", ret); return ret; } @@ -193,14 +193,14 @@ static int tm2_aif2_hw_params(struct snd_pcm_substream *substream, static int tm2_aif2_hw_free(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_component *component = rtd->codec_dai->component; int ret; /* disable FLL2 */ - ret = snd_soc_codec_set_pll(codec, WM5110_FLL2, ARIZONA_FLL_SRC_MCLK1, + ret = snd_soc_component_set_pll(component, WM5110_FLL2, ARIZONA_FLL_SRC_MCLK1, 0, 0); if (ret < 0) - dev_err(codec->dev, "Failed to stop FLL2: %d\n", ret); + dev_err(component->dev, "Failed to stop FLL2: %d\n", ret); return ret; } @@ -210,6 +210,59 @@ static struct snd_soc_ops tm2_aif2_ops = { .hw_free = tm2_aif2_hw_free, }; +static int tm2_hdmi_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + unsigned int bfs; + int bitwidth, ret; + + bitwidth = snd_pcm_format_width(params_format(params)); + if (bitwidth < 0) { + dev_err(rtd->card->dev, "Invalid bit-width: %d\n", bitwidth); + return bitwidth; + } + + switch (bitwidth) { + case 48: + bfs = 64; + break; + case 16: + bfs = 32; + break; + default: + dev_err(rtd->card->dev, "Unsupported bit-width: %d\n", bitwidth); + return -EINVAL; + } + + switch (params_rate(params)) { + case 48000: + case 96000: + case 192000: + break; + default: + dev_err(rtd->card->dev, "Unsupported sample rate: %d\n", + params_rate(params)); + return -EINVAL; + } + + ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_OPCLK, + 0, SAMSUNG_I2S_OPCLK_PCLK); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_clkdiv(cpu_dai, SAMSUNG_I2S_DIV_BCLK, bfs); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_ops tm2_hdmi_ops = { + .hw_params = tm2_hdmi_hw_params, +}; + static int tm2_mic_bias(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { @@ -269,7 +322,7 @@ static int tm2_late_probe(struct snd_soc_card *card) rtd = snd_soc_get_pcm_runtime(card, card->dai_link[TM2_DAI_AIF1].name); aif1_dai = rtd->codec_dai; - priv->codec = rtd->codec; + priv->component = rtd->codec_dai->component; ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0); if (ret < 0) { @@ -405,6 +458,12 @@ static struct snd_soc_dai_link tm2_dai_links[] = { .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM, .ignore_suspend = 1, + }, { + .name = "HDMI", + .stream_name = "i2s1", + .ops = &tm2_hdmi_ops, + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS, } }; @@ -412,7 +471,6 @@ static struct snd_soc_card tm2_card = { .owner = THIS_MODULE, .dai_link = tm2_dai_links, - .num_links = ARRAY_SIZE(tm2_dai_links), .controls = tm2_controls, .num_controls = ARRAY_SIZE(tm2_controls), .dapm_widgets = tm2_dapm_widgets, @@ -426,11 +484,14 @@ static struct snd_soc_card tm2_card = { static int tm2_probe(struct platform_device *pdev) { + struct device_node *cpu_dai_node[2] = {}; + struct device_node *codec_dai_node[2] = {}; + const char *cells_name = NULL; struct device *dev = &pdev->dev; struct snd_soc_card *card = &tm2_card; struct tm2_machine_priv *priv; - struct device_node *cpu_dai_node, *codec_dai_node; - int ret, i; + struct of_phandle_args args; + int num_codecs, ret, i; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) @@ -464,47 +525,92 @@ static int tm2_probe(struct platform_device *pdev) return -EINVAL; } - cpu_dai_node = of_parse_phandle(dev->of_node, "i2s-controller", 0); - if (!cpu_dai_node) { - dev_err(dev, "i2s-controllers property invalid or missing\n"); - ret = -EINVAL; - goto amp_node_put; + num_codecs = of_count_phandle_with_args(dev->of_node, "audio-codec", + NULL); + + /* Skip the HDMI link if not specified in DT */ + if (num_codecs > 1) { + card->num_links = ARRAY_SIZE(tm2_dai_links); + cells_name = "#sound-dai-cells"; + } else { + card->num_links = ARRAY_SIZE(tm2_dai_links) - 1; } - codec_dai_node = of_parse_phandle(dev->of_node, "audio-codec", 0); - if (!codec_dai_node) { - dev_err(dev, "audio-codec property invalid or missing\n"); - ret = -EINVAL; - goto cpu_dai_node_put; + for (i = 0; i < num_codecs; i++) { + struct of_phandle_args args; + + ret = of_parse_phandle_with_args(dev->of_node, "i2s-controller", + cells_name, i, &args); + if (!args.np) { + dev_err(dev, "i2s-controller property parse error: %d\n", i); + ret = -EINVAL; + goto dai_node_put; + } + cpu_dai_node[i] = args.np; + + codec_dai_node[i] = of_parse_phandle(dev->of_node, + "audio-codec", i); + if (!codec_dai_node[i]) { + dev_err(dev, "audio-codec property parse error\n"); + ret = -EINVAL; + goto dai_node_put; + } } + /* Initialize WM5110 - I2S and HDMI - I2S1 DAI links */ for (i = 0; i < card->num_links; i++) { + unsigned int dai_index = 0; /* WM5110 */ + card->dai_link[i].cpu_name = NULL; card->dai_link[i].platform_name = NULL; - card->dai_link[i].codec_of_node = codec_dai_node; - card->dai_link[i].cpu_of_node = cpu_dai_node; - card->dai_link[i].platform_of_node = cpu_dai_node; + + if (num_codecs > 1 && i == card->num_links - 1) + dai_index = 1; /* HDMI */ + + card->dai_link[i].codec_of_node = codec_dai_node[dai_index]; + card->dai_link[i].cpu_of_node = cpu_dai_node[dai_index]; + card->dai_link[i].platform_of_node = cpu_dai_node[dai_index]; + } + + if (num_codecs > 1) { + /* HDMI DAI link (I2S1) */ + i = card->num_links - 1; + + ret = of_parse_phandle_with_fixed_args(dev->of_node, + "audio-codec", 0, 1, &args); + if (ret) { + dev_err(dev, "audio-codec property parse error\n"); + goto dai_node_put; + } + + ret = snd_soc_get_dai_name(&args, &card->dai_link[i].codec_dai_name); + if (ret) { + dev_err(dev, "Unable to get codec_dai_name\n"); + goto dai_node_put; + } } ret = devm_snd_soc_register_component(dev, &tm2_component, tm2_ext_dai, ARRAY_SIZE(tm2_ext_dai)); if (ret < 0) { dev_err(dev, "Failed to register component: %d\n", ret); - goto codec_dai_node_put; + goto dai_node_put; } ret = devm_snd_soc_register_card(dev, card); if (ret < 0) { dev_err(dev, "Failed to register card: %d\n", ret); - goto codec_dai_node_put; + goto dai_node_put; + } + +dai_node_put: + for (i = 0; i < num_codecs; i++) { + of_node_put(codec_dai_node[i]); + of_node_put(cpu_dai_node[i]); } -codec_dai_node_put: - of_node_put(codec_dai_node); -cpu_dai_node_put: - of_node_put(cpu_dai_node); -amp_node_put: of_node_put(card->aux_dev[0].codec_of_node); + return ret; } diff --git a/sound/soc/sh/dma-sh7760.c b/sound/soc/sh/dma-sh7760.c index 1e7d417b53ef..2dc3b762fdd9 100644 --- a/sound/soc/sh/dma-sh7760.c +++ b/sound/soc/sh/dma-sh7760.c @@ -320,14 +320,15 @@ static int camelot_pcm_new(struct snd_soc_pcm_runtime *rtd) return 0; } -static const struct snd_soc_platform_driver sh7760_soc_platform = { +static const struct snd_soc_component_driver sh7760_soc_component = { .ops = &camelot_pcm_ops, .pcm_new = camelot_pcm_new, }; static int sh7760_soc_platform_probe(struct platform_device *pdev) { - return devm_snd_soc_register_platform(&pdev->dev, &sh7760_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, &sh7760_soc_component, + NULL, 0); } static struct platform_driver sh7760_pcm_driver = { diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index c3aaf4788557..3bae06dd121f 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c @@ -1764,7 +1764,7 @@ static const struct snd_pcm_ops fsi_pcm_ops = { }; /* - * snd_soc_platform + * snd_soc_component */ #define PREALLOC_BUFFER (32 * 1024) @@ -1818,13 +1818,10 @@ static struct snd_soc_dai_driver fsi_soc_dai[] = { }, }; -static const struct snd_soc_platform_driver fsi_soc_platform = { - .ops = &fsi_pcm_ops, - .pcm_new = fsi_pcm_new, -}; - static const struct snd_soc_component_driver fsi_soc_component = { .name = "fsi", + .ops = &fsi_pcm_ops, + .pcm_new = fsi_pcm_new, }; /* @@ -2007,23 +2004,15 @@ static int fsi_probe(struct platform_device *pdev) goto exit_fsib; } - ret = snd_soc_register_platform(&pdev->dev, &fsi_soc_platform); - if (ret < 0) { - dev_err(&pdev->dev, "cannot snd soc register\n"); - goto exit_fsib; - } - - ret = snd_soc_register_component(&pdev->dev, &fsi_soc_component, + ret = devm_snd_soc_register_component(&pdev->dev, &fsi_soc_component, fsi_soc_dai, ARRAY_SIZE(fsi_soc_dai)); if (ret < 0) { dev_err(&pdev->dev, "cannot snd component register\n"); - goto exit_snd_soc; + goto exit_fsib; } return ret; -exit_snd_soc: - snd_soc_unregister_platform(&pdev->dev); exit_fsib: pm_runtime_disable(&pdev->dev); fsi_stream_remove(&master->fsib); @@ -2041,9 +2030,6 @@ static int fsi_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); - snd_soc_unregister_component(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - fsi_stream_remove(&master->fsia); fsi_stream_remove(&master->fsib); diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 64d5ecb86528..6a76688a8ba9 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -93,6 +93,15 @@ * [mod]->fn() -> [mod]->fn() -> [mod]->fn()... * */ + +/* + * you can enable below define if you don't need + * DAI status debug message when debugging + * see rsnd_dbg_dai_call() + * + * #define RSND_DEBUG_NO_DAI_CALL 1 + */ + #include <linux/pm_runtime.h> #include "rsnd.h" @@ -468,7 +477,7 @@ static int rsnd_status_update(u32 *status, __rsnd_mod_shift_##fn, \ __rsnd_mod_add_##fn, \ __rsnd_mod_call_##fn); \ - dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \ + rsnd_dbg_dai_call(dev, "%s[%d]\t0x%08x %s\n", \ rsnd_mod_name(mod), rsnd_mod_id(mod), *status, \ (func_call && (mod)->ops->fn) ? #fn : ""); \ if (func_call && (mod)->ops->fn) \ @@ -1337,7 +1346,7 @@ int rsnd_kctrl_new(struct rsnd_mod *mod, } /* - * snd_soc_platform + * snd_soc_component */ #define PREALLOC_BUFFER (32 * 1024) @@ -1364,12 +1373,9 @@ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd) PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); } -static const struct snd_soc_platform_driver rsnd_soc_platform = { +static const struct snd_soc_component_driver rsnd_soc_component = { .ops = &rsnd_pcm_ops, .pcm_new = rsnd_pcm_new, -}; - -static const struct snd_soc_component_driver rsnd_soc_component = { .name = "rsnd", }; @@ -1478,17 +1484,11 @@ static int rsnd_probe(struct platform_device *pdev) /* * asoc register */ - ret = snd_soc_register_platform(dev, &rsnd_soc_platform); - if (ret < 0) { - dev_err(dev, "cannot snd soc register\n"); - return ret; - } - - ret = snd_soc_register_component(dev, &rsnd_soc_component, + ret = devm_snd_soc_register_component(dev, &rsnd_soc_component, priv->daidrv, rsnd_rdai_nr(priv)); if (ret < 0) { dev_err(dev, "cannot snd dai register\n"); - goto exit_snd_soc; + goto exit_snd_probe; } pm_runtime_enable(dev); @@ -1496,8 +1496,6 @@ static int rsnd_probe(struct platform_device *pdev) dev_info(dev, "probed\n"); return ret; -exit_snd_soc: - snd_soc_unregister_platform(dev); exit_snd_probe: for_each_rsnd_dai(rdai, priv, i) { rsnd_dai_call(remove, &rdai->playback, priv); @@ -1535,9 +1533,6 @@ static int rsnd_remove(struct platform_device *pdev) for (i = 0; i < ARRAY_SIZE(remove_func); i++) remove_func[i](priv); - snd_soc_unregister_component(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); - return ret; } @@ -1560,8 +1555,7 @@ static int rsnd_resume(struct device *dev) } static const struct dev_pm_ops rsnd_pm_ops = { - .suspend = rsnd_suspend, - .resume = rsnd_resume, + SET_SYSTEM_SLEEP_PM_OPS(rsnd_suspend, rsnd_resume) }; static struct platform_driver rsnd_driver = { diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h index ad6523595b0a..172c8d612890 100644 --- a/sound/soc/sh/rcar/rsnd.h +++ b/sound/soc/sh/rcar/rsnd.h @@ -788,4 +788,24 @@ void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); #define rsnd_mod_confirm_dvc(mdvc) #endif +/* + * If you don't need interrupt status debug message, + * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c + * + * #define RSND_DEBUG_NO_IRQ_STATUS 1 + */ +#define rsnd_dbg_irq_status(dev, param...) \ + if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS)) \ + dev_dbg(dev, param) + +/* + * If you don't need rsnd_dai_call debug message, + * define RSND_DEBUG_NO_DAI_CALL as 1 on top of core.c + * + * #define RSND_DEBUG_NO_DAI_CALL 1 + */ +#define rsnd_dbg_dai_call(dev, param...) \ + if (!IS_BUILTIN(RSND_DEBUG_NO_DAI_CALL)) \ + dev_dbg(dev, param) + #endif diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c index 510b68a483b4..a727e71587b6 100644 --- a/sound/soc/sh/rcar/src.c +++ b/sound/soc/sh/rcar/src.c @@ -8,6 +8,15 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ + +/* + * you can enable below define if you don't need + * SSI interrupt status debug message when debugging + * see rsnd_dbg_irq_status() + * + * #define RSND_DEBUG_NO_IRQ_STATUS 1 + */ + #include "rsnd.h" #define SRC_NAME "src" @@ -325,7 +334,10 @@ static void rsnd_src_status_clear(struct rsnd_mod *mod) static bool rsnd_src_error_occurred(struct rsnd_mod *mod) { + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct device *dev = rsnd_priv_to_dev(priv); u32 val0, val1; + u32 status0, status1; bool ret = false; val0 = val1 = OUF_SRC(rsnd_mod_id(mod)); @@ -338,9 +350,15 @@ static bool rsnd_src_error_occurred(struct rsnd_mod *mod) if (rsnd_src_sync_is_enabled(mod)) val0 = val0 & 0xffff; - if ((rsnd_mod_read(mod, SCU_SYS_STATUS0) & val0) || - (rsnd_mod_read(mod, SCU_SYS_STATUS1) & val1)) + status0 = rsnd_mod_read(mod, SCU_SYS_STATUS0); + status1 = rsnd_mod_read(mod, SCU_SYS_STATUS1); + if ((status0 & val0) || (status1 & val1)) { + rsnd_dbg_irq_status(dev, "%s[%d] err status : 0x%08x, 0x%08x\n", + rsnd_mod_name(mod), rsnd_mod_id(mod), + status0, status1); + ret = true; + } return ret; } diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 97a9db892a8f..333b802681ad 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c @@ -11,6 +11,15 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ + +/* + * you can enable below define if you don't need + * SSI interrupt status debug message when debugging + * see rsnd_dbg_irq_status() + * + * #define RSND_DEBUG_NO_IRQ_STATUS 1 + */ + #include <sound/simple_card_utils.h> #include <linux/delay.h> #include "rsnd.h" @@ -603,6 +612,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct device *dev = rsnd_priv_to_dev(priv); int is_dma = rsnd_ssi_is_dma_mode(mod); u32 status; bool elapsed = false; @@ -621,8 +631,12 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, elapsed = rsnd_ssi_pio_interrupt(mod, io); /* DMA only */ - if (is_dma && (status & (UIRQ | OIRQ))) + if (is_dma && (status & (UIRQ | OIRQ))) { + rsnd_dbg_irq_status(dev, "%s[%d] err status : 0x%08x\n", + rsnd_mod_name(mod), rsnd_mod_id(mod), status); + stop = true; + } rsnd_ssi_status_clear(mod); rsnd_ssi_interrupt_out: diff --git a/sound/soc/sh/siu.h b/sound/soc/sh/siu.h index 83c3430ad797..6088d627c0e4 100644 --- a/sound/soc/sh/siu.h +++ b/sound/soc/sh/siu.h @@ -183,7 +183,7 @@ static inline u32 siu_read32(u32 __iomem *addr) #define SIU_BRGBSEL (0x108 / sizeof(u32)) #define SIU_BRRB (0x10c / sizeof(u32)) -extern struct snd_soc_platform_driver siu_platform; +extern struct snd_soc_component_driver siu_component; extern struct siu_info *siu_i2s_data; int siu_init_port(int port, struct siu_port **port_info, struct snd_card *card); diff --git a/sound/soc/sh/siu_dai.c b/sound/soc/sh/siu_dai.c index 160502947da2..ee2211635e92 100644 --- a/sound/soc/sh/siu_dai.c +++ b/sound/soc/sh/siu_dai.c @@ -727,10 +727,6 @@ static struct snd_soc_dai_driver siu_i2s_dai = { .ops = &siu_dai_ops, }; -static const struct snd_soc_component_driver siu_i2s_component = { - .name = "siu-i2s", -}; - static int siu_probe(struct platform_device *pdev) { const struct firmware *fw_entry; @@ -786,15 +782,11 @@ static int siu_probe(struct platform_device *pdev) dev_set_drvdata(&pdev->dev, info); /* register using ARRAY version so we can keep dai name */ - ret = devm_snd_soc_register_component(&pdev->dev, &siu_i2s_component, + ret = devm_snd_soc_register_component(&pdev->dev, &siu_component, &siu_i2s_dai, 1); if (ret < 0) return ret; - ret = devm_snd_soc_register_platform(&pdev->dev, &siu_platform); - if (ret < 0) - return ret; - pm_runtime_enable(&pdev->dev); return 0; diff --git a/sound/soc/sh/siu_pcm.c b/sound/soc/sh/siu_pcm.c index 3118cb0ee3f2..172909570ed5 100644 --- a/sound/soc/sh/siu_pcm.c +++ b/sound/soc/sh/siu_pcm.c @@ -35,6 +35,7 @@ #include "siu.h" +#define DRV_NAME "siu-i2s" #define GET_MAX_PERIODS(buf_bytes, period_bytes) \ ((buf_bytes) / (period_bytes)) #define PERIOD_OFFSET(buf_addr, period_num, period_bytes) \ @@ -340,7 +341,8 @@ static int siu_pcm_open(struct snd_pcm_substream *ss) { /* Playback / Capture */ struct snd_soc_pcm_runtime *rtd = ss->private_data; - struct siu_platform *pdata = rtd->platform->dev->platform_data; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct siu_platform *pdata = component->dev->platform_data; struct siu_info *info = siu_i2s_data; struct siu_port *port_info = siu_port_info(ss); struct siu_stream *siu_stream; @@ -604,9 +606,10 @@ static const struct snd_pcm_ops siu_pcm_ops = { .pointer = siu_pcm_pointer_dma, }; -struct snd_soc_platform_driver siu_platform = { +struct snd_soc_component_driver siu_component = { + .name = DRV_NAME, .ops = &siu_pcm_ops, .pcm_new = siu_pcm_new, .pcm_free = siu_pcm_free, }; -EXPORT_SYMBOL_GPL(siu_platform); +EXPORT_SYMBOL_GPL(siu_component); diff --git a/sound/soc/sirf/sirf-usp.h b/sound/soc/sirf/sirf-usp.h index bf0201cb15bc..e22e13a619e8 100644 --- a/sound/soc/sirf/sirf-usp.h +++ b/sound/soc/sirf/sirf-usp.h @@ -154,7 +154,7 @@ USP_RX_IO_DMA_INT|\ USP_RXFIFO_FULL_INT|\ USP_RXFIFO_THD_INT|\ - USP_RXFIFO_THD_INT|USP_RX_TIMEOUT_INT) + USP_RX_TIMEOUT_INT) #define USP_INT_ALL 0x1FFF diff --git a/sound/soc/soc-ac97.c b/sound/soc/soc-ac97.c index 36dae41f65fc..3f424f214bca 100644 --- a/sound/soc/soc-ac97.c +++ b/sound/soc/soc-ac97.c @@ -44,7 +44,7 @@ struct snd_ac97_gpio_priv { struct gpio_chip gpio_chip; #endif unsigned int gpios_set; - struct snd_soc_codec *codec; + struct snd_soc_component *component; }; static struct snd_ac97_bus soc_ac97_bus = { @@ -57,11 +57,11 @@ static void soc_ac97_device_release(struct device *dev) } #ifdef CONFIG_GPIOLIB -static inline struct snd_soc_codec *gpio_to_codec(struct gpio_chip *chip) +static inline struct snd_soc_component *gpio_to_component(struct gpio_chip *chip) { struct snd_ac97_gpio_priv *gpio_priv = gpiochip_get_data(chip); - return gpio_priv->codec; + return gpio_priv->component; } static int snd_soc_ac97_gpio_request(struct gpio_chip *chip, unsigned offset) @@ -75,20 +75,22 @@ static int snd_soc_ac97_gpio_request(struct gpio_chip *chip, unsigned offset) static int snd_soc_ac97_gpio_direction_in(struct gpio_chip *chip, unsigned offset) { - struct snd_soc_codec *codec = gpio_to_codec(chip); + struct snd_soc_component *component = gpio_to_component(chip); - dev_dbg(codec->dev, "set gpio %d to output\n", offset); - return snd_soc_update_bits(codec, AC97_GPIO_CFG, + dev_dbg(component->dev, "set gpio %d to output\n", offset); + return snd_soc_component_update_bits(component, AC97_GPIO_CFG, 1 << offset, 1 << offset); } static int snd_soc_ac97_gpio_get(struct gpio_chip *chip, unsigned offset) { - struct snd_soc_codec *codec = gpio_to_codec(chip); + struct snd_soc_component *component = gpio_to_component(chip); int ret; - ret = snd_soc_read(codec, AC97_GPIO_STATUS); - dev_dbg(codec->dev, "get gpio %d : %d\n", offset, + if (snd_soc_component_read(component, AC97_GPIO_STATUS, &ret) < 0) + ret = -1; + + dev_dbg(component->dev, "get gpio %d : %d\n", offset, ret < 0 ? ret : ret & (1 << offset)); return ret < 0 ? ret : !!(ret & (1 << offset)); @@ -98,22 +100,24 @@ static void snd_soc_ac97_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct snd_ac97_gpio_priv *gpio_priv = gpiochip_get_data(chip); - struct snd_soc_codec *codec = gpio_to_codec(chip); + struct snd_soc_component *component = gpio_to_component(chip); gpio_priv->gpios_set &= ~(1 << offset); gpio_priv->gpios_set |= (!!value) << offset; - snd_soc_write(codec, AC97_GPIO_STATUS, gpio_priv->gpios_set); - dev_dbg(codec->dev, "set gpio %d to %d\n", offset, !!value); + snd_soc_component_write(component, AC97_GPIO_STATUS, + gpio_priv->gpios_set); + dev_dbg(component->dev, "set gpio %d to %d\n", offset, !!value); } static int snd_soc_ac97_gpio_direction_out(struct gpio_chip *chip, unsigned offset, int value) { - struct snd_soc_codec *codec = gpio_to_codec(chip); + struct snd_soc_component *component = gpio_to_component(chip); - dev_dbg(codec->dev, "set gpio %d to output\n", offset); + dev_dbg(component->dev, "set gpio %d to output\n", offset); snd_soc_ac97_gpio_set(chip, offset, value); - return snd_soc_update_bits(codec, AC97_GPIO_CFG, 1 << offset, 0); + return snd_soc_component_update_bits(component, AC97_GPIO_CFG, + 1 << offset, 0); } static const struct gpio_chip snd_soc_ac97_gpio_chip = { @@ -128,24 +132,24 @@ static const struct gpio_chip snd_soc_ac97_gpio_chip = { }; static int snd_soc_ac97_init_gpio(struct snd_ac97 *ac97, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { struct snd_ac97_gpio_priv *gpio_priv; int ret; - gpio_priv = devm_kzalloc(codec->dev, sizeof(*gpio_priv), GFP_KERNEL); + gpio_priv = devm_kzalloc(component->dev, sizeof(*gpio_priv), GFP_KERNEL); if (!gpio_priv) return -ENOMEM; ac97->gpio_priv = gpio_priv; - gpio_priv->codec = codec; + gpio_priv->component = component; gpio_priv->gpio_chip = snd_soc_ac97_gpio_chip; gpio_priv->gpio_chip.ngpio = AC97_NUM_GPIOS; - gpio_priv->gpio_chip.parent = codec->dev; + gpio_priv->gpio_chip.parent = component->dev; gpio_priv->gpio_chip.base = -1; ret = gpiochip_add_data(&gpio_priv->gpio_chip, gpio_priv); if (ret != 0) - dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret); + dev_err(component->dev, "Failed to add GPIOs: %d\n", ret); return ret; } @@ -155,7 +159,7 @@ static void snd_soc_ac97_free_gpio(struct snd_ac97 *ac97) } #else static int snd_soc_ac97_init_gpio(struct snd_ac97 *ac97, - struct snd_soc_codec *codec) + struct snd_soc_component *component) { return 0; } @@ -166,8 +170,8 @@ static void snd_soc_ac97_free_gpio(struct snd_ac97 *ac97) #endif /** - * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device - * @codec: The CODEC for which to create the AC'97 device + * snd_soc_alloc_ac97_component() - Allocate new a AC'97 device + * @component: The COMPONENT for which to create the AC'97 device * * Allocated a new snd_ac97 device and intializes it, but does not yet register * it. The caller is responsible to either call device_add(&ac97->dev) to @@ -175,7 +179,7 @@ static void snd_soc_ac97_free_gpio(struct snd_ac97 *ac97) * * Returns: A snd_ac97 device or a PTR_ERR in case of an error. */ -struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec) +struct snd_ac97 *snd_soc_alloc_ac97_component(struct snd_soc_component *component) { struct snd_ac97 *ac97; @@ -187,26 +191,26 @@ struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec) ac97->num = 0; ac97->dev.bus = &ac97_bus_type; - ac97->dev.parent = codec->component.card->dev; + ac97->dev.parent = component->card->dev; ac97->dev.release = soc_ac97_device_release; dev_set_name(&ac97->dev, "%d-%d:%s", - codec->component.card->snd_card->number, 0, - codec->component.name); + component->card->snd_card->number, 0, + component->name); device_initialize(&ac97->dev); return ac97; } -EXPORT_SYMBOL(snd_soc_alloc_ac97_codec); +EXPORT_SYMBOL(snd_soc_alloc_ac97_component); /** - * snd_soc_new_ac97_codec - initailise AC97 device - * @codec: audio codec + * snd_soc_new_ac97_component - initailise AC97 device + * @component: audio component * @id: The expected device ID * @id_mask: Mask that is applied to the device ID before comparing with @id * - * Initialises AC97 codec resources for use by ad-hoc devices only. + * Initialises AC97 component resources for use by ad-hoc devices only. * * If @id is not 0 this function will reset the device, then read the ID from * the device and check if it matches the expected ID. If it doesn't match an @@ -214,20 +218,20 @@ EXPORT_SYMBOL(snd_soc_alloc_ac97_codec); * * Returns: A PTR_ERR() on failure or a valid snd_ac97 struct on success. */ -struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec, +struct snd_ac97 *snd_soc_new_ac97_component(struct snd_soc_component *component, unsigned int id, unsigned int id_mask) { struct snd_ac97 *ac97; int ret; - ac97 = snd_soc_alloc_ac97_codec(codec); + ac97 = snd_soc_alloc_ac97_component(component); if (IS_ERR(ac97)) return ac97; if (id) { ret = snd_ac97_reset(ac97, false, id, id_mask); if (ret < 0) { - dev_err(codec->dev, "Failed to reset AC97 device: %d\n", + dev_err(component->dev, "Failed to reset AC97 device: %d\n", ret); goto err_put_device; } @@ -237,7 +241,7 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec, if (ret) goto err_put_device; - ret = snd_soc_ac97_init_gpio(ac97, codec); + ret = snd_soc_ac97_init_gpio(ac97, component); if (ret) goto err_put_device; @@ -247,22 +251,22 @@ err_put_device: put_device(&ac97->dev); return ERR_PTR(ret); } -EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec); +EXPORT_SYMBOL_GPL(snd_soc_new_ac97_component); /** - * snd_soc_free_ac97_codec - free AC97 codec device + * snd_soc_free_ac97_component - free AC97 component device * @ac97: snd_ac97 device to be freed * - * Frees AC97 codec device resources. + * Frees AC97 component device resources. */ -void snd_soc_free_ac97_codec(struct snd_ac97 *ac97) +void snd_soc_free_ac97_component(struct snd_ac97 *ac97) { snd_soc_ac97_free_gpio(ac97); device_del(&ac97->dev); ac97->bus = NULL; put_device(&ac97->dev); } -EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec); +EXPORT_SYMBOL_GPL(snd_soc_free_ac97_component); static struct snd_ac97_reset_cfg snd_ac97_rst_cfg; diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 96c44f6576c9..bf7ca32ab31f 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -221,14 +221,14 @@ static const struct attribute_group soc_dapm_dev_group = { .is_visible = soc_dev_attr_is_visible, }; -static const struct attribute_group soc_dev_roup = { +static const struct attribute_group soc_dev_group = { .attrs = soc_dev_attrs, .is_visible = soc_dev_attr_is_visible, }; static const struct attribute_group *soc_dev_attr_groups[] = { &soc_dapm_dev_group, - &soc_dev_roup, + &soc_dev_group, NULL }; @@ -349,7 +349,7 @@ static void soc_init_codec_debugfs(struct snd_soc_component *component) "ASoC: Failed to create codec register debugfs file\n"); } -static int codec_list_seq_show(struct seq_file *m, void *v) +static int codec_list_show(struct seq_file *m, void *v) { struct snd_soc_codec *codec; @@ -362,20 +362,9 @@ static int codec_list_seq_show(struct seq_file *m, void *v) return 0; } +DEFINE_SHOW_ATTRIBUTE(codec_list); -static int codec_list_seq_open(struct inode *inode, struct file *file) -{ - return single_open(file, codec_list_seq_show, NULL); -} - -static const struct file_operations codec_list_fops = { - .open = codec_list_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int dai_list_seq_show(struct seq_file *m, void *v) +static int dai_list_show(struct seq_file *m, void *v) { struct snd_soc_component *component; struct snd_soc_dai *dai; @@ -390,20 +379,9 @@ static int dai_list_seq_show(struct seq_file *m, void *v) return 0; } +DEFINE_SHOW_ATTRIBUTE(dai_list); -static int dai_list_seq_open(struct inode *inode, struct file *file) -{ - return single_open(file, dai_list_seq_show, NULL); -} - -static const struct file_operations dai_list_fops = { - .open = dai_list_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int platform_list_seq_show(struct seq_file *m, void *v) +static int platform_list_show(struct seq_file *m, void *v) { struct snd_soc_platform *platform; @@ -416,18 +394,7 @@ static int platform_list_seq_show(struct seq_file *m, void *v) return 0; } - -static int platform_list_seq_open(struct inode *inode, struct file *file) -{ - return single_open(file, platform_list_seq_show, NULL); -} - -static const struct file_operations platform_list_fops = { - .open = platform_list_seq_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; +DEFINE_SHOW_ATTRIBUTE(platform_list); static void soc_init_card_debugfs(struct snd_soc_card *card) { @@ -1100,8 +1067,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card, cpu_dai_component.dai_name = dai_link->cpu_dai_name; rtd->cpu_dai = snd_soc_find_dai(&cpu_dai_component); if (!rtd->cpu_dai) { - dev_err(card->dev, "ASoC: CPU DAI %s not registered\n", - dai_link->cpu_dai_name); + dev_info(card->dev, "ASoC: CPU DAI %s not registered\n", + dai_link->cpu_dai_name); goto _err_defer; } snd_soc_rtdcom_add(rtd, rtd->cpu_dai->component); @@ -1162,11 +1129,6 @@ static int soc_bind_dai_link(struct snd_soc_card *card, rtd->platform = platform; } - if (!rtd->platform) { - dev_err(card->dev, "ASoC: platform %s not registered\n", - dai_link->platform_name); - goto _err_defer; - } soc_add_pcm_runtime(card, rtd); return 0; @@ -1624,22 +1586,21 @@ static int soc_probe_link_components(struct snd_soc_card *card, static int soc_probe_dai(struct snd_soc_dai *dai, int order) { - int ret; + if (dai->probed || + dai->driver->probe_order != order) + return 0; - if (!dai->probed && dai->driver->probe_order == order) { - if (dai->driver->probe) { - ret = dai->driver->probe(dai); - if (ret < 0) { - dev_err(dai->dev, - "ASoC: failed to probe DAI %s: %d\n", - dai->name, ret); - return ret; - } + if (dai->driver->probe) { + int ret = dai->driver->probe(dai); + if (ret < 0) { + dev_err(dai->dev, "ASoC: failed to probe DAI %s: %d\n", + dai->name, ret); + return ret; } - - dai->probed = 1; } + dai->probed = 1; + return 0; } @@ -3459,7 +3420,6 @@ int snd_soc_add_component(struct device *dev, err_cleanup: snd_soc_component_cleanup(component); err_free: - kfree(component); return ret; } EXPORT_SYMBOL_GPL(snd_soc_add_component); @@ -3471,7 +3431,7 @@ int snd_soc_register_component(struct device *dev, { struct snd_soc_component *component; - component = kzalloc(sizeof(*component), GFP_KERNEL); + component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL); if (!component) return -ENOMEM; @@ -3506,7 +3466,6 @@ static int __snd_soc_unregister_component(struct device *dev) if (found) { snd_soc_component_cleanup(component); - kfree(component); } return found; @@ -4398,6 +4357,26 @@ int snd_soc_of_get_dai_name(struct device_node *of_node, EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name); /* + * snd_soc_of_put_dai_link_codecs - Dereference device nodes in the codecs array + * @dai_link: DAI link + * + * Dereference device nodes acquired by snd_soc_of_get_dai_link_codecs(). + */ +void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link) +{ + struct snd_soc_dai_link_component *component = dai_link->codecs; + int index; + + for (index = 0; index < dai_link->num_codecs; index++, component++) { + if (!component->of_node) + break; + of_node_put(component->of_node); + component->of_node = NULL; + } +} +EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_codecs); + +/* * snd_soc_of_get_dai_link_codecs - Parse a list of CODECs in the devicetree * @dev: Card device * @of_node: Device node @@ -4406,7 +4385,8 @@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name); * Builds an array of CODEC DAI components from the DAI link property * 'sound-dai'. * The array is set in the DAI link and the number of DAIs is set accordingly. - * The device nodes in the array (of_node) must be dereferenced by the caller. + * The device nodes in the array (of_node) must be dereferenced by calling + * snd_soc_of_put_dai_link_codecs() on @dai_link. * * Returns 0 for success */ @@ -4454,14 +4434,7 @@ int snd_soc_of_get_dai_link_codecs(struct device *dev, } return 0; err: - for (index = 0, component = dai_link->codecs; - index < dai_link->num_codecs; - index++, component++) { - if (!component->of_node) - break; - of_node_put(component->of_node); - component->of_node = NULL; - } + snd_soc_of_put_dai_link_codecs(dai_link); dai_link->codecs = NULL; dai_link->num_codecs = 0; return ret; diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 92894d9cac19..2d9709104ec5 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -35,6 +35,7 @@ #include <linux/debugfs.h> #include <linux/pm_runtime.h> #include <linux/regulator/consumer.h> +#include <linux/pinctrl/consumer.h> #include <linux/clk.h> #include <linux/slab.h> #include <sound/core.h> @@ -72,6 +73,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, static int dapm_up_seq[] = { [snd_soc_dapm_pre] = 0, [snd_soc_dapm_regulator_supply] = 1, + [snd_soc_dapm_pinctrl] = 1, [snd_soc_dapm_clock_supply] = 1, [snd_soc_dapm_supply] = 2, [snd_soc_dapm_micbias] = 3, @@ -121,6 +123,7 @@ static int dapm_down_seq[] = { [snd_soc_dapm_dai_link] = 11, [snd_soc_dapm_supply] = 12, [snd_soc_dapm_clock_supply] = 13, + [snd_soc_dapm_pinctrl] = 13, [snd_soc_dapm_regulator_supply] = 13, [snd_soc_dapm_post] = 14, }; @@ -1290,6 +1293,31 @@ int dapm_regulator_event(struct snd_soc_dapm_widget *w, EXPORT_SYMBOL_GPL(dapm_regulator_event); /* + * Handler for pinctrl widget. + */ +int dapm_pinctrl_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) +{ + struct snd_soc_dapm_pinctrl_priv *priv = w->priv; + struct pinctrl *p = w->pinctrl; + struct pinctrl_state *s; + + if (!p || !priv) + return -EIO; + + if (SND_SOC_DAPM_EVENT_ON(event)) + s = pinctrl_lookup_state(p, priv->active_state); + else + s = pinctrl_lookup_state(p, priv->sleep_state); + + if (IS_ERR(s)) + return PTR_ERR(s); + + return pinctrl_select_state(p, s); +} +EXPORT_SYMBOL_GPL(dapm_pinctrl_event); + +/* * Handler for clock supply widget. */ int dapm_clock_event(struct snd_soc_dapm_widget *w, @@ -1902,6 +1930,7 @@ static int dapm_power_widgets(struct snd_soc_card *card, int event) break; case snd_soc_dapm_supply: case snd_soc_dapm_regulator_supply: + case snd_soc_dapm_pinctrl: case snd_soc_dapm_clock_supply: case snd_soc_dapm_micbias: if (d->target_bias_level < SND_SOC_BIAS_STANDBY) @@ -2315,6 +2344,7 @@ static ssize_t dapm_widget_show_component(struct snd_soc_component *cmpnt, case snd_soc_dapm_mixer_named_ctl: case snd_soc_dapm_supply: case snd_soc_dapm_regulator_supply: + case snd_soc_dapm_pinctrl: case snd_soc_dapm_clock_supply: if (w->name) count += sprintf(buf + count, "%s: %s\n", @@ -3165,7 +3195,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, unsigned int invert = mc->invert; unsigned int val, rval = 0; int connect, rconnect = -1, change, reg_change = 0; - struct snd_soc_dapm_update update = { NULL }; + struct snd_soc_dapm_update update = {}; int ret = 0; val = (ucontrol->value.integer.value[0] & mask); @@ -3292,7 +3322,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, unsigned int *item = ucontrol->value.enumerated.item; unsigned int val, change, reg_change = 0; unsigned int mask; - struct snd_soc_dapm_update update = { NULL }; + struct snd_soc_dapm_update update = {}; int ret = 0; if (item[0] >= e->items) @@ -3464,6 +3494,17 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, w->name, ret); } break; + case snd_soc_dapm_pinctrl: + w->pinctrl = devm_pinctrl_get(dapm->dev); + if (IS_ERR_OR_NULL(w->pinctrl)) { + ret = PTR_ERR(w->pinctrl); + if (ret == -EPROBE_DEFER) + return ERR_PTR(ret); + dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n", + w->name, ret); + return NULL; + } + break; case snd_soc_dapm_clock_supply: #ifdef CONFIG_CLKDEV_LOOKUP w->clk = devm_clk_get(dapm->dev, w->name); @@ -3543,6 +3584,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm, break; case snd_soc_dapm_supply: case snd_soc_dapm_regulator_supply: + case snd_soc_dapm_pinctrl: case snd_soc_dapm_clock_supply: case snd_soc_dapm_kcontrol: w->is_supply = 1; diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c index d53786498b61..56a541b9ff9e 100644 --- a/sound/soc/soc-generic-dmaengine-pcm.c +++ b/sound/soc/soc-generic-dmaengine-pcm.c @@ -33,13 +33,13 @@ struct dmaengine_pcm { struct dma_chan *chan[SNDRV_PCM_STREAM_LAST + 1]; const struct snd_dmaengine_pcm_config *config; - struct snd_soc_platform platform; + struct snd_soc_component component; unsigned int flags; }; -static struct dmaengine_pcm *soc_platform_to_pcm(struct snd_soc_platform *p) +static struct dmaengine_pcm *soc_component_to_pcm(struct snd_soc_component *p) { - return container_of(p, struct dmaengine_pcm, platform); + return container_of(p, struct dmaengine_pcm, component); } static struct device *dmaengine_dma_dev(struct dmaengine_pcm *pcm, @@ -88,7 +88,9 @@ static int dmaengine_pcm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream); int (*prepare_slave_config)(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, @@ -119,7 +121,9 @@ static int dmaengine_pcm_hw_params(struct snd_pcm_substream *substream, static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); struct device *dma_dev = dmaengine_dma_dev(pcm, substream); struct dma_chan *chan = pcm->chan[substream->stream]; struct snd_dmaengine_dai_dma_data *dma_data; @@ -128,7 +132,8 @@ static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substrea u32 addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); - int i, ret; + snd_pcm_format_t i; + int ret; if (pcm->config && pcm->config->pcm_hardware) return snd_soc_set_runtime_hwparams(substream, @@ -178,7 +183,7 @@ static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substrea * default assumption is that it supports 1, 2 and 4 bytes * widths. */ - for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { + for (i = SNDRV_PCM_FORMAT_FIRST; i <= SNDRV_PCM_FORMAT_LAST; i++) { int bits = snd_pcm_format_physical_width(i); /* @@ -206,7 +211,9 @@ static int dmaengine_pcm_set_runtime_hwparams(struct snd_pcm_substream *substrea static int dmaengine_pcm_open(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); struct dma_chan *chan = pcm->chan[substream->stream]; int ret; @@ -221,7 +228,9 @@ static struct dma_chan *dmaengine_pcm_compat_request_channel( struct snd_soc_pcm_runtime *rtd, struct snd_pcm_substream *substream) { - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); struct snd_dmaengine_dai_dma_data *dma_data; dma_filter_fn fn = NULL; @@ -260,9 +269,11 @@ static bool dmaengine_pcm_can_report_residue(struct device *dev, static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd) { - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); const struct snd_dmaengine_pcm_config *config = pcm->config; - struct device *dev = rtd->platform->dev; + struct device *dev = component->dev; struct snd_dmaengine_dai_dma_data *dma_data; struct snd_pcm_substream *substream; size_t prealloc_buffer_size; @@ -296,7 +307,7 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd) } if (!pcm->chan[i]) { - dev_err(rtd->platform->dev, + dev_err(component->dev, "Missing dma channel for stream: %d\n", i); return -EINVAL; } @@ -320,7 +331,9 @@ static snd_pcm_uframes_t dmaengine_pcm_pointer( struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = substream->private_data; - struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); if (pcm->flags & SND_DMAENGINE_PCM_FLAG_NO_RESIDUE) return snd_dmaengine_pcm_pointer_no_residue(substream); @@ -328,6 +341,41 @@ static snd_pcm_uframes_t dmaengine_pcm_pointer( return snd_dmaengine_pcm_pointer(substream); } +static int dmaengine_copy_user(struct snd_pcm_substream *substream, + int channel, unsigned long hwoff, + void *buf, unsigned long bytes) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component = + snd_soc_rtdcom_lookup(rtd, SND_DMAENGINE_PCM_DRV_NAME); + struct snd_pcm_runtime *runtime = substream->runtime; + struct dmaengine_pcm *pcm = soc_component_to_pcm(component); + int (*process)(struct snd_pcm_substream *substream, + int channel, unsigned long hwoff, + void *buf, unsigned long bytes) = pcm->config->process; + bool is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; + void *dma_ptr = runtime->dma_area + hwoff + + channel * (runtime->dma_bytes / runtime->channels); + int ret; + + if (is_playback) + if (copy_from_user(dma_ptr, (void __user *)buf, bytes)) + return -EFAULT; + + if (process) { + ret = process(substream, channel, hwoff, + (void __user *)buf, bytes); + if (ret < 0) + return ret; + } + + if (!is_playback) + if (copy_to_user((void __user *)buf, dma_ptr, bytes)) + return -EFAULT; + + return 0; +} + static const struct snd_pcm_ops dmaengine_pcm_ops = { .open = dmaengine_pcm_open, .close = snd_dmaengine_pcm_close, @@ -338,14 +386,31 @@ static const struct snd_pcm_ops dmaengine_pcm_ops = { .pointer = dmaengine_pcm_pointer, }; -static const struct snd_soc_platform_driver dmaengine_pcm_platform = { - .component_driver = { - .probe_order = SND_SOC_COMP_ORDER_LATE, - }, +static const struct snd_pcm_ops dmaengine_pcm_process_ops = { + .open = dmaengine_pcm_open, + .close = snd_dmaengine_pcm_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = dmaengine_pcm_hw_params, + .hw_free = snd_pcm_lib_free_pages, + .trigger = snd_dmaengine_pcm_trigger, + .pointer = dmaengine_pcm_pointer, + .copy_user = dmaengine_copy_user, +}; + +static const struct snd_soc_component_driver dmaengine_pcm_component = { + .name = SND_DMAENGINE_PCM_DRV_NAME, + .probe_order = SND_SOC_COMP_ORDER_LATE, .ops = &dmaengine_pcm_ops, .pcm_new = dmaengine_pcm_new, }; +static const struct snd_soc_component_driver dmaengine_pcm_component_process = { + .name = SND_DMAENGINE_PCM_DRV_NAME, + .probe_order = SND_SOC_COMP_ORDER_LATE, + .ops = &dmaengine_pcm_process_ops, + .pcm_new = dmaengine_pcm_new, +}; + static const char * const dmaengine_pcm_dma_channel_names[] = { [SNDRV_PCM_STREAM_PLAYBACK] = "tx", [SNDRV_PCM_STREAM_CAPTURE] = "rx", @@ -431,6 +496,9 @@ int snd_dmaengine_pcm_register(struct device *dev, if (!pcm) return -ENOMEM; +#ifdef CONFIG_DEBUG_FS + pcm->component.debugfs_prefix = "dma"; +#endif pcm->config = config; pcm->flags = flags; @@ -438,8 +506,13 @@ int snd_dmaengine_pcm_register(struct device *dev, if (ret) goto err_free_dma; - ret = snd_soc_add_platform(dev, &pcm->platform, - &dmaengine_pcm_platform); + if (config && config->process) + ret = snd_soc_add_component(dev, &pcm->component, + &dmaengine_pcm_component_process, + NULL, 0); + else + ret = snd_soc_add_component(dev, &pcm->component, + &dmaengine_pcm_component, NULL, 0); if (ret) goto err_free_dma; @@ -461,16 +534,16 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_register); */ void snd_dmaengine_pcm_unregister(struct device *dev) { - struct snd_soc_platform *platform; + struct snd_soc_component *component; struct dmaengine_pcm *pcm; - platform = snd_soc_lookup_platform(dev); - if (!platform) + component = snd_soc_lookup_component(dev, SND_DMAENGINE_PCM_DRV_NAME); + if (!component) return; - pcm = soc_platform_to_pcm(platform); + pcm = soc_component_to_pcm(component); - snd_soc_remove_platform(platform); + snd_soc_unregister_component(dev); dmaengine_pcm_release_chan(pcm); kfree(pcm); } diff --git a/sound/soc/soc-io.c b/sound/soc/soc-io.c index 2bc1c4c17896..d36a192fbece 100644 --- a/sound/soc/soc-io.c +++ b/sound/soc/soc-io.c @@ -88,19 +88,16 @@ static int snd_soc_component_update_bits_legacy( unsigned int old, new; int ret; - if (!component->read || !component->write) - return -EIO; - mutex_lock(&component->io_mutex); - ret = component->read(component, reg, &old); + ret = snd_soc_component_read(component, reg, &old); if (ret < 0) goto out_unlock; new = (old & ~mask) | (val & mask); *change = old != new; if (*change) - ret = component->write(component, reg, new); + ret = snd_soc_component_write(component, reg, new); out_unlock: mutex_unlock(&component->io_mutex); diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 084125463d10..68d9dc930096 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -1392,12 +1392,18 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card, struct snd_soc_pcm_runtime *be; int i; + dev_dbg(card->dev, "ASoC: find BE for widget %s\n", widget->name); + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { list_for_each_entry(be, &card->rtd_list, list) { if (!be->dai_link->no_pcm) continue; + dev_dbg(card->dev, "ASoC: try BE : %s\n", + be->cpu_dai->playback_widget ? + be->cpu_dai->playback_widget->name : "(not set)"); + if (be->cpu_dai->playback_widget == widget) return be; @@ -1414,6 +1420,10 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card, if (!be->dai_link->no_pcm) continue; + dev_dbg(card->dev, "ASoC: try BE %s\n", + be->cpu_dai->capture_widget ? + be->cpu_dai->capture_widget->name : "(not set)"); + if (be->cpu_dai->capture_widget == widget) return be; @@ -1425,6 +1435,7 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card, } } + /* dai link name and stream name set correctly ? */ dev_err(card->dev, "ASoC: can't get %s BE for %s\n", stream ? "capture" : "playback", widget->name); return NULL; diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 01a50413c66f..fa27d0fca6dc 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -504,6 +504,9 @@ static void remove_widget(struct snd_soc_component *comp, if (dobj->ops && dobj->ops->widget_unload) dobj->ops->widget_unload(comp, dobj); + if (!w->kcontrols) + goto free_news; + /* * Dynamic Widgets either have 1..N enum kcontrols or mixers. * The enum may either have an array of values or strings. @@ -523,8 +526,8 @@ static void remove_widget(struct snd_soc_component *comp, kfree(se->dobj.control.dtexts[j]); kfree(se); + kfree(w->kcontrol_news[i].name); } - kfree(w->kcontrol_news); } else { /* volume mixer or bytes controls */ for (i = 0; i < w->num_kcontrols; i++) { @@ -540,9 +543,13 @@ static void remove_widget(struct snd_soc_component *comp, */ kfree((void *)kcontrol->private_value); snd_ctl_remove(card, kcontrol); + kfree(w->kcontrol_news[i].name); } - kfree(w->kcontrol_news); } + +free_news: + kfree(w->kcontrol_news); + /* widget w is freed by soc-dapm.c */ } @@ -1233,7 +1240,9 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create( dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n", mc->hdr.name, i); - kc[i].name = mc->hdr.name; + kc[i].name = kstrdup(mc->hdr.name, GFP_KERNEL); + if (kc[i].name == NULL) + goto err_str; kc[i].private_value = (long)sm; kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc[i].access = mc->hdr.access; @@ -1272,14 +1281,19 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create( kfree(sm); continue; } + + /* create any TLV data */ + soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr); } return kc; err_str: kfree(sm); err: - for (--i; i >= 0; i--) + for (--i; i >= 0; i--) { kfree((void *)kc[i].private_value); + kfree(kc[i].name); + } kfree(kc); return NULL; } @@ -1310,7 +1324,9 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create( dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", ec->hdr.name); - kc[i].name = ec->hdr.name; + kc[i].name = kstrdup(ec->hdr.name, GFP_KERNEL); + if (kc[i].name == NULL) + goto err_se; kc[i].private_value = (long)se; kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc[i].access = ec->hdr.access; @@ -1386,6 +1402,7 @@ err_se: kfree(se->dobj.control.dtexts[j]); kfree(se); + kfree(kc[i].name); } err: kfree(kc); @@ -1424,7 +1441,9 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create( "ASoC: adding bytes kcontrol %s with access 0x%x\n", be->hdr.name, be->hdr.access); - kc[i].name = be->hdr.name; + kc[i].name = kstrdup(be->hdr.name, GFP_KERNEL); + if (kc[i].name == NULL) + goto err; kc[i].private_value = (long)sbe; kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER; kc[i].access = be->hdr.access; @@ -1454,8 +1473,10 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create( return kc; err: - for (--i; i >= 0; i--) + for (--i; i >= 0; i--) { kfree((void *)kc[i].private_value); + kfree(kc[i].name); + } kfree(kc); return NULL; diff --git a/sound/soc/soc-utils.c b/sound/soc/soc-utils.c index bcd3da2739e2..2d9e98bd1530 100644 --- a/sound/soc/soc-utils.c +++ b/sound/soc/soc-utils.c @@ -284,11 +284,16 @@ static const struct snd_pcm_ops dummy_dma_ops = { .ioctl = snd_pcm_lib_ioctl, }; -static const struct snd_soc_platform_driver dummy_platform = { +static const struct snd_soc_component_driver dummy_platform = { .ops = &dummy_dma_ops, }; -static const struct snd_soc_codec_driver dummy_codec; +static const struct snd_soc_component_driver dummy_codec = { + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, +}; #define STUB_RATES SNDRV_PCM_RATE_8000_192000 #define STUB_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ @@ -338,33 +343,22 @@ static int snd_soc_dummy_probe(struct platform_device *pdev) { int ret; - ret = snd_soc_register_codec(&pdev->dev, &dummy_codec, &dummy_dai, 1); + ret = devm_snd_soc_register_component(&pdev->dev, + &dummy_codec, &dummy_dai, 1); if (ret < 0) return ret; - ret = snd_soc_register_platform(&pdev->dev, &dummy_platform); - if (ret < 0) { - snd_soc_unregister_codec(&pdev->dev); - return ret; - } + ret = devm_snd_soc_register_component(&pdev->dev, &dummy_platform, + NULL, 0); return ret; } -static int snd_soc_dummy_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); - - return 0; -} - static struct platform_driver soc_dummy_driver = { .driver = { .name = "snd-soc-dummy", }, .probe = snd_soc_dummy_probe, - .remove = snd_soc_dummy_remove, }; static struct platform_device *soc_dummy_dev; diff --git a/sound/soc/stm/stm32_adfsdm.c b/sound/soc/stm/stm32_adfsdm.c index 7306e3eca9e1..db73fef3e500 100644 --- a/sound/soc/stm/stm32_adfsdm.c +++ b/sound/soc/stm/stm32_adfsdm.c @@ -281,7 +281,7 @@ static void stm32_adfsdm_pcm_free(struct snd_pcm *pcm) } } -static struct snd_soc_platform_driver stm32_adfsdm_soc_platform = { +static struct snd_soc_component_driver stm32_adfsdm_soc_platform = { .ops = &stm32_adfsdm_pcm_ops, .pcm_new = stm32_adfsdm_pcm_new, .pcm_free = stm32_adfsdm_pcm_free, @@ -322,8 +322,9 @@ static int stm32_adfsdm_probe(struct platform_device *pdev) if (IS_ERR(priv->iio_cb)) return PTR_ERR(priv->iio_cb); - ret = devm_snd_soc_register_platform(&pdev->dev, - &stm32_adfsdm_soc_platform); + ret = devm_snd_soc_register_component(&pdev->dev, + &stm32_adfsdm_soc_platform, + NULL, 0); if (ret < 0) dev_err(&pdev->dev, "%s: Failed to register PCM platform\n", __func__); diff --git a/sound/soc/stm/stm32_sai.c b/sound/soc/stm/stm32_sai.c index d743b7dd52fb..f22654253c43 100644 --- a/sound/soc/stm/stm32_sai.c +++ b/sound/soc/stm/stm32_sai.c @@ -30,10 +30,12 @@ static const struct stm32_sai_conf stm32_sai_conf_f4 = { .version = SAI_STM32F4, + .has_spdif = false, }; static const struct stm32_sai_conf stm32_sai_conf_h7 = { .version = SAI_STM32H7, + .has_spdif = true, }; static const struct of_device_id stm32_sai_ids[] = { diff --git a/sound/soc/stm/stm32_sai.h b/sound/soc/stm/stm32_sai.h index bb062e70de63..f25422174909 100644 --- a/sound/soc/stm/stm32_sai.h +++ b/sound/soc/stm/stm32_sai.h @@ -248,9 +248,11 @@ enum stm32_sai_version { /** * struct stm32_sai_conf - SAI configuration * @version: SAI version + * @has_spdif: SAI S/PDIF support flag */ struct stm32_sai_conf { int version; + bool has_spdif; }; /** diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c index 08583b958430..cfeb219e1d78 100644 --- a/sound/soc/stm/stm32_sai_sub.c +++ b/sound/soc/stm/stm32_sai_sub.c @@ -23,6 +23,7 @@ #include <linux/of_platform.h> #include <linux/regmap.h> +#include <sound/asoundef.h> #include <sound/core.h> #include <sound/dmaengine_pcm.h> #include <sound/pcm_params.h> @@ -30,6 +31,7 @@ #include "stm32_sai.h" #define SAI_FREE_PROTOCOL 0x0 +#define SAI_SPDIF_PROTOCOL 0x1 #define SAI_SLOT_SIZE_AUTO 0x0 #define SAI_SLOT_SIZE_16 0x1 @@ -59,8 +61,13 @@ #define SAI_SYNC_INTERNAL 0x1 #define SAI_SYNC_EXTERNAL 0x2 +#define STM_SAI_PROTOCOL_IS_SPDIF(ip) ((ip)->spdif) +#define STM_SAI_HAS_SPDIF(x) ((x)->pdata->conf->has_spdif) #define STM_SAI_HAS_EXT_SYNC(x) (!STM_SAI_IS_F4(sai->pdata)) +#define SAI_IEC60958_BLOCK_FRAMES 192 +#define SAI_IEC60958_STATUS_BYTES 24 + /** * struct stm32_sai_sub_data - private data of SAI sub block (block A or B) * @pdev: device data pointer @@ -78,6 +85,7 @@ * @id: SAI sub block id corresponding to sub-block A or B * @dir: SAI block direction (playback or capture). set at init * @master: SAI block mode flag. (true=master, false=slave) set at init + * @spdif: SAI S/PDIF iec60958 mode flag. set at init * @fmt: SAI block format. relevant only for custom protocols. set at init * @sync: SAI block synchronization mode. (none, internal or external) * @synco: SAI block ext sync source (provider setting). (none, sub-block A/B) @@ -87,6 +95,8 @@ * @slot_width: rx or tx slot width in bits * @slot_mask: rx or tx active slots mask. set at init or at runtime * @data_size: PCM data width. corresponds to PCM substream width. + * @spdif_frm_cnt: S/PDIF playback frame counter + * @spdif_status_bits: S/PDIF status bits */ struct stm32_sai_sub_data { struct platform_device *pdev; @@ -104,6 +114,7 @@ struct stm32_sai_sub_data { unsigned int id; int dir; bool master; + bool spdif; int fmt; int sync; int synco; @@ -113,6 +124,8 @@ struct stm32_sai_sub_data { int slot_width; int slot_mask; int data_size; + unsigned int spdif_frm_cnt; + unsigned char spdif_status_bits[SAI_IEC60958_STATUS_BYTES]; }; enum stm32_sai_fifo_th { @@ -171,6 +184,10 @@ static bool stm32_sai_sub_writeable_reg(struct device *dev, unsigned int reg) } } +static const unsigned char default_status_bits[SAI_IEC60958_STATUS_BYTES] = { + 0, 0, 0, IEC958_AES3_CON_FS_48000, +}; + static const struct regmap_config stm32_sai_sub_regmap_config_f4 = { .reg_bits = 32, .reg_stride = 4, @@ -277,6 +294,11 @@ static int stm32_sai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai); int slotr, slotr_mask, slot_size; + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { + dev_warn(cpu_dai->dev, "Slot setting relevant only for TDM\n"); + return 0; + } + dev_dbg(cpu_dai->dev, "Masks tx/rx:%#x/%#x, slots:%d, width:%d\n", tx_mask, rx_mask, slots, slot_width); @@ -326,8 +348,17 @@ static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) dev_dbg(cpu_dai->dev, "fmt %x\n", fmt); - cr1_mask = SAI_XCR1_PRTCFG_MASK; - cr1 = SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL); + /* Do not generate master by default */ + cr1 = SAI_XCR1_NODIV; + cr1_mask = SAI_XCR1_NODIV; + + cr1_mask |= SAI_XCR1_PRTCFG_MASK; + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { + cr1 |= SAI_XCR1_PRTCFG_SET(SAI_SPDIF_PROTOCOL); + goto conf_update; + } + + cr1 |= SAI_XCR1_PRTCFG_SET(SAI_FREE_PROTOCOL); switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { /* SCK active high for all protocols */ @@ -409,10 +440,7 @@ static int stm32_sai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) cr1_mask |= SAI_XCR1_SLAVE; - /* do not generate master by default */ - cr1 |= SAI_XCR1_NODIV; - cr1_mask |= SAI_XCR1_NODIV; - +conf_update: ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, cr1_mask, cr1); if (ret < 0) { dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); @@ -478,6 +506,12 @@ static int stm32_sai_set_config(struct snd_soc_dai *cpu_dai, SAI_XCR2_FFLUSH | SAI_XCR2_FTH_SET(STM_SAI_FIFO_TH_HALF)); + /* DS bits in CR1 not set for SPDIF (size forced to 24 bits).*/ + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { + sai->spdif_frm_cnt = 0; + return 0; + } + /* Mode, data format and channel config */ cr1_mask = SAI_XCR1_DS_MASK; switch (params_format(params)) { @@ -592,13 +626,14 @@ static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai, int cr1, mask, div = 0; int sai_clk_rate, mclk_ratio, den, ret; int version = sai->pdata->conf->version; + unsigned int rate = params_rate(params); if (!sai->mclk_rate) { dev_err(cpu_dai->dev, "Mclk rate is null\n"); return -EINVAL; } - if (!(params_rate(params) % 11025)) + if (!(rate % 11025)) clk_set_parent(sai->sai_ck, sai->pdata->clk_x11k); else clk_set_parent(sai->sai_ck, sai->pdata->clk_x8k); @@ -623,24 +658,28 @@ static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai, * MCKDIV = sai_ck / (frl x ws) (NOMCK=1) * Note: NOMCK/NODIV correspond to same bit. */ - if (sai->mclk_rate) { - mclk_ratio = sai->mclk_rate / params_rate(params); - if (mclk_ratio != 256) { + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) { + div = DIV_ROUND_CLOSEST(sai_clk_rate, + (params_rate(params) * 128)); + } else { + if (sai->mclk_rate) { + mclk_ratio = sai->mclk_rate / rate; if (mclk_ratio == 512) { mask = SAI_XCR1_OSR; cr1 = SAI_XCR1_OSR; - } else { + } else if (mclk_ratio != 256) { dev_err(cpu_dai->dev, "Wrong mclk ratio %d\n", mclk_ratio); return -EINVAL; } + div = DIV_ROUND_CLOSEST(sai_clk_rate, + sai->mclk_rate); + } else { + /* mclk-fs not set, master clock not active */ + den = sai->fs_length * params_rate(params); + div = DIV_ROUND_CLOSEST(sai_clk_rate, den); } - div = DIV_ROUND_CLOSEST(sai_clk_rate, sai->mclk_rate); - } else { - /* mclk-fs not set, master clock not active. NOMCK=1 */ - den = sai->fs_length * params_rate(params); - div = DIV_ROUND_CLOSEST(sai_clk_rate, den); } } @@ -670,10 +709,12 @@ static int stm32_sai_hw_params(struct snd_pcm_substream *substream, sai->data_size = params_width(params); - ret = stm32_sai_set_slots(cpu_dai); - if (ret < 0) - return ret; - stm32_sai_set_frame(cpu_dai); + if (!STM_SAI_PROTOCOL_IS_SPDIF(sai)) { + ret = stm32_sai_set_slots(cpu_dai); + if (ret < 0) + return ret; + stm32_sai_set_frame(cpu_dai); + } ret = stm32_sai_set_config(cpu_dai, substream, params); if (ret) @@ -723,6 +764,9 @@ static int stm32_sai_trigger(struct snd_pcm_substream *substream, int cmd, (unsigned int)~SAI_XCR1_DMAEN); if (ret < 0) dev_err(cpu_dai->dev, "Failed to update CR1 register\n"); + + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) + sai->spdif_frm_cnt = 0; break; default: return -EINVAL; @@ -776,6 +820,10 @@ static int stm32_sai_dai_probe(struct snd_soc_dai *cpu_dai) sai->synco, sai->synci); } + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) + memcpy(sai->spdif_status_bits, default_status_bits, + sizeof(default_status_bits)); + cr1_mask |= SAI_XCR1_SYNCEN_MASK; cr1 |= SAI_XCR1_SYNCEN_SET(sai->sync); @@ -792,6 +840,42 @@ static const struct snd_soc_dai_ops stm32_sai_pcm_dai_ops = { .shutdown = stm32_sai_shutdown, }; +static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream, + int channel, unsigned long hwoff, + void *buf, unsigned long bytes) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct stm32_sai_sub_data *sai = dev_get_drvdata(cpu_dai->dev); + int *ptr = (int *)(runtime->dma_area + hwoff + + channel * (runtime->dma_bytes / runtime->channels)); + ssize_t cnt = bytes_to_samples(runtime, bytes); + unsigned int frm_cnt = sai->spdif_frm_cnt; + unsigned int byte; + unsigned int mask; + + do { + *ptr = ((*ptr >> 8) & 0x00ffffff); + + /* Set channel status bit */ + byte = frm_cnt >> 3; + mask = 1 << (frm_cnt - (byte << 3)); + if (sai->spdif_status_bits[byte] & mask) + *ptr |= 0x04000000; + ptr++; + + if (!(cnt % 2)) + frm_cnt++; + + if (frm_cnt == SAI_IEC60958_BLOCK_FRAMES) + frm_cnt = 0; + } while (--cnt); + sai->spdif_frm_cnt = frm_cnt; + + return 0; +} + static const struct snd_pcm_hardware stm32_sai_pcm_hw = { .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP, .buffer_bytes_max = 8 * PAGE_SIZE, @@ -842,8 +926,14 @@ static struct snd_soc_dai_driver stm32_sai_capture_dai[] = { }; static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = { - .pcm_hardware = &stm32_sai_pcm_hw, - .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, + .pcm_hardware = &stm32_sai_pcm_hw, + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, +}; + +static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = { + .pcm_hardware = &stm32_sai_pcm_hw, + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, + .process = stm32_sai_pcm_process_spdif, }; static const struct snd_soc_component_driver stm32_component = { @@ -900,6 +990,18 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev, return -EINVAL; } + /* Get spdif iec60958 property */ + sai->spdif = false; + if (of_get_property(np, "st,iec60958", NULL)) { + if (!STM_SAI_HAS_SPDIF(sai) || + sai->dir == SNDRV_PCM_STREAM_CAPTURE) { + dev_err(&pdev->dev, "S/PDIF IEC60958 not supported\n"); + return -EINVAL; + } + sai->spdif = true; + sai->master = true; + } + /* Get synchronization property */ args.np = NULL; ret = of_parse_phandle_with_fixed_args(np, "st,sync", 1, 0, &args); @@ -999,6 +1101,7 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) { struct stm32_sai_sub_data *sai; const struct of_device_id *of_id; + const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config; int ret; sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL); @@ -1039,8 +1142,10 @@ static int stm32_sai_sub_probe(struct platform_device *pdev) if (ret) return ret; - ret = devm_snd_dmaengine_pcm_register(&pdev->dev, - &stm32_sai_pcm_config, 0); + if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) + conf = &stm32_sai_pcm_config_spdif; + + ret = devm_snd_dmaengine_pcm_register(&pdev->dev, conf, 0); if (ret) { dev_err(&pdev->dev, "Could not register pcm dma\n"); return ret; diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c index b9bdefcd3e10..373df4f24be1 100644 --- a/sound/soc/stm/stm32_spdifrx.c +++ b/sound/soc/stm/stm32_spdifrx.c @@ -819,7 +819,6 @@ static const struct snd_soc_dai_ops stm32_spdifrx_pcm_dai_ops = { static struct snd_soc_dai_driver stm32_spdifrx_dai[] = { { - .name = "spdifrx-capture-cpu-dai", .probe = stm32_spdifrx_dai_probe, .capture = { .stream_name = "CPU-Capture", @@ -858,8 +857,8 @@ static const struct of_device_id stm32_spdifrx_ids[] = { {} }; -static int stm_spdifrx_parse_of(struct platform_device *pdev, - struct stm32_spdifrx_data *spdifrx) +static int stm32_spdifrx_parse_of(struct platform_device *pdev, + struct stm32_spdifrx_data *spdifrx) { struct device_node *np = pdev->dev.of_node; const struct of_device_id *of_id; @@ -914,7 +913,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) platform_set_drvdata(pdev, spdifrx); - ret = stm_spdifrx_parse_of(pdev, spdifrx); + ret = stm32_spdifrx_parse_of(pdev, spdifrx); if (ret) return ret; diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c index 886281673972..9a3cb7704810 100644 --- a/sound/soc/sunxi/sun4i-codec.c +++ b/sound/soc/sunxi/sun4i-codec.c @@ -792,15 +792,17 @@ static const struct snd_soc_dapm_route sun4i_codec_codec_dapm_routes[] = { { "Mic1", NULL, "VMIC" }, }; -static const struct snd_soc_codec_driver sun4i_codec_codec = { - .component_driver = { - .controls = sun4i_codec_controls, - .num_controls = ARRAY_SIZE(sun4i_codec_controls), - .dapm_widgets = sun4i_codec_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets), - .dapm_routes = sun4i_codec_codec_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sun4i_codec_codec_dapm_routes), - }, +static const struct snd_soc_component_driver sun4i_codec_codec = { + .controls = sun4i_codec_controls, + .num_controls = ARRAY_SIZE(sun4i_codec_controls), + .dapm_widgets = sun4i_codec_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets), + .dapm_routes = sun4i_codec_codec_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sun4i_codec_codec_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /*** sun6i Codec ***/ @@ -1098,15 +1100,17 @@ static const struct snd_soc_dapm_route sun6i_codec_codec_dapm_routes[] = { { "Right ADC", NULL, "Right ADC Mixer" }, }; -static const struct snd_soc_codec_driver sun6i_codec_codec = { - .component_driver = { - .controls = sun6i_codec_codec_widgets, - .num_controls = ARRAY_SIZE(sun6i_codec_codec_widgets), - .dapm_widgets = sun6i_codec_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sun6i_codec_codec_dapm_widgets), - .dapm_routes = sun6i_codec_codec_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sun6i_codec_codec_dapm_routes), - }, +static const struct snd_soc_component_driver sun6i_codec_codec = { + .controls = sun6i_codec_codec_widgets, + .num_controls = ARRAY_SIZE(sun6i_codec_codec_widgets), + .dapm_widgets = sun6i_codec_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sun6i_codec_codec_dapm_widgets), + .dapm_routes = sun6i_codec_codec_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sun6i_codec_codec_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; /* sun8i A23 codec */ @@ -1126,13 +1130,15 @@ static const struct snd_soc_dapm_widget sun8i_a23_codec_codec_widgets[] = { }; -static const struct snd_soc_codec_driver sun8i_a23_codec_codec = { - .component_driver = { - .controls = sun8i_a23_codec_codec_controls, - .num_controls = ARRAY_SIZE(sun8i_a23_codec_codec_controls), - .dapm_widgets = sun8i_a23_codec_codec_widgets, - .num_dapm_widgets = ARRAY_SIZE(sun8i_a23_codec_codec_widgets), - }, +static const struct snd_soc_component_driver sun8i_a23_codec_codec = { + .controls = sun8i_a23_codec_codec_controls, + .num_controls = ARRAY_SIZE(sun8i_a23_codec_codec_controls), + .dapm_widgets = sun8i_a23_codec_codec_widgets, + .num_dapm_widgets = ARRAY_SIZE(sun8i_a23_codec_codec_widgets), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct snd_soc_component_driver sun4i_codec_component = { @@ -1450,7 +1456,7 @@ static const struct regmap_config sun8i_v3s_codec_regmap_config = { struct sun4i_codec_quirks { const struct regmap_config *regmap_config; - const struct snd_soc_codec_driver *codec; + const struct snd_soc_component_driver *codec; struct snd_soc_card * (*create_card)(struct device *dev); struct reg_field reg_adc_fifoc; /* used for regmap_field */ unsigned int reg_dac_txdata; /* TX FIFO offset for DMA config */ @@ -1657,7 +1663,7 @@ static int sun4i_codec_probe(struct platform_device *pdev) scodec->capture_dma_data.maxburst = 8; scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; - ret = snd_soc_register_codec(&pdev->dev, quirks->codec, + ret = devm_snd_soc_register_component(&pdev->dev, quirks->codec, &sun4i_codec_dai, 1); if (ret) { dev_err(&pdev->dev, "Failed to register our codec\n"); @@ -1669,20 +1675,20 @@ static int sun4i_codec_probe(struct platform_device *pdev) &dummy_cpu_dai, 1); if (ret) { dev_err(&pdev->dev, "Failed to register our DAI\n"); - goto err_unregister_codec; + goto err_assert_reset; } ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) { dev_err(&pdev->dev, "Failed to register against DMAEngine\n"); - goto err_unregister_codec; + goto err_assert_reset; } card = quirks->create_card(&pdev->dev); if (IS_ERR(card)) { ret = PTR_ERR(card); dev_err(&pdev->dev, "Failed to create our card\n"); - goto err_unregister_codec; + goto err_assert_reset; } snd_soc_card_set_drvdata(card, scodec); @@ -1690,13 +1696,11 @@ static int sun4i_codec_probe(struct platform_device *pdev) ret = snd_soc_register_card(card); if (ret) { dev_err(&pdev->dev, "Failed to register our card\n"); - goto err_unregister_codec; + goto err_assert_reset; } return 0; -err_unregister_codec: - snd_soc_unregister_codec(&pdev->dev); err_assert_reset: if (scodec->rst) reset_control_assert(scodec->rst); @@ -1711,7 +1715,6 @@ static int sun4i_codec_remove(struct platform_device *pdev) struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card); snd_soc_unregister_card(card); - snd_soc_unregister_codec(&pdev->dev); if (scodec->rst) reset_control_assert(scodec->rst); clk_disable_unprepare(scodec->clk_apb); diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index dca1143c1150..a4aa931ebfae 100644 --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -104,7 +104,7 @@ #define SUN8I_I2S_CHAN_CFG_REG 0x30 #define SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM_MASK GENMASK(6, 4) -#define SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM(chan) (chan - 1) +#define SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM(chan) ((chan - 1) << 4) #define SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK GENMASK(2, 0) #define SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM(chan) (chan - 1) diff --git a/sound/soc/sunxi/sun8i-codec.c b/sound/soc/sunxi/sun8i-codec.c index 7a15df924316..fb37dd927e33 100644 --- a/sound/soc/sunxi/sun8i-codec.c +++ b/sound/soc/sunxi/sun8i-codec.c @@ -184,7 +184,7 @@ static int sun8i_codec_get_hw_rate(struct snd_pcm_hw_params *params) static int sun8i_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { - struct sun8i_codec *scodec = snd_soc_codec_get_drvdata(dai->codec); + struct sun8i_codec *scodec = snd_soc_component_get_drvdata(dai->component); u32 value; /* clock masters */ @@ -304,7 +304,7 @@ static int sun8i_codec_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { - struct sun8i_codec *scodec = snd_soc_codec_get_drvdata(dai->codec); + struct sun8i_codec *scodec = snd_soc_component_get_drvdata(dai->component); int sample_rate; u8 bclk_div; @@ -500,13 +500,15 @@ static struct snd_soc_dai_driver sun8i_codec_dai = { .ops = &sun8i_codec_dai_ops, }; -static const struct snd_soc_codec_driver sun8i_soc_codec = { - .component_driver = { - .dapm_widgets = sun8i_codec_dapm_widgets, - .num_dapm_widgets = ARRAY_SIZE(sun8i_codec_dapm_widgets), - .dapm_routes = sun8i_codec_dapm_routes, - .num_dapm_routes = ARRAY_SIZE(sun8i_codec_dapm_routes), - }, +static const struct snd_soc_component_driver sun8i_soc_component = { + .dapm_widgets = sun8i_codec_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(sun8i_codec_dapm_widgets), + .dapm_routes = sun8i_codec_dapm_routes, + .num_dapm_routes = ARRAY_SIZE(sun8i_codec_dapm_routes), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static const struct regmap_config sun8i_codec_regmap_config = { @@ -566,7 +568,7 @@ static int sun8i_codec_probe(struct platform_device *pdev) goto err_pm_disable; } - ret = snd_soc_register_codec(&pdev->dev, &sun8i_soc_codec, + ret = devm_snd_soc_register_component(&pdev->dev, &sun8i_soc_component, &sun8i_codec_dai, 1); if (ret) { dev_err(&pdev->dev, "Failed to register codec\n"); @@ -594,7 +596,6 @@ static int sun8i_codec_remove(struct platform_device *pdev) if (!pm_runtime_status_suspended(&pdev->dev)) sun8i_codec_runtime_suspend(&pdev->dev); - snd_soc_unregister_codec(&pdev->dev); clk_disable_unprepare(scodec->clk_module); clk_disable_unprepare(scodec->clk_bus); diff --git a/sound/soc/txx9/txx9aclc.c b/sound/soc/txx9/txx9aclc.c index a2bb68fea5a3..8d31fe628e2f 100644 --- a/sound/soc/txx9/txx9aclc.c +++ b/sound/soc/txx9/txx9aclc.c @@ -23,6 +23,8 @@ #include <sound/soc.h> #include "txx9aclc.h" +#define DRV_NAME "txx9aclc" + static struct txx9aclc_soc_device { struct txx9aclc_dmadata dmadata[2]; } txx9aclc_soc_device; @@ -53,6 +55,7 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct txx9aclc_dmadata *dmadata = runtime->private_data; int ret; @@ -60,13 +63,13 @@ static int txx9aclc_pcm_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - dev_dbg(rtd->platform->dev, + dev_dbg(component->dev, "runtime->dma_area = %#lx dma_addr = %#lx dma_bytes = %zd " "runtime->min_align %ld\n", (unsigned long)runtime->dma_area, (unsigned long)runtime->dma_addr, runtime->dma_bytes, runtime->min_align); - dev_dbg(rtd->platform->dev, + dev_dbg(component->dev, "periods %d period_bytes %d stream %d\n", params_periods(params), params_period_bytes(params), substream->stream); @@ -287,7 +290,8 @@ static int txx9aclc_pcm_new(struct snd_soc_pcm_runtime *rtd) struct snd_card *card = rtd->card->snd_card; struct snd_soc_dai *dai = rtd->cpu_dai; struct snd_pcm *pcm = rtd->pcm; - struct platform_device *pdev = to_platform_device(rtd->platform->dev); + struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct platform_device *pdev = to_platform_device(component->dev); struct txx9aclc_soc_device *dev; struct resource *r; int i; @@ -371,15 +375,15 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev, return 0; } -static int txx9aclc_pcm_probe(struct snd_soc_platform *platform) +static int txx9aclc_pcm_probe(struct snd_soc_component *component) { - snd_soc_platform_set_drvdata(platform, &txx9aclc_soc_device); + snd_soc_component_set_drvdata(component, &txx9aclc_soc_device); return 0; } -static int txx9aclc_pcm_remove(struct snd_soc_platform *platform) +static void txx9aclc_pcm_remove(struct snd_soc_component *component) { - struct txx9aclc_soc_device *dev = snd_soc_platform_get_drvdata(platform); + struct txx9aclc_soc_device *dev = snd_soc_component_get_drvdata(component); struct txx9aclc_plat_drvdata *drvdata = txx9aclc_drvdata; void __iomem *base = drvdata->base; int i; @@ -400,10 +404,10 @@ static int txx9aclc_pcm_remove(struct snd_soc_platform *platform) } dev->dmadata[i].dma_chan = NULL; } - return 0; } -static const struct snd_soc_platform_driver txx9aclc_soc_platform = { +static const struct snd_soc_component_driver txx9aclc_soc_component = { + .name = DRV_NAME, .probe = txx9aclc_pcm_probe, .remove = txx9aclc_pcm_remove, .ops = &txx9aclc_pcm_ops, @@ -412,8 +416,8 @@ static const struct snd_soc_platform_driver txx9aclc_soc_platform = { static int txx9aclc_soc_platform_probe(struct platform_device *pdev) { - return devm_snd_soc_register_platform(&pdev->dev, - &txx9aclc_soc_platform); + return devm_snd_soc_register_component(&pdev->dev, + &txx9aclc_soc_component, NULL, 0); } static struct platform_driver txx9aclc_pcm_driver = { diff --git a/sound/soc/uniphier/Kconfig b/sound/soc/uniphier/Kconfig index 02886a457eaf..aa3592ee1358 100644 --- a/sound/soc/uniphier/Kconfig +++ b/sound/soc/uniphier/Kconfig @@ -8,6 +8,39 @@ config SND_SOC_UNIPHIER audio interfaces to support below. If unsure select "N". +config SND_SOC_UNIPHIER_AIO + tristate "UniPhier AIO DAI Driver" + select REGMAP_MMIO + select SND_SOC_COMPRESS + depends on SND_SOC_UNIPHIER + help + This adds ASoC driver support for Socionext UniPhier + 'AIO' Audio Input/Output subsystem. + Select Y if you use such device. + If unsure select "N". + +config SND_SOC_UNIPHIER_LD11 + tristate "UniPhier LD11/LD20 Device Driver" + depends on SND_SOC_UNIPHIER + select SND_SOC_UNIPHIER_AIO + select SND_SOC_UNIPHIER_AIO_DMA + help + This adds ASoC driver for Socionext UniPhier LD11/LD20 + input and output that can be used with other codecs. + Select Y if you use such device. + If unsure select "N". + +config SND_SOC_UNIPHIER_PXS2 + tristate "UniPhier PXs2 Device Driver" + depends on SND_SOC_UNIPHIER + select SND_SOC_UNIPHIER_AIO + select SND_SOC_UNIPHIER_AIO_DMA + help + This adds ASoC driver for Socionext UniPhier PXs2 + input and output that can be used with other codecs. + Select Y if you use such device. + If unsure select "N". + config SND_SOC_UNIPHIER_EVEA_CODEC tristate "UniPhier SoC internal audio codec" depends on SND_SOC_UNIPHIER diff --git a/sound/soc/uniphier/Makefile b/sound/soc/uniphier/Makefile index 3be00d72f5e5..88169395f68a 100644 --- a/sound/soc/uniphier/Makefile +++ b/sound/soc/uniphier/Makefile @@ -1,3 +1,11 @@ # SPDX-License-Identifier: GPL-2.0 +snd-soc-uniphier-aio-cpu-objs := aio-core.o aio-dma.o aio-cpu.o aio-compress.o +snd-soc-uniphier-aio-ld11-objs := aio-ld11.o +snd-soc-uniphier-aio-pxs2-objs := aio-pxs2.o + +obj-$(CONFIG_SND_SOC_UNIPHIER_AIO) += snd-soc-uniphier-aio-cpu.o +obj-$(CONFIG_SND_SOC_UNIPHIER_LD11) += snd-soc-uniphier-aio-ld11.o +obj-$(CONFIG_SND_SOC_UNIPHIER_PXS2) += snd-soc-uniphier-aio-pxs2.o + snd-soc-uniphier-evea-objs := evea.o obj-$(CONFIG_SND_SOC_UNIPHIER_EVEA_CODEC) += snd-soc-uniphier-evea.o diff --git a/sound/soc/uniphier/aio-compress.c b/sound/soc/uniphier/aio-compress.c new file mode 100644 index 000000000000..4c1027aa615e --- /dev/null +++ b/sound/soc/uniphier/aio-compress.c @@ -0,0 +1,438 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO Compress Audio driver. +// +// Copyright (c) 2017-2018 Socionext Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; version 2 +// of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <linux/bitfield.h> +#include <linux/circ_buf.h> +#include <linux/dma-mapping.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> + +#include "aio.h" + +static int uniphier_aio_compr_prepare(struct snd_compr_stream *cstream); +static int uniphier_aio_compr_hw_free(struct snd_compr_stream *cstream); + +static int uniphier_aio_comprdma_new(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_compr *compr = rtd->compr; + struct device *dev = compr->card->dev; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[compr->direction]; + size_t size = AUD_RING_SIZE; + int dma_dir = DMA_FROM_DEVICE, ret; + + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(33)); + if (ret) + return ret; + + sub->compr_area = kzalloc(size, GFP_KERNEL); + if (!sub->compr_area) + return -ENOMEM; + + if (sub->swm->dir == PORT_DIR_OUTPUT) + dma_dir = DMA_TO_DEVICE; + + sub->compr_addr = dma_map_single(dev, sub->compr_area, size, dma_dir); + if (dma_mapping_error(dev, sub->compr_addr)) { + kfree(sub->compr_area); + sub->compr_area = NULL; + + return -ENOMEM; + } + + sub->compr_bytes = size; + + return 0; +} + +static int uniphier_aio_comprdma_free(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_compr *compr = rtd->compr; + struct device *dev = compr->card->dev; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[compr->direction]; + int dma_dir = DMA_FROM_DEVICE; + + if (sub->swm->dir == PORT_DIR_OUTPUT) + dma_dir = DMA_TO_DEVICE; + + dma_unmap_single(dev, sub->compr_addr, sub->compr_bytes, dma_dir); + kfree(sub->compr_area); + sub->compr_area = NULL; + + return 0; +} + +static int uniphier_aio_compr_open(struct snd_compr_stream *cstream) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + int ret; + + if (sub->cstream) + return -EBUSY; + + sub->cstream = cstream; + sub->pass_through = 1; + sub->use_mmap = false; + + ret = uniphier_aio_comprdma_new(rtd); + if (ret) + return ret; + + ret = aio_init(sub); + if (ret) + return ret; + + return 0; +} + +static int uniphier_aio_compr_free(struct snd_compr_stream *cstream) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + int ret; + + ret = uniphier_aio_compr_hw_free(cstream); + if (ret) + return ret; + ret = uniphier_aio_comprdma_free(rtd); + if (ret) + return ret; + + sub->cstream = NULL; + + return 0; +} + +static int uniphier_aio_compr_get_params(struct snd_compr_stream *cstream, + struct snd_codec *params) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + + *params = sub->cparams.codec; + + return 0; +} + +static int uniphier_aio_compr_set_params(struct snd_compr_stream *cstream, + struct snd_compr_params *params) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + struct device *dev = &aio->chip->pdev->dev; + int ret; + + if (params->codec.id != SND_AUDIOCODEC_IEC61937) { + dev_err(dev, "Codec ID is not supported(%d)\n", + params->codec.id); + return -EINVAL; + } + if (params->codec.profile != SND_AUDIOPROFILE_IEC61937_SPDIF) { + dev_err(dev, "Codec profile is not supported(%d)\n", + params->codec.profile); + return -EINVAL; + } + + /* IEC frame type will be changed after received valid data */ + sub->iec_pc = IEC61937_PC_AAC; + + sub->cparams = *params; + sub->setting = 1; + + aio_port_reset(sub); + aio_src_reset(sub); + + ret = uniphier_aio_compr_prepare(cstream); + if (ret) + return ret; + + return 0; +} + +static int uniphier_aio_compr_hw_free(struct snd_compr_stream *cstream) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + + sub->setting = 0; + + return 0; +} + +static int uniphier_aio_compr_prepare(struct snd_compr_stream *cstream) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct snd_compr_runtime *runtime = cstream->runtime; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + int bytes = runtime->fragment_size; + unsigned long flags; + int ret; + + ret = aiodma_ch_set_param(sub); + if (ret) + return ret; + + spin_lock_irqsave(&sub->lock, flags); + ret = aiodma_rb_set_buffer(sub, sub->compr_addr, + sub->compr_addr + sub->compr_bytes, + bytes); + spin_unlock_irqrestore(&sub->lock, flags); + if (ret) + return ret; + + ret = aio_port_set_param(sub, sub->pass_through, &sub->params); + if (ret) + return ret; + ret = aio_oport_set_stream_type(sub, sub->iec_pc); + if (ret) + return ret; + aio_port_set_enable(sub, 1); + + ret = aio_if_set_param(sub, sub->pass_through); + if (ret) + return ret; + + return 0; +} + +static int uniphier_aio_compr_trigger(struct snd_compr_stream *cstream, + int cmd) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct snd_compr_runtime *runtime = cstream->runtime; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + struct device *dev = &aio->chip->pdev->dev; + int bytes = runtime->fragment_size, ret = 0; + unsigned long flags; + + spin_lock_irqsave(&sub->lock, flags); + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); + aiodma_ch_set_enable(sub, 1); + sub->running = 1; + + break; + case SNDRV_PCM_TRIGGER_STOP: + sub->running = 0; + aiodma_ch_set_enable(sub, 0); + + break; + default: + dev_warn(dev, "Unknown trigger(%d)\n", cmd); + ret = -EINVAL; + } + spin_unlock_irqrestore(&sub->lock, flags); + + return ret; +} + +static int uniphier_aio_compr_pointer(struct snd_compr_stream *cstream, + struct snd_compr_tstamp *tstamp) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct snd_compr_runtime *runtime = cstream->runtime; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + int bytes = runtime->fragment_size; + unsigned long flags; + u32 pos; + + spin_lock_irqsave(&sub->lock, flags); + + aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + pos = sub->rd_offs; + /* Size of AIO output format is double of IEC61937 */ + tstamp->copied_total = sub->rd_total / 2; + } else { + pos = sub->wr_offs; + tstamp->copied_total = sub->rd_total; + } + tstamp->byte_offset = pos; + + spin_unlock_irqrestore(&sub->lock, flags); + + return 0; +} + +static int aio_compr_send_to_hw(struct uniphier_aio_sub *sub, + char __user *buf, size_t dstsize) +{ + u32 __user *srcbuf = (u32 __user *)buf; + u32 *dstbuf = (u32 *)(sub->compr_area + sub->wr_offs); + int src = 0, dst = 0, ret; + u32 frm, frm_a, frm_b; + + while (dstsize > 0) { + ret = get_user(frm, srcbuf + src); + if (ret) + return ret; + src++; + + frm_a = frm & 0xffff; + frm_b = (frm >> 16) & 0xffff; + + if (frm == IEC61937_HEADER_SIGN) { + frm_a |= 0x01000000; + + /* Next data is Pc and Pd */ + sub->iec_header = true; + } else { + u16 pc = be16_to_cpu((__be16)frm_a); + + if (sub->iec_header && sub->iec_pc != pc) { + /* Force overwrite IEC frame type */ + sub->iec_pc = pc; + ret = aio_oport_set_stream_type(sub, pc); + if (ret) + return ret; + } + sub->iec_header = false; + } + dstbuf[dst++] = frm_a; + dstbuf[dst++] = frm_b; + + dstsize -= sizeof(u32) * 2; + } + + return 0; +} + +static int uniphier_aio_compr_copy(struct snd_compr_stream *cstream, + char __user *buf, size_t count) +{ + struct snd_soc_pcm_runtime *rtd = cstream->private_data; + struct snd_compr_runtime *runtime = cstream->runtime; + struct device *carddev = rtd->compr->card->dev; + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[cstream->direction]; + size_t cnt = min_t(size_t, count, aio_rb_space_to_end(sub) / 2); + int bytes = runtime->fragment_size; + unsigned long flags; + size_t s; + int ret; + + if (cnt < sizeof(u32)) + return 0; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + dma_addr_t dmapos = sub->compr_addr + sub->wr_offs; + + /* Size of AIO output format is double of IEC61937 */ + s = cnt * 2; + + dma_sync_single_for_cpu(carddev, dmapos, s, DMA_TO_DEVICE); + ret = aio_compr_send_to_hw(sub, buf, s); + dma_sync_single_for_device(carddev, dmapos, s, DMA_TO_DEVICE); + } else { + dma_addr_t dmapos = sub->compr_addr + sub->rd_offs; + + s = cnt; + + dma_sync_single_for_cpu(carddev, dmapos, s, DMA_FROM_DEVICE); + ret = copy_to_user(buf, sub->compr_area + sub->rd_offs, s); + dma_sync_single_for_device(carddev, dmapos, s, DMA_FROM_DEVICE); + } + if (ret) + return -EFAULT; + + spin_lock_irqsave(&sub->lock, flags); + + sub->threshold = 2 * bytes; + aiodma_rb_set_threshold(sub, sub->compr_bytes, 2 * bytes); + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + sub->wr_offs += s; + if (sub->wr_offs >= sub->compr_bytes) + sub->wr_offs -= sub->compr_bytes; + } else { + sub->rd_offs += s; + if (sub->rd_offs >= sub->compr_bytes) + sub->rd_offs -= sub->compr_bytes; + } + aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); + + spin_unlock_irqrestore(&sub->lock, flags); + + return cnt; +} + +static int uniphier_aio_compr_get_caps(struct snd_compr_stream *cstream, + struct snd_compr_caps *caps) +{ + caps->num_codecs = 1; + caps->min_fragment_size = AUD_MIN_FRAGMENT_SIZE; + caps->max_fragment_size = AUD_MAX_FRAGMENT_SIZE; + caps->min_fragments = AUD_MIN_FRAGMENT; + caps->max_fragments = AUD_MAX_FRAGMENT; + caps->codecs[0] = SND_AUDIOCODEC_IEC61937; + + return 0; +} + +static const struct snd_compr_codec_caps caps_iec = { + .num_descriptors = 1, + .descriptor[0].max_ch = 8, + .descriptor[0].num_sample_rates = 0, + .descriptor[0].num_bitrates = 0, + .descriptor[0].profiles = SND_AUDIOPROFILE_IEC61937_SPDIF, + .descriptor[0].modes = SND_AUDIOMODE_IEC_AC3 | + SND_AUDIOMODE_IEC_MPEG1 | + SND_AUDIOMODE_IEC_MP3 | + SND_AUDIOMODE_IEC_DTS, + .descriptor[0].formats = 0, +}; + +static int uniphier_aio_compr_get_codec_caps(struct snd_compr_stream *stream, + struct snd_compr_codec_caps *codec) +{ + if (codec->codec == SND_AUDIOCODEC_IEC61937) + *codec = caps_iec; + else + return -EINVAL; + + return 0; +} + +const struct snd_compr_ops uniphier_aio_compr_ops = { + .open = uniphier_aio_compr_open, + .free = uniphier_aio_compr_free, + .get_params = uniphier_aio_compr_get_params, + .set_params = uniphier_aio_compr_set_params, + .trigger = uniphier_aio_compr_trigger, + .pointer = uniphier_aio_compr_pointer, + .copy = uniphier_aio_compr_copy, + .get_caps = uniphier_aio_compr_get_caps, + .get_codec_caps = uniphier_aio_compr_get_codec_caps, +}; diff --git a/sound/soc/uniphier/aio-core.c b/sound/soc/uniphier/aio-core.c new file mode 100644 index 000000000000..6d50042a4571 --- /dev/null +++ b/sound/soc/uniphier/aio-core.c @@ -0,0 +1,1138 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO ALSA common driver. +// +// Copyright (c) 2016-2018 Socionext Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; version 2 +// of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <linux/bitfield.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> + +#include "aio.h" +#include "aio-reg.h" + +static u64 rb_cnt(u64 wr, u64 rd, u64 len) +{ + if (rd <= wr) + return wr - rd; + else + return len - (rd - wr); +} + +static u64 rb_cnt_to_end(u64 wr, u64 rd, u64 len) +{ + if (rd <= wr) + return wr - rd; + else + return len - rd; +} + +static u64 rb_space(u64 wr, u64 rd, u64 len) +{ + if (rd <= wr) + return len - (wr - rd) - 8; + else + return rd - wr - 8; +} + +static u64 rb_space_to_end(u64 wr, u64 rd, u64 len) +{ + if (rd > wr) + return rd - wr - 8; + else if (rd > 0) + return len - wr; + else + return len - wr - 8; +} + +u64 aio_rb_cnt(struct uniphier_aio_sub *sub) +{ + return rb_cnt(sub->wr_offs, sub->rd_offs, sub->compr_bytes); +} + +u64 aio_rbt_cnt_to_end(struct uniphier_aio_sub *sub) +{ + return rb_cnt_to_end(sub->wr_offs, sub->rd_offs, sub->compr_bytes); +} + +u64 aio_rb_space(struct uniphier_aio_sub *sub) +{ + return rb_space(sub->wr_offs, sub->rd_offs, sub->compr_bytes); +} + +u64 aio_rb_space_to_end(struct uniphier_aio_sub *sub) +{ + return rb_space_to_end(sub->wr_offs, sub->rd_offs, sub->compr_bytes); +} + +/** + * aio_iecout_set_enable - setup IEC output via SoC glue + * @chip: the AIO chip pointer + * @enable: false to stop the output, true to start + * + * Set enabled or disabled S/PDIF signal output to out of SoC via AOnIEC pins. + * This function need to call at driver startup. + * + * The regmap of SoC glue is specified by 'socionext,syscon' optional property + * of DT. This function has no effect if no property. + */ +void aio_iecout_set_enable(struct uniphier_aio_chip *chip, bool enable) +{ + struct regmap *r = chip->regmap_sg; + + if (!r) + return; + + regmap_write(r, SG_AOUTEN, (enable) ? ~0 : 0); +} + +/** + * aio_chip_set_pll - set frequency to audio PLL + * @chip : the AIO chip pointer + * @source: PLL + * @freq : frequency in Hz, 0 is ignored + * + * Sets frequency of audio PLL. This function can be called anytime, + * but it takes time till PLL is locked. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_chip_set_pll(struct uniphier_aio_chip *chip, int pll_id, + unsigned int freq) +{ + struct device *dev = &chip->pdev->dev; + struct regmap *r = chip->regmap; + int shift; + u32 v; + + /* Not change */ + if (freq == 0) + return 0; + + switch (pll_id) { + case AUD_PLL_A1: + shift = 0; + break; + case AUD_PLL_F1: + shift = 1; + break; + case AUD_PLL_A2: + shift = 2; + break; + case AUD_PLL_F2: + shift = 3; + break; + default: + dev_err(dev, "PLL(%d) not supported\n", pll_id); + return -EINVAL; + } + + switch (freq) { + case 36864000: + v = A2APLLCTR1_APLLX_36MHZ; + break; + case 33868800: + v = A2APLLCTR1_APLLX_33MHZ; + break; + default: + dev_err(dev, "PLL frequency not supported(%d)\n", freq); + return -EINVAL; + } + chip->plls[pll_id].freq = freq; + + regmap_update_bits(r, A2APLLCTR1, A2APLLCTR1_APLLX_MASK << shift, + v << shift); + + return 0; +} + +/** + * aio_chip_init - initialize AIO whole settings + * @chip: the AIO chip pointer + * + * Sets AIO fixed and whole device settings to AIO. + * This function need to call once at driver startup. + * + * The register area that is changed by this function is shared by all + * modules of AIO. But there is not race condition since this function + * has always set the same initialize values. + */ +void aio_chip_init(struct uniphier_aio_chip *chip) +{ + struct regmap *r = chip->regmap; + + regmap_update_bits(r, A2APLLCTR0, + A2APLLCTR0_APLLXPOW_MASK, + A2APLLCTR0_APLLXPOW_PWON); + + regmap_update_bits(r, A2EXMCLKSEL0, + A2EXMCLKSEL0_EXMCLK_MASK, + A2EXMCLKSEL0_EXMCLK_OUTPUT); + + regmap_update_bits(r, A2AIOINPUTSEL, A2AIOINPUTSEL_RXSEL_MASK, + A2AIOINPUTSEL_RXSEL_PCMI1_HDMIRX1 | + A2AIOINPUTSEL_RXSEL_PCMI2_SIF | + A2AIOINPUTSEL_RXSEL_PCMI3_EVEA | + A2AIOINPUTSEL_RXSEL_IECI1_HDMIRX1); + + if (chip->chip_spec->addr_ext) + regmap_update_bits(r, CDA2D_TEST, CDA2D_TEST_DDR_MODE_MASK, + CDA2D_TEST_DDR_MODE_EXTON0); + else + regmap_update_bits(r, CDA2D_TEST, CDA2D_TEST_DDR_MODE_MASK, + CDA2D_TEST_DDR_MODE_EXTOFF1); +} + +/** + * aio_init - initialize AIO substream + * @sub: the AIO substream pointer + * + * Sets fixed settings of each AIO substreams. + * This function need to call once at substream startup. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_init(struct uniphier_aio_sub *sub) +{ + struct device *dev = &sub->aio->chip->pdev->dev; + struct regmap *r = sub->aio->chip->regmap; + + regmap_write(r, A2RBNMAPCTR0(sub->swm->rb.hw), + MAPCTR0_EN | sub->swm->rb.map); + regmap_write(r, A2CHNMAPCTR0(sub->swm->ch.hw), + MAPCTR0_EN | sub->swm->ch.map); + + switch (sub->swm->type) { + case PORT_TYPE_I2S: + case PORT_TYPE_SPDIF: + case PORT_TYPE_EVE: + if (sub->swm->dir == PORT_DIR_INPUT) { + regmap_write(r, A2IIFNMAPCTR0(sub->swm->iif.hw), + MAPCTR0_EN | sub->swm->iif.map); + regmap_write(r, A2IPORTNMAPCTR0(sub->swm->iport.hw), + MAPCTR0_EN | sub->swm->iport.map); + } else { + regmap_write(r, A2OIFNMAPCTR0(sub->swm->oif.hw), + MAPCTR0_EN | sub->swm->oif.map); + regmap_write(r, A2OPORTNMAPCTR0(sub->swm->oport.hw), + MAPCTR0_EN | sub->swm->oport.map); + } + break; + case PORT_TYPE_CONV: + regmap_write(r, A2OIFNMAPCTR0(sub->swm->oif.hw), + MAPCTR0_EN | sub->swm->oif.map); + regmap_write(r, A2OPORTNMAPCTR0(sub->swm->oport.hw), + MAPCTR0_EN | sub->swm->oport.map); + regmap_write(r, A2CHNMAPCTR0(sub->swm->och.hw), + MAPCTR0_EN | sub->swm->och.map); + regmap_write(r, A2IIFNMAPCTR0(sub->swm->iif.hw), + MAPCTR0_EN | sub->swm->iif.map); + break; + default: + dev_err(dev, "Unknown port type %d.\n", sub->swm->type); + return -EINVAL; + } + + return 0; +} + +/** + * aio_port_reset - reset AIO port block + * @sub: the AIO substream pointer + * + * Resets the digital signal input/output port block of AIO. + */ +void aio_port_reset(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + regmap_write(r, AOUTRSTCTR0, BIT(sub->swm->oport.map)); + regmap_write(r, AOUTRSTCTR1, BIT(sub->swm->oport.map)); + } else { + regmap_update_bits(r, IPORTMXRSTCTR(sub->swm->iport.map), + IPORTMXRSTCTR_RSTPI_MASK, + IPORTMXRSTCTR_RSTPI_RESET); + regmap_update_bits(r, IPORTMXRSTCTR(sub->swm->iport.map), + IPORTMXRSTCTR_RSTPI_MASK, + IPORTMXRSTCTR_RSTPI_RELEASE); + } +} + +/** + * aio_port_set_rate - set sampling rate of LPCM + * @sub: the AIO substream pointer, PCM substream only + * @rate: Sampling rate in Hz. + * + * Set suitable I2S format settings to input/output port block of AIO. + * Parameter is specified by hw_params(). + * + * This function may return error if non-PCM substream. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_port_set_rate(struct uniphier_aio_sub *sub, int rate) +{ + struct regmap *r = sub->aio->chip->regmap; + struct device *dev = &sub->aio->chip->pdev->dev; + u32 v; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + switch (rate) { + case 8000: + v = OPORTMXCTR1_FSSEL_8; + break; + case 11025: + v = OPORTMXCTR1_FSSEL_11_025; + break; + case 12000: + v = OPORTMXCTR1_FSSEL_12; + break; + case 16000: + v = OPORTMXCTR1_FSSEL_16; + break; + case 22050: + v = OPORTMXCTR1_FSSEL_22_05; + break; + case 24000: + v = OPORTMXCTR1_FSSEL_24; + break; + case 32000: + v = OPORTMXCTR1_FSSEL_32; + break; + case 44100: + v = OPORTMXCTR1_FSSEL_44_1; + break; + case 48000: + v = OPORTMXCTR1_FSSEL_48; + break; + case 88200: + v = OPORTMXCTR1_FSSEL_88_2; + break; + case 96000: + v = OPORTMXCTR1_FSSEL_96; + break; + case 176400: + v = OPORTMXCTR1_FSSEL_176_4; + break; + case 192000: + v = OPORTMXCTR1_FSSEL_192; + break; + default: + dev_err(dev, "Rate not supported(%d)\n", rate); + return -EINVAL; + } + + regmap_update_bits(r, OPORTMXCTR1(sub->swm->oport.map), + OPORTMXCTR1_FSSEL_MASK, v); + } else { + switch (rate) { + case 8000: + v = IPORTMXCTR1_FSSEL_8; + break; + case 11025: + v = IPORTMXCTR1_FSSEL_11_025; + break; + case 12000: + v = IPORTMXCTR1_FSSEL_12; + break; + case 16000: + v = IPORTMXCTR1_FSSEL_16; + break; + case 22050: + v = IPORTMXCTR1_FSSEL_22_05; + break; + case 24000: + v = IPORTMXCTR1_FSSEL_24; + break; + case 32000: + v = IPORTMXCTR1_FSSEL_32; + break; + case 44100: + v = IPORTMXCTR1_FSSEL_44_1; + break; + case 48000: + v = IPORTMXCTR1_FSSEL_48; + break; + case 88200: + v = IPORTMXCTR1_FSSEL_88_2; + break; + case 96000: + v = IPORTMXCTR1_FSSEL_96; + break; + case 176400: + v = IPORTMXCTR1_FSSEL_176_4; + break; + case 192000: + v = IPORTMXCTR1_FSSEL_192; + break; + default: + dev_err(dev, "Rate not supported(%d)\n", rate); + return -EINVAL; + } + + regmap_update_bits(r, IPORTMXCTR1(sub->swm->iport.map), + IPORTMXCTR1_FSSEL_MASK, v); + } + + return 0; +} + +/** + * aio_port_set_fmt - set format of I2S data + * @sub: the AIO substream pointer, PCM substream only + * This parameter has no effect if substream is I2S or PCM. + * + * Set suitable I2S format settings to input/output port block of AIO. + * Parameter is specified by set_fmt(). + * + * This function may return error if non-PCM substream. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_port_set_fmt(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + struct device *dev = &sub->aio->chip->pdev->dev; + u32 v; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + switch (sub->aio->fmt) { + case SND_SOC_DAIFMT_LEFT_J: + v = OPORTMXCTR1_I2SLRSEL_LEFT; + break; + case SND_SOC_DAIFMT_RIGHT_J: + v = OPORTMXCTR1_I2SLRSEL_RIGHT; + break; + case SND_SOC_DAIFMT_I2S: + v = OPORTMXCTR1_I2SLRSEL_I2S; + break; + default: + dev_err(dev, "Format is not supported(%d)\n", + sub->aio->fmt); + return -EINVAL; + } + + v |= OPORTMXCTR1_OUTBITSEL_24; + regmap_update_bits(r, OPORTMXCTR1(sub->swm->oport.map), + OPORTMXCTR1_I2SLRSEL_MASK | + OPORTMXCTR1_OUTBITSEL_MASK, v); + } else { + switch (sub->aio->fmt) { + case SND_SOC_DAIFMT_LEFT_J: + v = IPORTMXCTR1_LRSEL_LEFT; + break; + case SND_SOC_DAIFMT_RIGHT_J: + v = IPORTMXCTR1_LRSEL_RIGHT; + break; + case SND_SOC_DAIFMT_I2S: + v = IPORTMXCTR1_LRSEL_I2S; + break; + default: + dev_err(dev, "Format is not supported(%d)\n", + sub->aio->fmt); + return -EINVAL; + } + + v |= IPORTMXCTR1_OUTBITSEL_24 | + IPORTMXCTR1_CHSEL_ALL; + regmap_update_bits(r, IPORTMXCTR1(sub->swm->iport.map), + IPORTMXCTR1_LRSEL_MASK | + IPORTMXCTR1_OUTBITSEL_MASK | + IPORTMXCTR1_CHSEL_MASK, v); + } + + return 0; +} + +/** + * aio_port_set_clk - set clock and divider of AIO port block + * @sub: the AIO substream pointer + * + * Set suitable PLL clock divider and relational settings to + * input/output port block of AIO. Parameters are specified by + * set_sysclk() and set_pll(). + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_port_set_clk(struct uniphier_aio_sub *sub) +{ + struct uniphier_aio_chip *chip = sub->aio->chip; + struct device *dev = &sub->aio->chip->pdev->dev; + struct regmap *r = sub->aio->chip->regmap; + u32 v_pll[] = { + OPORTMXCTR2_ACLKSEL_A1, OPORTMXCTR2_ACLKSEL_F1, + OPORTMXCTR2_ACLKSEL_A2, OPORTMXCTR2_ACLKSEL_F2, + OPORTMXCTR2_ACLKSEL_A2PLL, + OPORTMXCTR2_ACLKSEL_RX1, + }; + u32 v_div[] = { + OPORTMXCTR2_DACCKSEL_1_2, OPORTMXCTR2_DACCKSEL_1_3, + OPORTMXCTR2_DACCKSEL_1_1, OPORTMXCTR2_DACCKSEL_2_3, + }; + u32 v; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + if (sub->swm->type == PORT_TYPE_I2S) { + if (sub->aio->pll_out >= ARRAY_SIZE(v_pll)) { + dev_err(dev, "PLL(%d) is invalid\n", + sub->aio->pll_out); + return -EINVAL; + } + if (sub->aio->plldiv >= ARRAY_SIZE(v_div)) { + dev_err(dev, "PLL divider(%d) is invalid\n", + sub->aio->plldiv); + return -EINVAL; + } + + v = v_pll[sub->aio->pll_out] | + OPORTMXCTR2_MSSEL_MASTER | + v_div[sub->aio->plldiv]; + + switch (chip->plls[sub->aio->pll_out].freq) { + case 0: + case 36864000: + case 33868800: + v |= OPORTMXCTR2_EXTLSIFSSEL_36; + break; + default: + v |= OPORTMXCTR2_EXTLSIFSSEL_24; + break; + } + } else if (sub->swm->type == PORT_TYPE_EVE) { + v = OPORTMXCTR2_ACLKSEL_A2PLL | + OPORTMXCTR2_MSSEL_MASTER | + OPORTMXCTR2_EXTLSIFSSEL_36 | + OPORTMXCTR2_DACCKSEL_1_2; + } else if (sub->swm->type == PORT_TYPE_SPDIF) { + if (sub->aio->pll_out >= ARRAY_SIZE(v_pll)) { + dev_err(dev, "PLL(%d) is invalid\n", + sub->aio->pll_out); + return -EINVAL; + } + v = v_pll[sub->aio->pll_out] | + OPORTMXCTR2_MSSEL_MASTER | + OPORTMXCTR2_DACCKSEL_1_2; + + switch (chip->plls[sub->aio->pll_out].freq) { + case 0: + case 36864000: + case 33868800: + v |= OPORTMXCTR2_EXTLSIFSSEL_36; + break; + default: + v |= OPORTMXCTR2_EXTLSIFSSEL_24; + break; + } + } else { + v = OPORTMXCTR2_ACLKSEL_A1 | + OPORTMXCTR2_MSSEL_MASTER | + OPORTMXCTR2_EXTLSIFSSEL_36 | + OPORTMXCTR2_DACCKSEL_1_2; + } + regmap_write(r, OPORTMXCTR2(sub->swm->oport.map), v); + } else { + v = IPORTMXCTR2_ACLKSEL_A1 | + IPORTMXCTR2_MSSEL_SLAVE | + IPORTMXCTR2_EXTLSIFSSEL_36 | + IPORTMXCTR2_DACCKSEL_1_2; + regmap_write(r, IPORTMXCTR2(sub->swm->iport.map), v); + } + + return 0; +} + +/** + * aio_port_set_param - set parameters of AIO port block + * @sub: the AIO substream pointer + * @pass_through: Zero if sound data is LPCM, otherwise if data is not LPCM. + * This parameter has no effect if substream is I2S or PCM. + * @params: hardware parameters of ALSA + * + * Set suitable setting to input/output port block of AIO to process the + * specified in params. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_port_set_param(struct uniphier_aio_sub *sub, int pass_through, + const struct snd_pcm_hw_params *params) +{ + struct regmap *r = sub->aio->chip->regmap; + unsigned int rate; + u32 v; + int ret; + + if (!pass_through) { + if (sub->swm->type == PORT_TYPE_EVE || + sub->swm->type == PORT_TYPE_CONV) { + rate = 48000; + } else { + rate = params_rate(params); + } + + ret = aio_port_set_rate(sub, rate); + if (ret) + return ret; + + ret = aio_port_set_fmt(sub); + if (ret) + return ret; + } + + ret = aio_port_set_clk(sub); + if (ret) + return ret; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + if (pass_through) + v = OPORTMXCTR3_SRCSEL_STREAM | + OPORTMXCTR3_VALID_STREAM; + else + v = OPORTMXCTR3_SRCSEL_PCM | + OPORTMXCTR3_VALID_PCM; + + v |= OPORTMXCTR3_IECTHUR_IECOUT | + OPORTMXCTR3_PMSEL_PAUSE | + OPORTMXCTR3_PMSW_MUTE_OFF; + regmap_write(r, OPORTMXCTR3(sub->swm->oport.map), v); + } else { + regmap_write(r, IPORTMXACLKSEL0EX(sub->swm->iport.map), + IPORTMXACLKSEL0EX_ACLKSEL0EX_INTERNAL); + regmap_write(r, IPORTMXEXNOE(sub->swm->iport.map), + IPORTMXEXNOE_PCMINOE_INPUT); + } + + return 0; +} + +/** + * aio_port_set_enable - start or stop of AIO port block + * @sub: the AIO substream pointer + * @enable: zero to stop the block, otherwise to start + * + * Start or stop the signal input/output port block of AIO. + */ +void aio_port_set_enable(struct uniphier_aio_sub *sub, int enable) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + regmap_write(r, OPORTMXPATH(sub->swm->oport.map), + sub->swm->oif.map); + + regmap_update_bits(r, OPORTMXMASK(sub->swm->oport.map), + OPORTMXMASK_IUDXMSK_MASK | + OPORTMXMASK_IUXCKMSK_MASK | + OPORTMXMASK_DXMSK_MASK | + OPORTMXMASK_XCKMSK_MASK, + OPORTMXMASK_IUDXMSK_OFF | + OPORTMXMASK_IUXCKMSK_OFF | + OPORTMXMASK_DXMSK_OFF | + OPORTMXMASK_XCKMSK_OFF); + + if (enable) + regmap_write(r, AOUTENCTR0, BIT(sub->swm->oport.map)); + else + regmap_write(r, AOUTENCTR1, BIT(sub->swm->oport.map)); + } else { + regmap_update_bits(r, IPORTMXMASK(sub->swm->iport.map), + IPORTMXMASK_IUXCKMSK_MASK | + IPORTMXMASK_XCKMSK_MASK, + IPORTMXMASK_IUXCKMSK_OFF | + IPORTMXMASK_XCKMSK_OFF); + + if (enable) + regmap_update_bits(r, + IPORTMXCTR2(sub->swm->iport.map), + IPORTMXCTR2_REQEN_MASK, + IPORTMXCTR2_REQEN_ENABLE); + else + regmap_update_bits(r, + IPORTMXCTR2(sub->swm->iport.map), + IPORTMXCTR2_REQEN_MASK, + IPORTMXCTR2_REQEN_DISABLE); + } +} + +/** + * aio_if_set_param - set parameters of AIO DMA I/F block + * @sub: the AIO substream pointer + * @pass_through: Zero if sound data is LPCM, otherwise if data is not LPCM. + * This parameter has no effect if substream is I2S or PCM. + * + * Set suitable setting to DMA interface block of AIO to process the + * specified in settings. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_if_set_param(struct uniphier_aio_sub *sub, int pass_through) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 v; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + if (pass_through) + v = PBOUTMXCTR0_ENDIAN_0123 | + PBOUTMXCTR0_MEMFMT_STREAM; + else + v = PBOUTMXCTR0_ENDIAN_3210 | + PBOUTMXCTR0_MEMFMT_2CH; + + regmap_write(r, PBOUTMXCTR0(sub->swm->oif.map), v); + regmap_write(r, PBOUTMXCTR1(sub->swm->oif.map), 0); + } else { + regmap_write(r, PBINMXCTR(sub->swm->iif.map), + PBINMXCTR_NCONNECT_CONNECT | + PBINMXCTR_INOUTSEL_IN | + (sub->swm->iport.map << PBINMXCTR_PBINSEL_SHIFT) | + PBINMXCTR_ENDIAN_3210 | + PBINMXCTR_MEMFMT_D0); + } + + return 0; +} + +/** + * aio_oport_set_stream_type - set parameters of AIO playback port block + * @sub: the AIO substream pointer + * @pc: Pc type of IEC61937 + * + * Set special setting to output port block of AIO to output the stream + * via S/PDIF. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_oport_set_stream_type(struct uniphier_aio_sub *sub, + enum IEC61937_PC pc) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 repet = 0, pause = OPORTMXPAUDAT_PAUSEPC_CMN; + + switch (pc) { + case IEC61937_PC_AC3: + repet = OPORTMXREPET_STRLENGTH_AC3 | + OPORTMXREPET_PMLENGTH_AC3; + pause |= OPORTMXPAUDAT_PAUSEPD_AC3; + break; + case IEC61937_PC_MPA: + repet = OPORTMXREPET_STRLENGTH_MPA | + OPORTMXREPET_PMLENGTH_MPA; + pause |= OPORTMXPAUDAT_PAUSEPD_MPA; + break; + case IEC61937_PC_MP3: + repet = OPORTMXREPET_STRLENGTH_MP3 | + OPORTMXREPET_PMLENGTH_MP3; + pause |= OPORTMXPAUDAT_PAUSEPD_MP3; + break; + case IEC61937_PC_DTS1: + repet = OPORTMXREPET_STRLENGTH_DTS1 | + OPORTMXREPET_PMLENGTH_DTS1; + pause |= OPORTMXPAUDAT_PAUSEPD_DTS1; + break; + case IEC61937_PC_DTS2: + repet = OPORTMXREPET_STRLENGTH_DTS2 | + OPORTMXREPET_PMLENGTH_DTS2; + pause |= OPORTMXPAUDAT_PAUSEPD_DTS2; + break; + case IEC61937_PC_DTS3: + repet = OPORTMXREPET_STRLENGTH_DTS3 | + OPORTMXREPET_PMLENGTH_DTS3; + pause |= OPORTMXPAUDAT_PAUSEPD_DTS3; + break; + case IEC61937_PC_AAC: + repet = OPORTMXREPET_STRLENGTH_AAC | + OPORTMXREPET_PMLENGTH_AAC; + pause |= OPORTMXPAUDAT_PAUSEPD_AAC; + break; + case IEC61937_PC_PAUSE: + /* Do nothing */ + break; + } + + regmap_write(r, OPORTMXREPET(sub->swm->oport.map), repet); + regmap_write(r, OPORTMXPAUDAT(sub->swm->oport.map), pause); + + return 0; +} + +/** + * aio_src_reset - reset AIO SRC block + * @sub: the AIO substream pointer + * + * Resets the digital signal input/output port with sampling rate converter + * block of AIO. + * This function has no effect if substream is not supported rate converter. + */ +void aio_src_reset(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (sub->swm->dir != PORT_DIR_OUTPUT) + return; + + regmap_write(r, AOUTSRCRSTCTR0, BIT(sub->swm->oport.map)); + regmap_write(r, AOUTSRCRSTCTR1, BIT(sub->swm->oport.map)); +} + +/** + * aio_src_set_param - set parameters of AIO SRC block + * @sub: the AIO substream pointer + * @params: hardware parameters of ALSA + * + * Set suitable setting to input/output port with sampling rate converter + * block of AIO to process the specified in params. + * This function has no effect if substream is not supported rate converter. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int aio_src_set_param(struct uniphier_aio_sub *sub, + const struct snd_pcm_hw_params *params) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 v; + + if (sub->swm->dir != PORT_DIR_OUTPUT) + return 0; + + regmap_write(r, OPORTMXSRC1CTR(sub->swm->oport.map), + OPORTMXSRC1CTR_THMODE_SRC | + OPORTMXSRC1CTR_SRCPATH_CALC | + OPORTMXSRC1CTR_SYNC_ASYNC | + OPORTMXSRC1CTR_FSIIPSEL_INNER | + OPORTMXSRC1CTR_FSISEL_ACLK); + + switch (params_rate(params)) { + default: + case 48000: + v = OPORTMXRATE_I_ACLKSEL_APLLA1 | + OPORTMXRATE_I_MCKSEL_36 | + OPORTMXRATE_I_FSSEL_48; + break; + case 44100: + v = OPORTMXRATE_I_ACLKSEL_APLLA2 | + OPORTMXRATE_I_MCKSEL_33 | + OPORTMXRATE_I_FSSEL_44_1; + break; + case 32000: + v = OPORTMXRATE_I_ACLKSEL_APLLA1 | + OPORTMXRATE_I_MCKSEL_36 | + OPORTMXRATE_I_FSSEL_32; + break; + } + + regmap_write(r, OPORTMXRATE_I(sub->swm->oport.map), + v | OPORTMXRATE_I_ACLKSRC_APLL | + OPORTMXRATE_I_LRCKSTP_STOP); + regmap_update_bits(r, OPORTMXRATE_I(sub->swm->oport.map), + OPORTMXRATE_I_LRCKSTP_MASK, + OPORTMXRATE_I_LRCKSTP_START); + + return 0; +} + +int aio_srcif_set_param(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + + regmap_write(r, PBINMXCTR(sub->swm->iif.map), + PBINMXCTR_NCONNECT_CONNECT | + PBINMXCTR_INOUTSEL_OUT | + (sub->swm->oport.map << PBINMXCTR_PBINSEL_SHIFT) | + PBINMXCTR_ENDIAN_3210 | + PBINMXCTR_MEMFMT_D0); + + return 0; +} + +int aio_srcch_set_param(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + + regmap_write(r, CDA2D_CHMXCTRL1(sub->swm->och.map), + CDA2D_CHMXCTRL1_INDSIZE_INFINITE); + + regmap_write(r, CDA2D_CHMXSRCAMODE(sub->swm->och.map), + CDA2D_CHMXAMODE_ENDIAN_3210 | + CDA2D_CHMXAMODE_AUPDT_FIX | + CDA2D_CHMXAMODE_TYPE_NORMAL); + + regmap_write(r, CDA2D_CHMXDSTAMODE(sub->swm->och.map), + CDA2D_CHMXAMODE_ENDIAN_3210 | + CDA2D_CHMXAMODE_AUPDT_INC | + CDA2D_CHMXAMODE_TYPE_RING | + (sub->swm->och.map << CDA2D_CHMXAMODE_RSSEL_SHIFT)); + + return 0; +} + +void aio_srcch_set_enable(struct uniphier_aio_sub *sub, int enable) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 v; + + if (enable) + v = CDA2D_STRT0_STOP_START; + else + v = CDA2D_STRT0_STOP_STOP; + + regmap_write(r, CDA2D_STRT0, + v | BIT(sub->swm->och.map)); +} + +int aiodma_ch_set_param(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 v; + + regmap_write(r, CDA2D_CHMXCTRL1(sub->swm->ch.map), + CDA2D_CHMXCTRL1_INDSIZE_INFINITE); + + v = CDA2D_CHMXAMODE_ENDIAN_3210 | + CDA2D_CHMXAMODE_AUPDT_INC | + CDA2D_CHMXAMODE_TYPE_NORMAL | + (sub->swm->rb.map << CDA2D_CHMXAMODE_RSSEL_SHIFT); + if (sub->swm->dir == PORT_DIR_OUTPUT) + regmap_write(r, CDA2D_CHMXSRCAMODE(sub->swm->ch.map), v); + else + regmap_write(r, CDA2D_CHMXDSTAMODE(sub->swm->ch.map), v); + + return 0; +} + +void aiodma_ch_set_enable(struct uniphier_aio_sub *sub, int enable) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (enable) { + regmap_write(r, CDA2D_STRT0, + CDA2D_STRT0_STOP_START | BIT(sub->swm->ch.map)); + + regmap_update_bits(r, INTRBIM(0), + BIT(sub->swm->rb.map), + BIT(sub->swm->rb.map)); + } else { + regmap_write(r, CDA2D_STRT0, + CDA2D_STRT0_STOP_STOP | BIT(sub->swm->ch.map)); + + regmap_update_bits(r, INTRBIM(0), + BIT(sub->swm->rb.map), + 0); + } +} + +static u64 aiodma_rb_get_rp(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 pos_u, pos_l; + int i; + + regmap_write(r, CDA2D_RDPTRLOAD, + CDA2D_RDPTRLOAD_LSFLAG_STORE | BIT(sub->swm->rb.map)); + /* Wait for setup */ + for (i = 0; i < 6; i++) + regmap_read(r, CDA2D_RBMXRDPTR(sub->swm->rb.map), &pos_l); + + regmap_read(r, CDA2D_RBMXRDPTR(sub->swm->rb.map), &pos_l); + regmap_read(r, CDA2D_RBMXRDPTRU(sub->swm->rb.map), &pos_u); + pos_u = FIELD_GET(CDA2D_RBMXPTRU_PTRU_MASK, pos_u); + + return ((u64)pos_u << 32) | pos_l; +} + +static void aiodma_rb_set_rp(struct uniphier_aio_sub *sub, u64 pos) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 tmp; + int i; + + regmap_write(r, CDA2D_RBMXRDPTR(sub->swm->rb.map), (u32)pos); + regmap_write(r, CDA2D_RBMXRDPTRU(sub->swm->rb.map), (u32)(pos >> 32)); + regmap_write(r, CDA2D_RDPTRLOAD, BIT(sub->swm->rb.map)); + /* Wait for setup */ + for (i = 0; i < 6; i++) + regmap_read(r, CDA2D_RBMXRDPTR(sub->swm->rb.map), &tmp); +} + +static u64 aiodma_rb_get_wp(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 pos_u, pos_l; + int i; + + regmap_write(r, CDA2D_WRPTRLOAD, + CDA2D_WRPTRLOAD_LSFLAG_STORE | BIT(sub->swm->rb.map)); + /* Wait for setup */ + for (i = 0; i < 6; i++) + regmap_read(r, CDA2D_RBMXWRPTR(sub->swm->rb.map), &pos_l); + + regmap_read(r, CDA2D_RBMXWRPTR(sub->swm->rb.map), &pos_l); + regmap_read(r, CDA2D_RBMXWRPTRU(sub->swm->rb.map), &pos_u); + pos_u = FIELD_GET(CDA2D_RBMXPTRU_PTRU_MASK, pos_u); + + return ((u64)pos_u << 32) | pos_l; +} + +static void aiodma_rb_set_wp(struct uniphier_aio_sub *sub, u64 pos) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 tmp; + int i; + + regmap_write(r, CDA2D_RBMXWRPTR(sub->swm->rb.map), + lower_32_bits(pos)); + regmap_write(r, CDA2D_RBMXWRPTRU(sub->swm->rb.map), + upper_32_bits(pos)); + regmap_write(r, CDA2D_WRPTRLOAD, BIT(sub->swm->rb.map)); + /* Wait for setup */ + for (i = 0; i < 6; i++) + regmap_read(r, CDA2D_RBMXWRPTR(sub->swm->rb.map), &tmp); +} + +int aiodma_rb_set_threshold(struct uniphier_aio_sub *sub, u64 size, u32 th) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (size <= th) + return -EINVAL; + + regmap_write(r, CDA2D_RBMXBTH(sub->swm->rb.map), th); + regmap_write(r, CDA2D_RBMXRTH(sub->swm->rb.map), th); + + return 0; +} + +int aiodma_rb_set_buffer(struct uniphier_aio_sub *sub, u64 start, u64 end, + int period) +{ + struct regmap *r = sub->aio->chip->regmap; + u64 size = end - start; + int ret; + + if (end < start || period < 0) + return -EINVAL; + + regmap_write(r, CDA2D_RBMXCNFG(sub->swm->rb.map), 0); + regmap_write(r, CDA2D_RBMXBGNADRS(sub->swm->rb.map), + lower_32_bits(start)); + regmap_write(r, CDA2D_RBMXBGNADRSU(sub->swm->rb.map), + upper_32_bits(start)); + regmap_write(r, CDA2D_RBMXENDADRS(sub->swm->rb.map), + lower_32_bits(end)); + regmap_write(r, CDA2D_RBMXENDADRSU(sub->swm->rb.map), + upper_32_bits(end)); + + regmap_write(r, CDA2D_RBADRSLOAD, BIT(sub->swm->rb.map)); + + ret = aiodma_rb_set_threshold(sub, size, 2 * period); + if (ret) + return ret; + + if (sub->swm->dir == PORT_DIR_OUTPUT) { + aiodma_rb_set_rp(sub, start); + aiodma_rb_set_wp(sub, end - period); + + regmap_update_bits(r, CDA2D_RBMXIE(sub->swm->rb.map), + CDA2D_RBMXIX_SPACE, + CDA2D_RBMXIX_SPACE); + } else { + aiodma_rb_set_rp(sub, end - period); + aiodma_rb_set_wp(sub, start); + + regmap_update_bits(r, CDA2D_RBMXIE(sub->swm->rb.map), + CDA2D_RBMXIX_REMAIN, + CDA2D_RBMXIX_REMAIN); + } + + sub->threshold = 2 * period; + sub->rd_offs = 0; + sub->wr_offs = 0; + sub->rd_org = 0; + sub->wr_org = 0; + sub->rd_total = 0; + sub->wr_total = 0; + + return 0; +} + +void aiodma_rb_sync(struct uniphier_aio_sub *sub, u64 start, u64 size, + int period) +{ + if (sub->swm->dir == PORT_DIR_OUTPUT) { + sub->rd_offs = aiodma_rb_get_rp(sub) - start; + + if (sub->use_mmap) { + sub->threshold = 2 * period; + aiodma_rb_set_threshold(sub, size, 2 * period); + + sub->wr_offs = sub->rd_offs - period; + if (sub->rd_offs < period) + sub->wr_offs += size; + } + aiodma_rb_set_wp(sub, sub->wr_offs + start); + } else { + sub->wr_offs = aiodma_rb_get_wp(sub) - start; + + if (sub->use_mmap) { + sub->threshold = 2 * period; + aiodma_rb_set_threshold(sub, size, 2 * period); + + sub->rd_offs = sub->wr_offs - period; + if (sub->wr_offs < period) + sub->rd_offs += size; + } + aiodma_rb_set_rp(sub, sub->rd_offs + start); + } + + sub->rd_total += sub->rd_offs - sub->rd_org; + if (sub->rd_offs < sub->rd_org) + sub->rd_total += size; + sub->wr_total += sub->wr_offs - sub->wr_org; + if (sub->wr_offs < sub->wr_org) + sub->wr_total += size; + + sub->rd_org = sub->rd_offs; + sub->wr_org = sub->wr_offs; +} + +bool aiodma_rb_is_irq(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + u32 ir; + + regmap_read(r, CDA2D_RBMXIR(sub->swm->rb.map), &ir); + + if (sub->swm->dir == PORT_DIR_OUTPUT) + return !!(ir & CDA2D_RBMXIX_SPACE); + else + return !!(ir & CDA2D_RBMXIX_REMAIN); +} + +void aiodma_rb_clear_irq(struct uniphier_aio_sub *sub) +{ + struct regmap *r = sub->aio->chip->regmap; + + if (sub->swm->dir == PORT_DIR_OUTPUT) + regmap_write(r, CDA2D_RBMXIR(sub->swm->rb.map), + CDA2D_RBMXIX_SPACE); + else + regmap_write(r, CDA2D_RBMXIR(sub->swm->rb.map), + CDA2D_RBMXIX_REMAIN); +} diff --git a/sound/soc/uniphier/aio-cpu.c b/sound/soc/uniphier/aio-cpu.c new file mode 100644 index 000000000000..1e5eb8e6f8c7 --- /dev/null +++ b/sound/soc/uniphier/aio-cpu.c @@ -0,0 +1,578 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO ALSA CPU DAI driver. +// +// Copyright (c) 2016-2018 Socionext Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; version 2 +// of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <linux/clk.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/mfd/syscon.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/platform_device.h> +#include <linux/reset.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> + +#include "aio.h" + +static bool is_valid_pll(struct uniphier_aio_chip *chip, int pll_id) +{ + struct device *dev = &chip->pdev->dev; + + if (pll_id < 0 || chip->num_plls <= pll_id) { + dev_err(dev, "PLL(%d) is not supported\n", pll_id); + return false; + } + + return chip->plls[pll_id].enable; +} + +static bool match_spec(const struct uniphier_aio_spec *spec, + const char *name, int dir) +{ + if (dir == SNDRV_PCM_STREAM_PLAYBACK && + spec->swm.dir != PORT_DIR_OUTPUT) { + return false; + } + + if (dir == SNDRV_PCM_STREAM_CAPTURE && + spec->swm.dir != PORT_DIR_INPUT) { + return false; + } + + if (spec->name && strcmp(spec->name, name) == 0) + return true; + + if (spec->gname && strcmp(spec->gname, name) == 0) + return true; + + return false; +} + +/** + * find_spec - find HW specification info by name + * @aio: the AIO device pointer + * @name: name of device + * @direction: the direction of substream, SNDRV_PCM_STREAM_* + * + * Find hardware specification information from list by device name. This + * information is used for telling the difference of SoCs to driver. + * + * Specification list is array of 'struct uniphier_aio_spec' which is defined + * in each drivers (see: aio-i2s.c). + * + * Return: The pointer of hardware specification of AIO if successful, + * otherwise NULL on error. + */ +static const struct uniphier_aio_spec *find_spec(struct uniphier_aio *aio, + const char *name, + int direction) +{ + const struct uniphier_aio_chip_spec *chip_spec = aio->chip->chip_spec; + int i; + + for (i = 0; i < chip_spec->num_specs; i++) { + const struct uniphier_aio_spec *spec = &chip_spec->specs[i]; + + if (match_spec(spec, name, direction)) + return spec; + } + + return NULL; +} + +/** + * find_divider - find clock divider by frequency + * @aio: the AIO device pointer + * @pll_id: PLL ID, should be AUD_PLL_XX + * @freq: required frequency + * + * Find suitable clock divider by frequency. + * + * Return: The ID of PLL if successful, otherwise negative error value. + */ +static int find_divider(struct uniphier_aio *aio, int pll_id, unsigned int freq) +{ + struct uniphier_aio_pll *pll; + int mul[] = { 1, 1, 1, 2, }; + int div[] = { 2, 3, 1, 3, }; + int i; + + if (!is_valid_pll(aio->chip, pll_id)) + return -EINVAL; + + pll = &aio->chip->plls[pll_id]; + for (i = 0; i < ARRAY_SIZE(mul); i++) + if (pll->freq * mul[i] / div[i] == freq) + return i; + + return -ENOTSUPP; +} + +static int uniphier_aio_set_sysclk(struct snd_soc_dai *dai, int clk_id, + unsigned int freq, int dir) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct device *dev = &aio->chip->pdev->dev; + bool pll_auto = false; + int pll_id, div_id; + + switch (clk_id) { + case AUD_CLK_IO: + return -ENOTSUPP; + case AUD_CLK_A1: + pll_id = AUD_PLL_A1; + break; + case AUD_CLK_F1: + pll_id = AUD_PLL_F1; + break; + case AUD_CLK_A2: + pll_id = AUD_PLL_A2; + break; + case AUD_CLK_F2: + pll_id = AUD_PLL_F2; + break; + case AUD_CLK_A: + pll_id = AUD_PLL_A1; + pll_auto = true; + break; + case AUD_CLK_F: + pll_id = AUD_PLL_F1; + pll_auto = true; + break; + case AUD_CLK_APLL: + pll_id = AUD_PLL_APLL; + break; + case AUD_CLK_RX0: + pll_id = AUD_PLL_RX0; + break; + case AUD_CLK_USB0: + pll_id = AUD_PLL_USB0; + break; + case AUD_CLK_HSC0: + pll_id = AUD_PLL_HSC0; + break; + default: + dev_err(dev, "Sysclk(%d) is not supported\n", clk_id); + return -EINVAL; + } + + if (pll_auto) { + for (pll_id = 0; pll_id < aio->chip->num_plls; pll_id++) { + div_id = find_divider(aio, pll_id, freq); + if (div_id >= 0) { + aio->plldiv = div_id; + break; + } + } + if (pll_id == aio->chip->num_plls) { + dev_err(dev, "Sysclk frequency is not supported(%d)\n", + freq); + return -EINVAL; + } + } + + if (dir == SND_SOC_CLOCK_OUT) + aio->pll_out = pll_id; + else + aio->pll_in = pll_id; + + return 0; +} + +static int uniphier_aio_set_pll(struct snd_soc_dai *dai, int pll_id, + int source, unsigned int freq_in, + unsigned int freq_out) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct device *dev = &aio->chip->pdev->dev; + int ret; + + if (!is_valid_pll(aio->chip, pll_id)) + return -EINVAL; + if (!aio->chip->plls[pll_id].enable) { + dev_err(dev, "PLL(%d) is not implemented\n", pll_id); + return -ENOTSUPP; + } + + ret = aio_chip_set_pll(aio->chip, pll_id, freq_out); + if (ret < 0) + return ret; + + return 0; +} + +static int uniphier_aio_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct device *dev = &aio->chip->pdev->dev; + + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_LEFT_J: + case SND_SOC_DAIFMT_RIGHT_J: + case SND_SOC_DAIFMT_I2S: + aio->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; + break; + default: + dev_err(dev, "Format is not supported(%d)\n", + fmt & SND_SOC_DAIFMT_FORMAT_MASK); + return -EINVAL; + } + + return 0; +} + +static int uniphier_aio_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + int ret; + + sub->substream = substream; + sub->pass_through = 0; + sub->use_mmap = true; + + ret = aio_init(sub); + if (ret) + return ret; + + return 0; +} + +static void uniphier_aio_shutdown(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + + sub->substream = NULL; +} + +static int uniphier_aio_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, + struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + struct device *dev = &aio->chip->pdev->dev; + int freq, ret; + + switch (params_rate(params)) { + case 48000: + case 32000: + case 24000: + freq = 12288000; + break; + case 44100: + case 22050: + freq = 11289600; + break; + default: + dev_err(dev, "Rate is not supported(%d)\n", + params_rate(params)); + return -EINVAL; + } + ret = snd_soc_dai_set_sysclk(dai, AUD_CLK_A, + freq, SND_SOC_CLOCK_OUT); + if (ret) + return ret; + + sub->params = *params; + sub->setting = 1; + + aio_port_reset(sub); + aio_src_reset(sub); + + return 0; +} + +static int uniphier_aio_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + + sub->setting = 0; + + return 0; +} + +static int uniphier_aio_prepare(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + int ret; + + ret = aio_port_set_param(sub, sub->pass_through, &sub->params); + if (ret) + return ret; + ret = aio_src_set_param(sub, &sub->params); + if (ret) + return ret; + aio_port_set_enable(sub, 1); + + ret = aio_if_set_param(sub, sub->pass_through); + if (ret) + return ret; + + if (sub->swm->type == PORT_TYPE_CONV) { + ret = aio_srcif_set_param(sub); + if (ret) + return ret; + ret = aio_srcch_set_param(sub); + if (ret) + return ret; + aio_srcch_set_enable(sub, 1); + } + + return 0; +} + +const struct snd_soc_dai_ops uniphier_aio_i2s_ops = { + .set_sysclk = uniphier_aio_set_sysclk, + .set_pll = uniphier_aio_set_pll, + .set_fmt = uniphier_aio_set_fmt, + .startup = uniphier_aio_startup, + .shutdown = uniphier_aio_shutdown, + .hw_params = uniphier_aio_hw_params, + .hw_free = uniphier_aio_hw_free, + .prepare = uniphier_aio_prepare, +}; +EXPORT_SYMBOL_GPL(uniphier_aio_i2s_ops); + +const struct snd_soc_dai_ops uniphier_aio_spdif_ops = { + .set_sysclk = uniphier_aio_set_sysclk, + .set_pll = uniphier_aio_set_pll, + .startup = uniphier_aio_startup, + .shutdown = uniphier_aio_shutdown, + .hw_params = uniphier_aio_hw_params, + .hw_free = uniphier_aio_hw_free, + .prepare = uniphier_aio_prepare, +}; +EXPORT_SYMBOL_GPL(uniphier_aio_spdif_ops); + +int uniphier_aio_dai_probe(struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + int i; + + for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { + struct uniphier_aio_sub *sub = &aio->sub[i]; + const struct uniphier_aio_spec *spec; + + spec = find_spec(aio, dai->name, i); + if (!spec) + continue; + + sub->swm = &spec->swm; + sub->spec = spec; + } + + aio_iecout_set_enable(aio->chip, true); + aio_chip_init(aio->chip); + aio->chip->active = 1; + + return 0; +} +EXPORT_SYMBOL_GPL(uniphier_aio_dai_probe); + +int uniphier_aio_dai_remove(struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + + aio->chip->active = 0; + + return 0; +} +EXPORT_SYMBOL_GPL(uniphier_aio_dai_remove); + +int uniphier_aio_dai_suspend(struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + + reset_control_assert(aio->chip->rst); + clk_disable_unprepare(aio->chip->clk); + + return 0; +} +EXPORT_SYMBOL_GPL(uniphier_aio_dai_suspend); + +int uniphier_aio_dai_resume(struct snd_soc_dai *dai) +{ + struct uniphier_aio *aio = uniphier_priv(dai); + int ret, i; + + if (!aio->chip->active) + return 0; + + ret = clk_prepare_enable(aio->chip->clk); + if (ret) + return ret; + + ret = reset_control_deassert(aio->chip->rst); + if (ret) + goto err_out_clock; + + aio_iecout_set_enable(aio->chip, true); + aio_chip_init(aio->chip); + + for (i = 0; i < ARRAY_SIZE(aio->sub); i++) { + struct uniphier_aio_sub *sub = &aio->sub[i]; + + if (!sub->spec || !sub->substream) + continue; + + ret = aio_init(sub); + if (ret) + goto err_out_clock; + + if (!sub->setting) + continue; + + aio_port_reset(sub); + aio_src_reset(sub); + } + + return 0; + +err_out_clock: + clk_disable_unprepare(aio->chip->clk); + + return ret; +} +EXPORT_SYMBOL_GPL(uniphier_aio_dai_resume); + +static const struct snd_soc_component_driver uniphier_aio_component = { + .name = "uniphier-aio", +}; + +int uniphier_aio_probe(struct platform_device *pdev) +{ + struct uniphier_aio_chip *chip; + struct device *dev = &pdev->dev; + int ret, i, j; + + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); + if (!chip) + return -ENOMEM; + + chip->chip_spec = of_device_get_match_data(dev); + if (!chip->chip_spec) + return -EINVAL; + + chip->regmap_sg = syscon_regmap_lookup_by_phandle(dev->of_node, + "socionext,syscon"); + if (IS_ERR(chip->regmap_sg)) { + if (PTR_ERR(chip->regmap_sg) == -EPROBE_DEFER) + return -EPROBE_DEFER; + chip->regmap_sg = NULL; + } + + chip->clk = devm_clk_get(dev, "aio"); + if (IS_ERR(chip->clk)) + return PTR_ERR(chip->clk); + + chip->rst = devm_reset_control_get_shared(dev, "aio"); + if (IS_ERR(chip->rst)) + return PTR_ERR(chip->rst); + + chip->num_aios = chip->chip_spec->num_dais; + chip->aios = devm_kzalloc(dev, + sizeof(struct uniphier_aio) * chip->num_aios, + GFP_KERNEL); + if (!chip->aios) + return -ENOMEM; + + chip->num_plls = chip->chip_spec->num_plls; + chip->plls = devm_kzalloc(dev, sizeof(struct uniphier_aio_pll) * + chip->num_plls, GFP_KERNEL); + if (!chip->plls) + return -ENOMEM; + memcpy(chip->plls, chip->chip_spec->plls, + sizeof(struct uniphier_aio_pll) * chip->num_plls); + + for (i = 0; i < chip->num_aios; i++) { + struct uniphier_aio *aio = &chip->aios[i]; + + aio->chip = chip; + aio->fmt = SND_SOC_DAIFMT_I2S; + + for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { + struct uniphier_aio_sub *sub = &aio->sub[j]; + + sub->aio = aio; + spin_lock_init(&sub->lock); + } + } + + chip->pdev = pdev; + platform_set_drvdata(pdev, chip); + + ret = clk_prepare_enable(chip->clk); + if (ret) + return ret; + + ret = reset_control_deassert(chip->rst); + if (ret) + goto err_out_clock; + + ret = devm_snd_soc_register_component(dev, &uniphier_aio_component, + chip->chip_spec->dais, + chip->chip_spec->num_dais); + if (ret) { + dev_err(dev, "Register component failed.\n"); + goto err_out_reset; + } + + ret = uniphier_aiodma_soc_register_platform(pdev); + if (ret) { + dev_err(dev, "Register platform failed.\n"); + goto err_out_reset; + } + + return 0; + +err_out_reset: + reset_control_assert(chip->rst); + +err_out_clock: + clk_disable_unprepare(chip->clk); + + return ret; +} +EXPORT_SYMBOL_GPL(uniphier_aio_probe); + +int uniphier_aio_remove(struct platform_device *pdev) +{ + struct uniphier_aio_chip *chip = platform_get_drvdata(pdev); + + reset_control_assert(chip->rst); + clk_disable_unprepare(chip->clk); + + return 0; +} +EXPORT_SYMBOL_GPL(uniphier_aio_remove); + +MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); +MODULE_DESCRIPTION("UniPhier AIO CPU DAI driver."); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/uniphier/aio-dma.c b/sound/soc/uniphier/aio-dma.c new file mode 100644 index 000000000000..ef7bafa8e171 --- /dev/null +++ b/sound/soc/uniphier/aio-dma.c @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO DMA driver. +// +// Copyright (c) 2016-2018 Socionext Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; version 2 +// of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <linux/dma-mapping.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> + +#include "aio.h" + +static struct snd_pcm_hardware uniphier_aiodma_hw = { + .info = SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_MMAP_VALID | + SNDRV_PCM_INFO_INTERLEAVED, + .period_bytes_min = 256, + .period_bytes_max = 4096, + .periods_min = 4, + .periods_max = 1024, + .buffer_bytes_max = 128 * 1024, +}; + +static void aiodma_pcm_irq(struct uniphier_aio_sub *sub) +{ + struct snd_pcm_runtime *runtime = sub->substream->runtime; + int bytes = runtime->period_size * + runtime->channels * samples_to_bytes(runtime, 1); + int ret; + + spin_lock(&sub->lock); + ret = aiodma_rb_set_threshold(sub, runtime->dma_bytes, + sub->threshold + bytes); + if (!ret) + sub->threshold += bytes; + + aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, bytes); + aiodma_rb_clear_irq(sub); + spin_unlock(&sub->lock); + + snd_pcm_period_elapsed(sub->substream); +} + +static void aiodma_compr_irq(struct uniphier_aio_sub *sub) +{ + struct snd_compr_runtime *runtime = sub->cstream->runtime; + int bytes = runtime->fragment_size; + int ret; + + spin_lock(&sub->lock); + ret = aiodma_rb_set_threshold(sub, sub->compr_bytes, + sub->threshold + bytes); + if (!ret) + sub->threshold += bytes; + + aiodma_rb_sync(sub, sub->compr_addr, sub->compr_bytes, bytes); + aiodma_rb_clear_irq(sub); + spin_unlock(&sub->lock); + + snd_compr_fragment_elapsed(sub->cstream); +} + +static irqreturn_t aiodma_irq(int irq, void *p) +{ + struct platform_device *pdev = p; + struct uniphier_aio_chip *chip = platform_get_drvdata(pdev); + irqreturn_t ret = IRQ_NONE; + int i, j; + + for (i = 0; i < chip->num_aios; i++) { + struct uniphier_aio *aio = &chip->aios[i]; + + for (j = 0; j < ARRAY_SIZE(aio->sub); j++) { + struct uniphier_aio_sub *sub = &aio->sub[j]; + + /* Skip channel that does not trigger */ + if (!sub->running || !aiodma_rb_is_irq(sub)) + continue; + + if (sub->substream) + aiodma_pcm_irq(sub); + if (sub->cstream) + aiodma_compr_irq(sub); + + ret = IRQ_HANDLED; + } + } + + return ret; +} + +static int uniphier_aiodma_open(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + + snd_soc_set_runtime_hwparams(substream, &uniphier_aiodma_hw); + + return snd_pcm_hw_constraint_step(runtime, 0, + SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 256); +} + +static int uniphier_aiodma_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); + substream->runtime->dma_bytes = params_buffer_bytes(params); + + return 0; +} + +static int uniphier_aiodma_hw_free(struct snd_pcm_substream *substream) +{ + snd_pcm_set_runtime_buffer(substream, NULL); + substream->runtime->dma_bytes = 0; + + return 0; +} + +static int uniphier_aiodma_prepare(struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + int bytes = runtime->period_size * + runtime->channels * samples_to_bytes(runtime, 1); + unsigned long flags; + int ret; + + ret = aiodma_ch_set_param(sub); + if (ret) + return ret; + + spin_lock_irqsave(&sub->lock, flags); + ret = aiodma_rb_set_buffer(sub, runtime->dma_addr, + runtime->dma_addr + runtime->dma_bytes, + bytes); + spin_unlock_irqrestore(&sub->lock, flags); + if (ret) + return ret; + + return 0; +} + +static int uniphier_aiodma_trigger(struct snd_pcm_substream *substream, int cmd) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + struct device *dev = &aio->chip->pdev->dev; + int bytes = runtime->period_size * + runtime->channels * samples_to_bytes(runtime, 1); + unsigned long flags; + + spin_lock_irqsave(&sub->lock, flags); + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, + bytes); + aiodma_ch_set_enable(sub, 1); + sub->running = 1; + + break; + case SNDRV_PCM_TRIGGER_STOP: + sub->running = 0; + aiodma_ch_set_enable(sub, 0); + + break; + default: + dev_warn(dev, "Unknown trigger(%d) ignored\n", cmd); + break; + } + spin_unlock_irqrestore(&sub->lock, flags); + + return 0; +} + +static snd_pcm_uframes_t uniphier_aiodma_pointer( + struct snd_pcm_substream *substream) +{ + struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream); + struct uniphier_aio *aio = uniphier_priv(rtd->cpu_dai); + struct uniphier_aio_sub *sub = &aio->sub[substream->stream]; + int bytes = runtime->period_size * + runtime->channels * samples_to_bytes(runtime, 1); + unsigned long flags; + snd_pcm_uframes_t pos; + + spin_lock_irqsave(&sub->lock, flags); + aiodma_rb_sync(sub, runtime->dma_addr, runtime->dma_bytes, bytes); + + if (sub->swm->dir == PORT_DIR_OUTPUT) + pos = bytes_to_frames(runtime, sub->rd_offs); + else + pos = bytes_to_frames(runtime, sub->wr_offs); + spin_unlock_irqrestore(&sub->lock, flags); + + return pos; +} + +static int uniphier_aiodma_mmap(struct snd_pcm_substream *substream, + struct vm_area_struct *vma) +{ + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); + + return remap_pfn_range(vma, vma->vm_start, + substream->dma_buffer.addr >> PAGE_SHIFT, + vma->vm_end - vma->vm_start, vma->vm_page_prot); +} + +static const struct snd_pcm_ops uniphier_aiodma_ops = { + .open = uniphier_aiodma_open, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = uniphier_aiodma_hw_params, + .hw_free = uniphier_aiodma_hw_free, + .prepare = uniphier_aiodma_prepare, + .trigger = uniphier_aiodma_trigger, + .pointer = uniphier_aiodma_pointer, + .mmap = uniphier_aiodma_mmap, +}; + +static int uniphier_aiodma_new(struct snd_soc_pcm_runtime *rtd) +{ + struct device *dev = rtd->card->snd_card->dev; + struct snd_pcm *pcm = rtd->pcm; + int ret; + + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(33)); + if (ret) + return ret; + + return snd_pcm_lib_preallocate_pages_for_all(pcm, + SNDRV_DMA_TYPE_DEV, dev, + uniphier_aiodma_hw.buffer_bytes_max, + uniphier_aiodma_hw.buffer_bytes_max); +} + +static void uniphier_aiodma_free(struct snd_pcm *pcm) +{ + snd_pcm_lib_preallocate_free_for_all(pcm); +} + +static const struct snd_soc_component_driver uniphier_soc_platform = { + .pcm_new = uniphier_aiodma_new, + .pcm_free = uniphier_aiodma_free, + .ops = &uniphier_aiodma_ops, + .compr_ops = &uniphier_aio_compr_ops, +}; + +static const struct regmap_config aiodma_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .max_register = 0x7fffc, + .cache_type = REGCACHE_NONE, +}; + +/** + * uniphier_aiodma_soc_register_platform - register the AIO DMA + * @pdev: the platform device + * + * Register and setup the DMA of AIO to transfer the sound data to device. + * This function need to call once at driver startup and need NOT to call + * unregister function. + * + * Return: Zero if successful, otherwise a negative value on error. + */ +int uniphier_aiodma_soc_register_platform(struct platform_device *pdev) +{ + struct uniphier_aio_chip *chip = platform_get_drvdata(pdev); + struct device *dev = &pdev->dev; + struct resource *res; + void __iomem *preg; + int irq, ret; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + preg = devm_ioremap_resource(dev, res); + if (IS_ERR(preg)) + return PTR_ERR(preg); + + chip->regmap = devm_regmap_init_mmio(dev, preg, + &aiodma_regmap_config); + if (IS_ERR(chip->regmap)) + return PTR_ERR(chip->regmap); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(dev, "Could not get irq.\n"); + return irq; + } + + ret = devm_request_irq(dev, irq, aiodma_irq, + IRQF_SHARED, dev_name(dev), pdev); + if (ret) + return ret; + + return devm_snd_soc_register_component(dev, &uniphier_soc_platform, + NULL, 0); +} +EXPORT_SYMBOL_GPL(uniphier_aiodma_soc_register_platform); diff --git a/sound/soc/uniphier/aio-ld11.c b/sound/soc/uniphier/aio-ld11.c new file mode 100644 index 000000000000..4c4dd3dd4dee --- /dev/null +++ b/sound/soc/uniphier/aio-ld11.c @@ -0,0 +1,431 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO ALSA driver for LD11/LD20. +// +// Copyright (c) 2016-2018 Socionext Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; version 2 +// of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <linux/module.h> + +#include "aio.h" + +static const struct uniphier_aio_spec uniphier_aio_ld11[] = { + /* for HDMI PCM In, Pin:AI1Dx */ + { + .name = AUD_NAME_PCMIN1, + .gname = AUD_GNAME_HDMI, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_INPUT, + .rb = { 21, 14, }, + .ch = { 21, 14, }, + .iif = { 5, 3, }, + .iport = { 0, AUD_HW_PCMIN1, }, + }, + }, + + /* for SIF In, Pin:AI2Dx */ + { + .name = AUD_NAME_PCMIN2, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_INPUT, + .rb = { 22, 15, }, + .ch = { 22, 15, }, + .iif = { 6, 4, }, + .iport = { 1, AUD_HW_PCMIN2, }, + }, + }, + + /* for Line In, Pin:AI3Dx */ + { + .name = AUD_NAME_PCMIN3, + .gname = AUD_GNAME_LINE, + .swm = { + .type = PORT_TYPE_EVE, + .dir = PORT_DIR_INPUT, + .rb = { 23, 16, }, + .ch = { 23, 16, }, + .iif = { 7, 5, }, + .iport = { 2, AUD_HW_PCMIN3, }, + }, + }, + + /* for S/PDIF In, Pin:AI1IEC */ + { + .name = AUD_NAME_IECIN1, + .gname = AUD_GNAME_IEC, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_INPUT, + .rb = { 26, 17, }, + .ch = { 26, 17, }, + .iif = { 10, 6, }, + .iport = { 3, AUD_HW_IECIN1, }, + }, + }, + + /* for Speaker, Pin:AO1Dx */ + { + .name = AUD_NAME_HPCMOUT1, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_OUTPUT, + .rb = { 0, 0, }, + .ch = { 0, 0, }, + .oif = { 0, 0, }, + .oport = { 0, AUD_HW_HPCMOUT1, }, + }, + }, + + /* for HDMI PCM, Pin:AO2Dx */ + { + .name = AUD_NAME_PCMOUT1, + .gname = AUD_GNAME_HDMI, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_OUTPUT, + .rb = { 0, 0, }, + .ch = { 0, 0, }, + .oif = { 0, 0, }, + .oport = { 3, AUD_HW_PCMOUT1, }, + }, + }, + + /* for Line Out, Pin:LO2_x */ + { + .name = AUD_NAME_PCMOUT2, + .gname = AUD_GNAME_LINE, + .swm = { + .type = PORT_TYPE_EVE, + .dir = PORT_DIR_OUTPUT, + .rb = { 2, 2, }, + .ch = { 2, 2, }, + .oif = { 2, 2, }, + .oport = { 1, AUD_HW_PCMOUT2, }, + }, + }, + + /* for Headphone, Pin:HP1_x */ + { + .name = AUD_NAME_PCMOUT3, + .swm = { + .type = PORT_TYPE_EVE, + .dir = PORT_DIR_OUTPUT, + .rb = { 3, 3, }, + .ch = { 3, 3, }, + .oif = { 3, 3, }, + .oport = { 2, AUD_HW_PCMOUT3, }, + }, + }, + + /* for HW Sampling Rate Converter */ + { + .name = AUD_NAME_EPCMOUT2, + .swm = { + .type = PORT_TYPE_CONV, + .dir = PORT_DIR_OUTPUT, + .rb = { 7, 5, }, + .ch = { 7, 5, }, + .oif = { 7, 5, }, + .oport = { 6, AUD_HW_EPCMOUT2, }, + .och = { 17, 12, }, + .iif = { 1, 1, }, + }, + }, + + /* for HW Sampling Rate Converter 2 */ + { + .name = AUD_NAME_EPCMOUT3, + .swm = { + .type = PORT_TYPE_CONV, + .dir = PORT_DIR_OUTPUT, + .rb = { 8, 6, }, + .ch = { 8, 6, }, + .oif = { 8, 6, }, + .oport = { 7, AUD_HW_EPCMOUT3, }, + .och = { 18, 13, }, + .iif = { 2, 2, }, + }, + }, + + /* for S/PDIF Out, Pin:AO1IEC */ + { + .name = AUD_NAME_HIECOUT1, + .gname = AUD_GNAME_IEC, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 1, 1, }, + .ch = { 1, 1, }, + .oif = { 1, 1, }, + .oport = { 12, AUD_HW_HIECOUT1, }, + }, + }, + + /* for S/PDIF Out, Pin:AO1IEC, Compress */ + { + .name = AUD_NAME_HIECCOMPOUT1, + .gname = AUD_GNAME_IEC, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 1, 1, }, + .ch = { 1, 1, }, + .oif = { 1, 1, }, + .oport = { 12, AUD_HW_HIECOUT1, }, + }, + }, +}; + +static const struct uniphier_aio_pll uniphier_aio_pll_ld11[] = { + [AUD_PLL_A1] = { .enable = true, }, + [AUD_PLL_F1] = { .enable = true, }, + [AUD_PLL_A2] = { .enable = true, }, + [AUD_PLL_F2] = { .enable = true, }, + [AUD_PLL_APLL] = { .enable = true, }, + [AUD_PLL_RX0] = { .enable = true, }, + [AUD_PLL_USB0] = { .enable = true, }, + [AUD_PLL_HSC0] = { .enable = true, }, +}; + +static int uniphier_aio_ld11_probe(struct snd_soc_dai *dai) +{ + int ret; + + ret = uniphier_aio_dai_probe(dai); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_pll(dai, AUD_PLL_A1, 0, 0, 36864000); + if (ret < 0) + return ret; + ret = snd_soc_dai_set_pll(dai, AUD_PLL_F1, 0, 0, 36864000); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_pll(dai, AUD_PLL_A2, 0, 0, 33868800); + if (ret < 0) + return ret; + ret = snd_soc_dai_set_pll(dai, AUD_PLL_F2, 0, 0, 33868800); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_dai_driver uniphier_aio_dai_ld11[] = { + { + .name = AUD_GNAME_HDMI, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_PCMOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .capture = { + .stream_name = AUD_NAME_PCMIN1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000 | + SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_32000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_PCMIN2, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .capture = { + .stream_name = AUD_NAME_PCMIN2, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_GNAME_LINE, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_PCMOUT2, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .capture = { + .stream_name = AUD_NAME_PCMIN3, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_HPCMOUT1, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_HPCMOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_PCMOUT3, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_PCMOUT3, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_HIECOUT1, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_HIECOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_spdif_ops, + }, + { + .name = AUD_NAME_EPCMOUT2, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_EPCMOUT2, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000 | + SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_32000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_EPCMOUT3, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_EPCMOUT3, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000 | + SNDRV_PCM_RATE_44100 | + SNDRV_PCM_RATE_32000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_HIECCOMPOUT1, + .probe = uniphier_aio_ld11_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .compress_new = snd_soc_new_compress, + .playback = { + .stream_name = AUD_NAME_HIECCOMPOUT1, + .channels_min = 1, + .channels_max = 1, + }, + .ops = &uniphier_aio_spdif_ops, + }, +}; + +static const struct uniphier_aio_chip_spec uniphier_aio_ld11_spec = { + .specs = uniphier_aio_ld11, + .num_specs = ARRAY_SIZE(uniphier_aio_ld11), + .dais = uniphier_aio_dai_ld11, + .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), + .plls = uniphier_aio_pll_ld11, + .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), + .addr_ext = 0, +}; + +static const struct uniphier_aio_chip_spec uniphier_aio_ld20_spec = { + .specs = uniphier_aio_ld11, + .num_specs = ARRAY_SIZE(uniphier_aio_ld11), + .dais = uniphier_aio_dai_ld11, + .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), + .plls = uniphier_aio_pll_ld11, + .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), + .addr_ext = 1, +}; + +static const struct of_device_id uniphier_aio_of_match[] = { + { + .compatible = "socionext,uniphier-ld11-aio", + .data = &uniphier_aio_ld11_spec, + }, + { + .compatible = "socionext,uniphier-ld20-aio", + .data = &uniphier_aio_ld20_spec, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, uniphier_aio_of_match); + +static struct platform_driver uniphier_aio_driver = { + .driver = { + .name = "snd-uniphier-aio-ld11", + .of_match_table = of_match_ptr(uniphier_aio_of_match), + }, + .probe = uniphier_aio_probe, + .remove = uniphier_aio_remove, +}; +module_platform_driver(uniphier_aio_driver); + +MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); +MODULE_DESCRIPTION("UniPhier LD11/LD20 AIO driver."); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/uniphier/aio-pxs2.c b/sound/soc/uniphier/aio-pxs2.c new file mode 100644 index 000000000000..69cd5b0af948 --- /dev/null +++ b/sound/soc/uniphier/aio-pxs2.c @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Socionext UniPhier AIO ALSA driver for PXs2. +// +// Copyright (c) 2018 Socionext Inc. + +#include <linux/module.h> + +#include "aio.h" + +static const struct uniphier_aio_spec uniphier_aio_pxs2[] = { + /* for Line PCM In, Pin:AI1Dx */ + { + .name = AUD_NAME_PCMIN1, + .gname = AUD_GNAME_LINE, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_INPUT, + .rb = { 16, 11, }, + .ch = { 16, 11, }, + .iif = { 0, 0, }, + .iport = { 0, AUD_HW_PCMIN1, }, + }, + }, + + /* for Speaker/Headphone/Mic PCM In, Pin:AI2Dx */ + { + .name = AUD_NAME_PCMIN2, + .gname = AUD_GNAME_AUX, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_INPUT, + .rb = { 17, 12, }, + .ch = { 17, 12, }, + .iif = { 1, 1, }, + .iport = { 1, AUD_HW_PCMIN2, }, + }, + }, + + /* for HDMI PCM Out, Pin:AO1Dx (inner) */ + { + .name = AUD_NAME_HPCMOUT1, + .gname = AUD_GNAME_HDMI, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_OUTPUT, + .rb = { 0, 0, }, + .ch = { 0, 0, }, + .oif = { 0, 0, }, + .oport = { 3, AUD_HW_HPCMOUT1, }, + }, + }, + + /* for Line PCM Out, Pin:AO2Dx */ + { + .name = AUD_NAME_PCMOUT1, + .gname = AUD_GNAME_LINE, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_OUTPUT, + .rb = { 1, 1, }, + .ch = { 1, 1, }, + .oif = { 1, 1, }, + .oport = { 0, AUD_HW_PCMOUT1, }, + }, + }, + + /* for Speaker/Headphone/Mic PCM Out, Pin:AO3Dx */ + { + .name = AUD_NAME_PCMOUT2, + .gname = AUD_GNAME_AUX, + .swm = { + .type = PORT_TYPE_I2S, + .dir = PORT_DIR_OUTPUT, + .rb = { 2, 2, }, + .ch = { 2, 2, }, + .oif = { 2, 2, }, + .oport = { 1, AUD_HW_PCMOUT2, }, + }, + }, + + /* for HDMI Out, Pin:AO1IEC */ + { + .name = AUD_NAME_HIECOUT1, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 6, 4, }, + .ch = { 6, 4, }, + .oif = { 6, 4, }, + .oport = { 12, AUD_HW_HIECOUT1, }, + }, + }, + + /* for HDMI Out, Pin:AO1IEC, Compress */ + { + .name = AUD_NAME_HIECCOMPOUT1, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 6, 4, }, + .ch = { 6, 4, }, + .oif = { 6, 4, }, + .oport = { 12, AUD_HW_HIECOUT1, }, + }, + }, + + /* for S/PDIF Out, Pin:AO2IEC */ + { + .name = AUD_NAME_IECOUT1, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 7, 5, }, + .ch = { 7, 5, }, + .oif = { 7, 5, }, + .oport = { 13, AUD_HW_IECOUT1, }, + }, + }, + + /* for S/PDIF Out, Pin:AO2IEC */ + { + .name = AUD_NAME_IECCOMPOUT1, + .swm = { + .type = PORT_TYPE_SPDIF, + .dir = PORT_DIR_OUTPUT, + .rb = { 7, 5, }, + .ch = { 7, 5, }, + .oif = { 7, 5, }, + .oport = { 13, AUD_HW_IECOUT1, }, + }, + }, +}; + +static const struct uniphier_aio_pll uniphier_aio_pll_pxs2[] = { + [AUD_PLL_A1] = { .enable = true, }, + [AUD_PLL_F1] = { .enable = true, }, + [AUD_PLL_A2] = { .enable = true, }, + [AUD_PLL_F2] = { .enable = true, }, + [AUD_PLL_APLL] = { .enable = true, }, + [AUD_PLL_HSC0] = { .enable = true, }, +}; + +static int uniphier_aio_pxs2_probe(struct snd_soc_dai *dai) +{ + int ret; + + ret = uniphier_aio_dai_probe(dai); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_pll(dai, AUD_PLL_A1, 0, 0, 36864000); + if (ret < 0) + return ret; + ret = snd_soc_dai_set_pll(dai, AUD_PLL_F1, 0, 0, 36864000); + if (ret < 0) + return ret; + + ret = snd_soc_dai_set_pll(dai, AUD_PLL_A2, 0, 0, 33868800); + if (ret < 0) + return ret; + ret = snd_soc_dai_set_pll(dai, AUD_PLL_F2, 0, 0, 33868800); + if (ret < 0) + return ret; + + return 0; +} + +static struct snd_soc_dai_driver uniphier_aio_dai_pxs2[] = { + { + .name = AUD_GNAME_HDMI, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_HPCMOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_GNAME_LINE, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_PCMOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .capture = { + .stream_name = AUD_NAME_PCMIN1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_GNAME_AUX, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_PCMOUT2, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .capture = { + .stream_name = AUD_NAME_PCMIN2, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_i2s_ops, + }, + { + .name = AUD_NAME_HIECOUT1, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_HIECOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_spdif_ops, + }, + { + .name = AUD_NAME_IECOUT1, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .playback = { + .stream_name = AUD_NAME_IECOUT1, + .formats = SNDRV_PCM_FMTBIT_S32_LE, + .rates = SNDRV_PCM_RATE_48000, + .channels_min = 2, + .channels_max = 2, + }, + .ops = &uniphier_aio_spdif_ops, + }, + { + .name = AUD_NAME_HIECCOMPOUT1, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .compress_new = snd_soc_new_compress, + .playback = { + .stream_name = AUD_NAME_HIECCOMPOUT1, + .channels_min = 1, + .channels_max = 1, + }, + .ops = &uniphier_aio_spdif_ops, + }, + { + .name = AUD_NAME_IECCOMPOUT1, + .probe = uniphier_aio_pxs2_probe, + .remove = uniphier_aio_dai_remove, + .suspend = uniphier_aio_dai_suspend, + .resume = uniphier_aio_dai_resume, + .compress_new = snd_soc_new_compress, + .playback = { + .stream_name = AUD_NAME_IECCOMPOUT1, + .channels_min = 1, + .channels_max = 1, + }, + .ops = &uniphier_aio_spdif_ops, + }, +}; + +static const struct uniphier_aio_chip_spec uniphier_aio_pxs2_spec = { + .specs = uniphier_aio_pxs2, + .num_specs = ARRAY_SIZE(uniphier_aio_pxs2), + .dais = uniphier_aio_dai_pxs2, + .num_dais = ARRAY_SIZE(uniphier_aio_dai_pxs2), + .plls = uniphier_aio_pll_pxs2, + .num_plls = ARRAY_SIZE(uniphier_aio_pll_pxs2), + .addr_ext = 0, +}; + +static const struct of_device_id uniphier_aio_of_match[] = { + { + .compatible = "socionext,uniphier-pxs2-aio", + .data = &uniphier_aio_pxs2_spec, + }, + {}, +}; +MODULE_DEVICE_TABLE(of, uniphier_aio_of_match); + +static struct platform_driver uniphier_aio_driver = { + .driver = { + .name = "snd-uniphier-aio-pxs2", + .of_match_table = of_match_ptr(uniphier_aio_of_match), + }, + .probe = uniphier_aio_probe, + .remove = uniphier_aio_remove, +}; +module_platform_driver(uniphier_aio_driver); + +MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); +MODULE_DESCRIPTION("UniPhier PXs2 AIO driver."); +MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/uniphier/aio-reg.h b/sound/soc/uniphier/aio-reg.h new file mode 100644 index 000000000000..136d3563cf44 --- /dev/null +++ b/sound/soc/uniphier/aio-reg.h @@ -0,0 +1,465 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Socionext UniPhier AIO ALSA driver. + * + * Copyright (c) 2016-2018 Socionext Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef SND_UNIPHIER_AIO_REG_H__ +#define SND_UNIPHIER_AIO_REG_H__ + +#include <linux/bitops.h> + +/* soc-glue */ +#define SG_AOUTEN 0x1c04 + +/* SW view */ +#define A2CHNMAPCTR0(n) (0x00000 + 0x40 * (n)) +#define A2RBNMAPCTR0(n) (0x01000 + 0x40 * (n)) +#define A2IPORTNMAPCTR0(n) (0x02000 + 0x40 * (n)) +#define A2IPORTNMAPCTR1(n) (0x02004 + 0x40 * (n)) +#define A2IIFNMAPCTR0(n) (0x03000 + 0x40 * (n)) +#define A2OPORTNMAPCTR0(n) (0x04000 + 0x40 * (n)) +#define A2OPORTNMAPCTR1(n) (0x04004 + 0x40 * (n)) +#define A2OPORTNMAPCTR2(n) (0x04008 + 0x40 * (n)) +#define A2OIFNMAPCTR0(n) (0x05000 + 0x40 * (n)) +#define A2ATNMAPCTR0(n) (0x06000 + 0x40 * (n)) + +#define MAPCTR0_EN 0x80000000 + +/* CTL */ +#define A2APLLCTR0 0x07000 +#define A2APLLCTR0_APLLXPOW_MASK GENMASK(3, 0) +#define A2APLLCTR0_APLLXPOW_PWOFF (0x0 << 0) +#define A2APLLCTR0_APLLXPOW_PWON (0xf << 0) +#define A2APLLCTR1 0x07004 +#define A2APLLCTR1_APLLX_MASK 0x00010101 +#define A2APLLCTR1_APLLX_36MHZ 0x00000000 +#define A2APLLCTR1_APLLX_33MHZ 0x00000001 +#define A2EXMCLKSEL0 0x07030 +#define A2EXMCLKSEL0_EXMCLK_MASK GENMASK(2, 0) +#define A2EXMCLKSEL0_EXMCLK_OUTPUT (0x0 << 0) +#define A2EXMCLKSEL0_EXMCLK_INPUT (0x7 << 0) +#define A2SSIFSW 0x07050 +#define A2CH22_2CTR 0x07054 +#define A2AIOINPUTSEL 0x070e0 +#define A2AIOINPUTSEL_RXSEL_PCMI1_MASK GENMASK(2, 0) +#define A2AIOINPUTSEL_RXSEL_PCMI1_HDMIRX1 (0x2 << 0) +#define A2AIOINPUTSEL_RXSEL_PCMI2_MASK GENMASK(6, 4) +#define A2AIOINPUTSEL_RXSEL_PCMI2_SIF (0x7 << 4) +#define A2AIOINPUTSEL_RXSEL_PCMI3_MASK GENMASK(10, 8) +#define A2AIOINPUTSEL_RXSEL_PCMI3_EVEA (0x1 << 8) +#define A2AIOINPUTSEL_RXSEL_IECI1_MASK GENMASK(14, 12) +#define A2AIOINPUTSEL_RXSEL_IECI1_HDMIRX1 (0x2 << 12) +#define A2AIOINPUTSEL_RXSEL_MASK (A2AIOINPUTSEL_RXSEL_PCMI1_MASK | \ + A2AIOINPUTSEL_RXSEL_PCMI2_MASK | \ + A2AIOINPUTSEL_RXSEL_PCMI3_MASK | \ + A2AIOINPUTSEL_RXSEL_IECI1_HDMIRX1) + +/* INTC */ +#define INTCHIM(m) (0x9028 + 0x80 * (m)) +#define INTRBIM(m) (0x9030 + 0x80 * (m)) +#define INTCHID(m) (0xa028 + 0x80 * (m)) +#define INTRBID(m) (0xa030 + 0x80 * (m)) + +/* AIN(PCMINN) */ +#define IPORTMXCTR1(n) (0x22000 + 0x400 * (n)) +#define IPORTMXCTR1_LRSEL_MASK GENMASK(11, 10) +#define IPORTMXCTR1_LRSEL_RIGHT (0x0 << 10) +#define IPORTMXCTR1_LRSEL_LEFT (0x1 << 10) +#define IPORTMXCTR1_LRSEL_I2S (0x2 << 10) +#define IPORTMXCTR1_OUTBITSEL_MASK (0x800003U << 8) +#define IPORTMXCTR1_OUTBITSEL_32 (0x800000U << 8) +#define IPORTMXCTR1_OUTBITSEL_24 (0x000000U << 8) +#define IPORTMXCTR1_OUTBITSEL_20 (0x000001U << 8) +#define IPORTMXCTR1_OUTBITSEL_16 (0x000002U << 8) +#define IPORTMXCTR1_CHSEL_MASK GENMASK(6, 4) +#define IPORTMXCTR1_CHSEL_ALL (0x0 << 4) +#define IPORTMXCTR1_CHSEL_D0_D2 (0x1 << 4) +#define IPORTMXCTR1_CHSEL_D0 (0x2 << 4) +#define IPORTMXCTR1_CHSEL_D1 (0x3 << 4) +#define IPORTMXCTR1_CHSEL_D2 (0x4 << 4) +#define IPORTMXCTR1_CHSEL_DMIX (0x5 << 4) +#define IPORTMXCTR1_FSSEL_MASK GENMASK(3, 0) +#define IPORTMXCTR1_FSSEL_48 (0x0 << 0) +#define IPORTMXCTR1_FSSEL_96 (0x1 << 0) +#define IPORTMXCTR1_FSSEL_192 (0x2 << 0) +#define IPORTMXCTR1_FSSEL_32 (0x3 << 0) +#define IPORTMXCTR1_FSSEL_44_1 (0x4 << 0) +#define IPORTMXCTR1_FSSEL_88_2 (0x5 << 0) +#define IPORTMXCTR1_FSSEL_176_4 (0x6 << 0) +#define IPORTMXCTR1_FSSEL_16 (0x8 << 0) +#define IPORTMXCTR1_FSSEL_22_05 (0x9 << 0) +#define IPORTMXCTR1_FSSEL_24 (0xa << 0) +#define IPORTMXCTR1_FSSEL_8 (0xb << 0) +#define IPORTMXCTR1_FSSEL_11_025 (0xc << 0) +#define IPORTMXCTR1_FSSEL_12 (0xd << 0) +#define IPORTMXCTR2(n) (0x22004 + 0x400 * (n)) +#define IPORTMXCTR2_ACLKSEL_MASK GENMASK(19, 16) +#define IPORTMXCTR2_ACLKSEL_A1 (0x0 << 16) +#define IPORTMXCTR2_ACLKSEL_F1 (0x1 << 16) +#define IPORTMXCTR2_ACLKSEL_A2 (0x2 << 16) +#define IPORTMXCTR2_ACLKSEL_F2 (0x3 << 16) +#define IPORTMXCTR2_ACLKSEL_A2PLL (0x4 << 16) +#define IPORTMXCTR2_ACLKSEL_RX1 (0x5 << 16) +#define IPORTMXCTR2_ACLKSEL_RX2 (0x6 << 16) +#define IPORTMXCTR2_MSSEL_MASK BIT(15) +#define IPORTMXCTR2_MSSEL_SLAVE (0x0 << 15) +#define IPORTMXCTR2_MSSEL_MASTER (0x1 << 15) +#define IPORTMXCTR2_EXTLSIFSSEL_MASK BIT(14) +#define IPORTMXCTR2_EXTLSIFSSEL_36 (0x0 << 14) +#define IPORTMXCTR2_EXTLSIFSSEL_24 (0x1 << 14) +#define IPORTMXCTR2_DACCKSEL_MASK GENMASK(9, 8) +#define IPORTMXCTR2_DACCKSEL_1_2 (0x0 << 8) +#define IPORTMXCTR2_DACCKSEL_1_3 (0x1 << 8) +#define IPORTMXCTR2_DACCKSEL_1_1 (0x2 << 8) +#define IPORTMXCTR2_DACCKSEL_2_3 (0x3 << 8) +#define IPORTMXCTR2_REQEN_MASK BIT(0) +#define IPORTMXCTR2_REQEN_DISABLE (0x0 << 0) +#define IPORTMXCTR2_REQEN_ENABLE (0x1 << 0) +#define IPORTMXCNTCTR(n) (0x22010 + 0x400 * (n)) +#define IPORTMXCOUNTER(n) (0x22014 + 0x400 * (n)) +#define IPORTMXCNTMONI(n) (0x22018 + 0x400 * (n)) +#define IPORTMXACLKSEL0EX(n) (0x22020 + 0x400 * (n)) +#define IPORTMXACLKSEL0EX_ACLKSEL0EX_MASK GENMASK(3, 0) +#define IPORTMXACLKSEL0EX_ACLKSEL0EX_INTERNAL (0x0 << 0) +#define IPORTMXACLKSEL0EX_ACLKSEL0EX_EXTERNAL (0xf << 0) +#define IPORTMXEXNOE(n) (0x22070 + 0x400 * (n)) +#define IPORTMXEXNOE_PCMINOE_MASK BIT(0) +#define IPORTMXEXNOE_PCMINOE_OUTPUT (0x0 << 0) +#define IPORTMXEXNOE_PCMINOE_INPUT (0x1 << 0) +#define IPORTMXMASK(n) (0x22078 + 0x400 * (n)) +#define IPORTMXMASK_IUXCKMSK_MASK GENMASK(18, 16) +#define IPORTMXMASK_IUXCKMSK_ON (0x0 << 16) +#define IPORTMXMASK_IUXCKMSK_OFF (0x7 << 16) +#define IPORTMXMASK_XCKMSK_MASK GENMASK(2, 0) +#define IPORTMXMASK_XCKMSK_ON (0x0 << 0) +#define IPORTMXMASK_XCKMSK_OFF (0x7 << 0) +#define IPORTMXRSTCTR(n) (0x2207c + 0x400 * (n)) +#define IPORTMXRSTCTR_RSTPI_MASK BIT(7) +#define IPORTMXRSTCTR_RSTPI_RELEASE (0x0 << 7) +#define IPORTMXRSTCTR_RSTPI_RESET (0x1 << 7) + +/* AIN(PBinMX) */ +#define PBINMXCTR(n) (0x20200 + 0x40 * (n)) +#define PBINMXCTR_NCONNECT_MASK BIT(15) +#define PBINMXCTR_NCONNECT_CONNECT (0x0 << 15) +#define PBINMXCTR_NCONNECT_DISCONNECT (0x1 << 15) +#define PBINMXCTR_INOUTSEL_MASK BIT(14) +#define PBINMXCTR_INOUTSEL_IN (0x0 << 14) +#define PBINMXCTR_INOUTSEL_OUT (0x1 << 14) +#define PBINMXCTR_PBINSEL_SHIFT (8) +#define PBINMXCTR_ENDIAN_MASK GENMASK(5, 4) +#define PBINMXCTR_ENDIAN_3210 (0x0 << 4) +#define PBINMXCTR_ENDIAN_0123 (0x1 << 4) +#define PBINMXCTR_ENDIAN_1032 (0x2 << 4) +#define PBINMXCTR_ENDIAN_2301 (0x3 << 4) +#define PBINMXCTR_MEMFMT_MASK GENMASK(3, 0) +#define PBINMXCTR_MEMFMT_D0 (0x0 << 0) +#define PBINMXCTR_MEMFMT_5_1CH_DMIX (0x1 << 0) +#define PBINMXCTR_MEMFMT_6CH (0x2 << 0) +#define PBINMXCTR_MEMFMT_4CH (0x3 << 0) +#define PBINMXCTR_MEMFMT_DMIX (0x4 << 0) +#define PBINMXCTR_MEMFMT_1CH (0x5 << 0) +#define PBINMXCTR_MEMFMT_16LR (0x6 << 0) +#define PBINMXCTR_MEMFMT_7_1CH (0x7 << 0) +#define PBINMXCTR_MEMFMT_7_1CH_DMIX (0x8 << 0) +#define PBINMXCTR_MEMFMT_STREAM (0xf << 0) +#define PBINMXPAUSECTR0(n) (0x20204 + 0x40 * (n)) +#define PBINMXPAUSECTR1(n) (0x20208 + 0x40 * (n)) + +/* AOUT */ +#define AOUTENCTR0 0x40040 +#define AOUTENCTR1 0x40044 +#define AOUTENCTR2 0x40048 +#define AOUTRSTCTR0 0x40060 +#define AOUTRSTCTR1 0x40064 +#define AOUTRSTCTR2 0x40068 +#define AOUTSRCRSTCTR0 0x400c0 +#define AOUTSRCRSTCTR1 0x400c4 +#define AOUTSRCRSTCTR2 0x400c8 + +/* AOUT(PCMOUTN) */ +#define OPORTMXCTR1(n) (0x42000 + 0x400 * (n)) +#define OPORTMXCTR1_I2SLRSEL_MASK (0x11 << 10) +#define OPORTMXCTR1_I2SLRSEL_RIGHT (0x00 << 10) +#define OPORTMXCTR1_I2SLRSEL_LEFT (0x01 << 10) +#define OPORTMXCTR1_I2SLRSEL_I2S (0x11 << 10) +#define OPORTMXCTR1_OUTBITSEL_MASK (0x800003U << 8) +#define OPORTMXCTR1_OUTBITSEL_32 (0x800000U << 8) +#define OPORTMXCTR1_OUTBITSEL_24 (0x000000U << 8) +#define OPORTMXCTR1_OUTBITSEL_20 (0x000001U << 8) +#define OPORTMXCTR1_OUTBITSEL_16 (0x000002U << 8) +#define OPORTMXCTR1_FSSEL_MASK GENMASK(3, 0) +#define OPORTMXCTR1_FSSEL_48 (0x0 << 0) +#define OPORTMXCTR1_FSSEL_96 (0x1 << 0) +#define OPORTMXCTR1_FSSEL_192 (0x2 << 0) +#define OPORTMXCTR1_FSSEL_32 (0x3 << 0) +#define OPORTMXCTR1_FSSEL_44_1 (0x4 << 0) +#define OPORTMXCTR1_FSSEL_88_2 (0x5 << 0) +#define OPORTMXCTR1_FSSEL_176_4 (0x6 << 0) +#define OPORTMXCTR1_FSSEL_16 (0x8 << 0) +#define OPORTMXCTR1_FSSEL_22_05 (0x9 << 0) +#define OPORTMXCTR1_FSSEL_24 (0xa << 0) +#define OPORTMXCTR1_FSSEL_8 (0xb << 0) +#define OPORTMXCTR1_FSSEL_11_025 (0xc << 0) +#define OPORTMXCTR1_FSSEL_12 (0xd << 0) +#define OPORTMXCTR2(n) (0x42004 + 0x400 * (n)) +#define OPORTMXCTR2_ACLKSEL_MASK GENMASK(19, 16) +#define OPORTMXCTR2_ACLKSEL_A1 (0x0 << 16) +#define OPORTMXCTR2_ACLKSEL_F1 (0x1 << 16) +#define OPORTMXCTR2_ACLKSEL_A2 (0x2 << 16) +#define OPORTMXCTR2_ACLKSEL_F2 (0x3 << 16) +#define OPORTMXCTR2_ACLKSEL_A2PLL (0x4 << 16) +#define OPORTMXCTR2_ACLKSEL_RX1 (0x5 << 16) +#define OPORTMXCTR2_ACLKSEL_RX2 (0x6 << 16) +#define OPORTMXCTR2_MSSEL_MASK BIT(15) +#define OPORTMXCTR2_MSSEL_SLAVE (0x0 << 15) +#define OPORTMXCTR2_MSSEL_MASTER (0x1 << 15) +#define OPORTMXCTR2_EXTLSIFSSEL_MASK BIT(14) +#define OPORTMXCTR2_EXTLSIFSSEL_36 (0x0 << 14) +#define OPORTMXCTR2_EXTLSIFSSEL_24 (0x1 << 14) +#define OPORTMXCTR2_DACCKSEL_MASK GENMASK(9, 8) +#define OPORTMXCTR2_DACCKSEL_1_2 (0x0 << 8) +#define OPORTMXCTR2_DACCKSEL_1_3 (0x1 << 8) +#define OPORTMXCTR2_DACCKSEL_1_1 (0x2 << 8) +#define OPORTMXCTR2_DACCKSEL_2_3 (0x3 << 8) +#define OPORTMXCTR3(n) (0x42008 + 0x400 * (n)) +#define OPORTMXCTR3_IECTHUR_MASK BIT(19) +#define OPORTMXCTR3_IECTHUR_IECOUT (0x0 << 19) +#define OPORTMXCTR3_IECTHUR_IECIN (0x1 << 19) +#define OPORTMXCTR3_SRCSEL_MASK GENMASK(18, 16) +#define OPORTMXCTR3_SRCSEL_PCM (0x0 << 16) +#define OPORTMXCTR3_SRCSEL_STREAM (0x1 << 16) +#define OPORTMXCTR3_SRCSEL_CDDTS (0x2 << 16) +#define OPORTMXCTR3_VALID_MASK BIT(12) +#define OPORTMXCTR3_VALID_PCM (0x0 << 12) +#define OPORTMXCTR3_VALID_STREAM (0x1 << 12) +#define OPORTMXCTR3_PMSEL_MASK BIT(3) +#define OPORTMXCTR3_PMSEL_MUTE (0x0 << 3) +#define OPORTMXCTR3_PMSEL_PAUSE (0x1 << 3) +#define OPORTMXCTR3_PMSW_MASK BIT(2) +#define OPORTMXCTR3_PMSW_MUTE_OFF (0x0 << 2) +#define OPORTMXCTR3_PMSW_MUTE_ON (0x1 << 2) +#define OPORTMXSRC1CTR(n) (0x4200c + 0x400 * (n)) +#define OPORTMXSRC1CTR_FSIIPNUM_SHIFT (24) +#define OPORTMXSRC1CTR_THMODE_MASK BIT(23) +#define OPORTMXSRC1CTR_THMODE_SRC (0x0 << 23) +#define OPORTMXSRC1CTR_THMODE_BYPASS (0x1 << 23) +#define OPORTMXSRC1CTR_LOCK_MASK BIT(16) +#define OPORTMXSRC1CTR_LOCK_UNLOCK (0x0 << 16) +#define OPORTMXSRC1CTR_LOCK_LOCK (0x1 << 16) +#define OPORTMXSRC1CTR_SRCPATH_MASK BIT(15) +#define OPORTMXSRC1CTR_SRCPATH_BYPASS (0x0 << 15) +#define OPORTMXSRC1CTR_SRCPATH_CALC (0x1 << 15) +#define OPORTMXSRC1CTR_SYNC_MASK BIT(14) +#define OPORTMXSRC1CTR_SYNC_ASYNC (0x0 << 14) +#define OPORTMXSRC1CTR_SYNC_SYNC (0x1 << 14) +#define OPORTMXSRC1CTR_FSOCK_MASK GENMASK(11, 10) +#define OPORTMXSRC1CTR_FSOCK_44_1 (0x0 << 10) +#define OPORTMXSRC1CTR_FSOCK_48 (0x1 << 10) +#define OPORTMXSRC1CTR_FSOCK_32 (0x2 << 10) +#define OPORTMXSRC1CTR_FSICK_MASK GENMASK(9, 8) +#define OPORTMXSRC1CTR_FSICK_44_1 (0x0 << 8) +#define OPORTMXSRC1CTR_FSICK_48 (0x1 << 8) +#define OPORTMXSRC1CTR_FSICK_32 (0x2 << 8) +#define OPORTMXSRC1CTR_FSIIPSEL_MASK GENMASK(5, 4) +#define OPORTMXSRC1CTR_FSIIPSEL_INNER (0x0 << 4) +#define OPORTMXSRC1CTR_FSIIPSEL_OUTER (0x1 << 4) +#define OPORTMXSRC1CTR_FSISEL_MASK GENMASK(3, 0) +#define OPORTMXSRC1CTR_FSISEL_ACLK (0x0 << 0) +#define OPORTMXSRC1CTR_FSISEL_DD (0x1 << 0) +#define OPORTMXDSDMUTEDAT(n) (0x42020 + 0x400 * (n)) +#define OPORTMXDXDFREQMODE(n) (0x42024 + 0x400 * (n)) +#define OPORTMXDSDSEL(n) (0x42028 + 0x400 * (n)) +#define OPORTMXDSDPORT(n) (0x4202c + 0x400 * (n)) +#define OPORTMXACLKSEL0EX(n) (0x42030 + 0x400 * (n)) +#define OPORTMXPATH(n) (0x42040 + 0x400 * (n)) +#define OPORTMXSYNC(n) (0x42044 + 0x400 * (n)) +#define OPORTMXREPET(n) (0x42050 + 0x400 * (n)) +#define OPORTMXREPET_STRLENGTH_AC3 SBF_(IEC61937_FRM_STR_AC3, 16) +#define OPORTMXREPET_STRLENGTH_MPA SBF_(IEC61937_FRM_STR_MPA, 16) +#define OPORTMXREPET_STRLENGTH_MP3 SBF_(IEC61937_FRM_STR_MP3, 16) +#define OPORTMXREPET_STRLENGTH_DTS1 SBF_(IEC61937_FRM_STR_DTS1, 16) +#define OPORTMXREPET_STRLENGTH_DTS2 SBF_(IEC61937_FRM_STR_DTS2, 16) +#define OPORTMXREPET_STRLENGTH_DTS3 SBF_(IEC61937_FRM_STR_DTS3, 16) +#define OPORTMXREPET_STRLENGTH_AAC SBF_(IEC61937_FRM_STR_AAC, 16) +#define OPORTMXREPET_PMLENGTH_AC3 SBF_(IEC61937_FRM_PAU_AC3, 0) +#define OPORTMXREPET_PMLENGTH_MPA SBF_(IEC61937_FRM_PAU_MPA, 0) +#define OPORTMXREPET_PMLENGTH_MP3 SBF_(IEC61937_FRM_PAU_MP3, 0) +#define OPORTMXREPET_PMLENGTH_DTS1 SBF_(IEC61937_FRM_PAU_DTS1, 0) +#define OPORTMXREPET_PMLENGTH_DTS2 SBF_(IEC61937_FRM_PAU_DTS2, 0) +#define OPORTMXREPET_PMLENGTH_DTS3 SBF_(IEC61937_FRM_PAU_DTS3, 0) +#define OPORTMXREPET_PMLENGTH_AAC SBF_(IEC61937_FRM_PAU_AAC, 0) +#define OPORTMXPAUDAT(n) (0x42054 + 0x400 * (n)) +#define OPORTMXPAUDAT_PAUSEPC_CMN (IEC61937_PC_PAUSE << 16) +#define OPORTMXPAUDAT_PAUSEPD_AC3 (IEC61937_FRM_PAU_AC3 * 4) +#define OPORTMXPAUDAT_PAUSEPD_MPA (IEC61937_FRM_PAU_MPA * 4) +#define OPORTMXPAUDAT_PAUSEPD_MP3 (IEC61937_FRM_PAU_MP3 * 4) +#define OPORTMXPAUDAT_PAUSEPD_DTS1 (IEC61937_FRM_PAU_DTS1 * 4) +#define OPORTMXPAUDAT_PAUSEPD_DTS2 (IEC61937_FRM_PAU_DTS2 * 4) +#define OPORTMXPAUDAT_PAUSEPD_DTS3 (IEC61937_FRM_PAU_DTS3 * 4) +#define OPORTMXPAUDAT_PAUSEPD_AAC (IEC61937_FRM_PAU_AAC * 4) +#define OPORTMXRATE_I(n) (0x420e4 + 0x400 * (n)) +#define OPORTMXRATE_I_EQU_MASK BIT(31) +#define OPORTMXRATE_I_EQU_NOTEQUAL (0x0 << 31) +#define OPORTMXRATE_I_EQU_EQUAL (0x1 << 31) +#define OPORTMXRATE_I_SRCBPMD_MASK BIT(29) +#define OPORTMXRATE_I_SRCBPMD_BYPASS (0x0 << 29) +#define OPORTMXRATE_I_SRCBPMD_SRC (0x1 << 29) +#define OPORTMXRATE_I_LRCKSTP_MASK BIT(24) +#define OPORTMXRATE_I_LRCKSTP_START (0x0 << 24) +#define OPORTMXRATE_I_LRCKSTP_STOP (0x1 << 24) +#define OPORTMXRATE_I_ACLKSRC_MASK GENMASK(15, 12) +#define OPORTMXRATE_I_ACLKSRC_APLL (0x0 << 12) +#define OPORTMXRATE_I_ACLKSRC_USB (0x1 << 12) +#define OPORTMXRATE_I_ACLKSRC_HSC (0x3 << 12) +/* if OPORTMXRATE_I_ACLKSRC_APLL */ +#define OPORTMXRATE_I_ACLKSEL_MASK GENMASK(11, 8) +#define OPORTMXRATE_I_ACLKSEL_APLLA1 (0x0 << 8) +#define OPORTMXRATE_I_ACLKSEL_APLLF1 (0x1 << 8) +#define OPORTMXRATE_I_ACLKSEL_APLLA2 (0x2 << 8) +#define OPORTMXRATE_I_ACLKSEL_APLLF2 (0x3 << 8) +#define OPORTMXRATE_I_ACLKSEL_APLL (0x4 << 8) +#define OPORTMXRATE_I_ACLKSEL_HDMI1 (0x5 << 8) +#define OPORTMXRATE_I_ACLKSEL_HDMI2 (0x6 << 8) +#define OPORTMXRATE_I_ACLKSEL_AI1ADCCK (0xc << 8) +#define OPORTMXRATE_I_ACLKSEL_AI2ADCCK (0xd << 8) +#define OPORTMXRATE_I_ACLKSEL_AI3ADCCK (0xe << 8) +#define OPORTMXRATE_I_MCKSEL_MASK GENMASK(7, 4) +#define OPORTMXRATE_I_MCKSEL_36 (0x0 << 4) +#define OPORTMXRATE_I_MCKSEL_33 (0x1 << 4) +#define OPORTMXRATE_I_MCKSEL_HSC27 (0xb << 4) +#define OPORTMXRATE_I_FSSEL_MASK GENMASK(3, 0) +#define OPORTMXRATE_I_FSSEL_48 (0x0 << 0) +#define OPORTMXRATE_I_FSSEL_96 (0x1 << 0) +#define OPORTMXRATE_I_FSSEL_192 (0x2 << 0) +#define OPORTMXRATE_I_FSSEL_32 (0x3 << 0) +#define OPORTMXRATE_I_FSSEL_44_1 (0x4 << 0) +#define OPORTMXRATE_I_FSSEL_88_2 (0x5 << 0) +#define OPORTMXRATE_I_FSSEL_176_4 (0x6 << 0) +#define OPORTMXRATE_I_FSSEL_16 (0x8 << 0) +#define OPORTMXRATE_I_FSSEL_22_05 (0x9 << 0) +#define OPORTMXRATE_I_FSSEL_24 (0xa << 0) +#define OPORTMXRATE_I_FSSEL_8 (0xb << 0) +#define OPORTMXRATE_I_FSSEL_11_025 (0xc << 0) +#define OPORTMXRATE_I_FSSEL_12 (0xd << 0) +#define OPORTMXEXNOE(n) (0x420f0 + 0x400 * (n)) +#define OPORTMXMASK(n) (0x420f8 + 0x400 * (n)) +#define OPORTMXMASK_IUDXMSK_MASK GENMASK(28, 24) +#define OPORTMXMASK_IUDXMSK_ON (0x00 << 24) +#define OPORTMXMASK_IUDXMSK_OFF (0x1f << 24) +#define OPORTMXMASK_IUXCKMSK_MASK GENMASK(18, 16) +#define OPORTMXMASK_IUXCKMSK_ON (0x0 << 16) +#define OPORTMXMASK_IUXCKMSK_OFF (0x7 << 16) +#define OPORTMXMASK_DXMSK_MASK GENMASK(12, 8) +#define OPORTMXMASK_DXMSK_ON (0x00 << 8) +#define OPORTMXMASK_DXMSK_OFF (0x1f << 8) +#define OPORTMXMASK_XCKMSK_MASK GENMASK(2, 0) +#define OPORTMXMASK_XCKMSK_ON (0x0 << 0) +#define OPORTMXMASK_XCKMSK_OFF (0x7 << 0) +#define OPORTMXDEBUG(n) (0x420fc + 0x400 * (n)) +#define OPORTMXT0RSTCTR(n) (0x4211c + 0x400 * (n)) +#define OPORTMXT1RSTCTR(n) (0x4213c + 0x400 * (n)) +#define OPORTMXT2RSTCTR(n) (0x4215c + 0x400 * (n)) +#define OPORTMXT3RSTCTR(n) (0x4217c + 0x400 * (n)) +#define OPORTMXT4RSTCTR(n) (0x4219c + 0x400 * (n)) + +#define SBF_(frame, shift) (((frame) * 2 - 1) << shift) + +/* AOUT(PBoutMX) */ +#define PBOUTMXCTR0(n) (0x40200 + 0x40 * (n)) +#define PBOUTMXCTR0_ENDIAN_MASK GENMASK(5, 4) +#define PBOUTMXCTR0_ENDIAN_3210 (0x0 << 4) +#define PBOUTMXCTR0_ENDIAN_0123 (0x1 << 4) +#define PBOUTMXCTR0_ENDIAN_1032 (0x2 << 4) +#define PBOUTMXCTR0_ENDIAN_2301 (0x3 << 4) +#define PBOUTMXCTR0_MEMFMT_MASK GENMASK(3, 0) +#define PBOUTMXCTR0_MEMFMT_10CH (0x0 << 0) +#define PBOUTMXCTR0_MEMFMT_8CH (0x1 << 0) +#define PBOUTMXCTR0_MEMFMT_6CH (0x2 << 0) +#define PBOUTMXCTR0_MEMFMT_4CH (0x3 << 0) +#define PBOUTMXCTR0_MEMFMT_2CH (0x4 << 0) +#define PBOUTMXCTR0_MEMFMT_STREAM (0x5 << 0) +#define PBOUTMXCTR0_MEMFMT_1CH (0x6 << 0) +#define PBOUTMXCTR1(n) (0x40204 + 0x40 * (n)) +#define PBOUTMXINTCTR(n) (0x40208 + 0x40 * (n)) + +/* A2D(subsystem) */ +#define CDA2D_STRT0 0x10000 +#define CDA2D_STRT0_STOP_MASK BIT(31) +#define CDA2D_STRT0_STOP_START (0x0 << 31) +#define CDA2D_STRT0_STOP_STOP (0x1 << 31) +#define CDA2D_STAT0 0x10020 +#define CDA2D_TEST 0x100a0 +#define CDA2D_TEST_DDR_MODE_MASK GENMASK(3, 2) +#define CDA2D_TEST_DDR_MODE_EXTON0 (0x0 << 2) +#define CDA2D_TEST_DDR_MODE_EXTOFF1 (0x3 << 2) +#define CDA2D_STRTADRSLOAD 0x100b0 + +#define CDA2D_CHMXCTRL1(n) (0x12000 + 0x80 * (n)) +#define CDA2D_CHMXCTRL1_INDSIZE_MASK BIT(0) +#define CDA2D_CHMXCTRL1_INDSIZE_FINITE (0x0 << 0) +#define CDA2D_CHMXCTRL1_INDSIZE_INFINITE (0x1 << 0) +#define CDA2D_CHMXCTRL2(n) (0x12004 + 0x80 * (n)) +#define CDA2D_CHMXSRCAMODE(n) (0x12020 + 0x80 * (n)) +#define CDA2D_CHMXDSTAMODE(n) (0x12024 + 0x80 * (n)) +#define CDA2D_CHMXAMODE_ENDIAN_MASK GENMASK(17, 16) +#define CDA2D_CHMXAMODE_ENDIAN_3210 (0x0 << 16) +#define CDA2D_CHMXAMODE_ENDIAN_0123 (0x1 << 16) +#define CDA2D_CHMXAMODE_ENDIAN_1032 (0x2 << 16) +#define CDA2D_CHMXAMODE_ENDIAN_2301 (0x3 << 16) +#define CDA2D_CHMXAMODE_RSSEL_SHIFT (8) +#define CDA2D_CHMXAMODE_AUPDT_MASK GENMASK(5, 4) +#define CDA2D_CHMXAMODE_AUPDT_INC (0x0 << 4) +#define CDA2D_CHMXAMODE_AUPDT_FIX (0x2 << 4) +#define CDA2D_CHMXAMODE_TYPE_MASK GENMASK(3, 2) +#define CDA2D_CHMXAMODE_TYPE_NORMAL (0x0 << 2) +#define CDA2D_CHMXAMODE_TYPE_RING (0x1 << 2) +#define CDA2D_CHMXSRCSTRTADRS(n) (0x12030 + 0x80 * (n)) +#define CDA2D_CHMXSRCSTRTADRSU(n) (0x12034 + 0x80 * (n)) +#define CDA2D_CHMXDSTSTRTADRS(n) (0x12038 + 0x80 * (n)) +#define CDA2D_CHMXDSTSTRTADRSU(n) (0x1203c + 0x80 * (n)) + +/* A2D(ring buffer) */ +#define CDA2D_RBFLUSH0 0x10040 +#define CDA2D_RBADRSLOAD 0x100b4 +#define CDA2D_RDPTRLOAD 0x100b8 +#define CDA2D_RDPTRLOAD_LSFLAG_LOAD (0x0 << 31) +#define CDA2D_RDPTRLOAD_LSFLAG_STORE (0x1 << 31) +#define CDA2D_WRPTRLOAD 0x100bc +#define CDA2D_WRPTRLOAD_LSFLAG_LOAD (0x0 << 31) +#define CDA2D_WRPTRLOAD_LSFLAG_STORE (0x1 << 31) + +#define CDA2D_RBMXBGNADRS(n) (0x14000 + 0x80 * (n)) +#define CDA2D_RBMXBGNADRSU(n) (0x14004 + 0x80 * (n)) +#define CDA2D_RBMXENDADRS(n) (0x14008 + 0x80 * (n)) +#define CDA2D_RBMXENDADRSU(n) (0x1400c + 0x80 * (n)) +#define CDA2D_RBMXBTH(n) (0x14038 + 0x80 * (n)) +#define CDA2D_RBMXRTH(n) (0x1403c + 0x80 * (n)) +#define CDA2D_RBMXRDPTR(n) (0x14020 + 0x80 * (n)) +#define CDA2D_RBMXRDPTRU(n) (0x14024 + 0x80 * (n)) +#define CDA2D_RBMXWRPTR(n) (0x14028 + 0x80 * (n)) +#define CDA2D_RBMXWRPTRU(n) (0x1402c + 0x80 * (n)) +#define CDA2D_RBMXPTRU_PTRU_MASK GENMASK(1, 0) +#define CDA2D_RBMXCNFG(n) (0x14030 + 0x80 * (n)) +#define CDA2D_RBMXIR(n) (0x14014 + 0x80 * (n)) +#define CDA2D_RBMXIE(n) (0x14018 + 0x80 * (n)) +#define CDA2D_RBMXID(n) (0x1401c + 0x80 * (n)) +#define CDA2D_RBMXIX_SPACE BIT(3) +#define CDA2D_RBMXIX_REMAIN BIT(4) + +#endif /* SND_UNIPHIER_AIO_REG_H__ */ diff --git a/sound/soc/uniphier/aio.h b/sound/soc/uniphier/aio.h new file mode 100644 index 000000000000..8cab4a553a97 --- /dev/null +++ b/sound/soc/uniphier/aio.h @@ -0,0 +1,359 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Socionext UniPhier AIO ALSA driver. + * + * Copyright (c) 2016-2018 Socionext Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef SND_UNIPHIER_AIO_H__ +#define SND_UNIPHIER_AIO_H__ + +#include <linux/spinlock.h> +#include <linux/types.h> +#include <sound/pcm.h> +#include <sound/soc.h> +#include <sound/soc-dai.h> + +struct platform_device; + +enum ID_PORT_TYPE { + PORT_TYPE_UNKNOWN, + PORT_TYPE_I2S, + PORT_TYPE_SPDIF, + PORT_TYPE_EVE, + PORT_TYPE_CONV, +}; + +enum ID_PORT_DIR { + PORT_DIR_OUTPUT, + PORT_DIR_INPUT, +}; + +enum IEC61937_PC { + IEC61937_PC_AC3 = 0x0001, + IEC61937_PC_PAUSE = 0x0003, + IEC61937_PC_MPA = 0x0004, + IEC61937_PC_MP3 = 0x0005, + IEC61937_PC_DTS1 = 0x000b, + IEC61937_PC_DTS2 = 0x000c, + IEC61937_PC_DTS3 = 0x000d, + IEC61937_PC_AAC = 0x0007, +}; + +/* IEC61937 Repetition period of data-burst in IEC60958 frames */ +#define IEC61937_FRM_STR_AC3 1536 +#define IEC61937_FRM_STR_MPA 1152 +#define IEC61937_FRM_STR_MP3 1152 +#define IEC61937_FRM_STR_DTS1 512 +#define IEC61937_FRM_STR_DTS2 1024 +#define IEC61937_FRM_STR_DTS3 2048 +#define IEC61937_FRM_STR_AAC 1024 + +/* IEC61937 Repetition period of Pause data-burst in IEC60958 frames */ +#define IEC61937_FRM_PAU_AC3 3 +#define IEC61937_FRM_PAU_MPA 32 +#define IEC61937_FRM_PAU_MP3 32 +#define IEC61937_FRM_PAU_DTS1 3 +#define IEC61937_FRM_PAU_DTS2 3 +#define IEC61937_FRM_PAU_DTS3 3 +#define IEC61937_FRM_PAU_AAC 32 + +/* IEC61937 Pa and Pb */ +#define IEC61937_HEADER_SIGN 0x1f4e72f8 + +#define AUD_HW_PCMIN1 0 +#define AUD_HW_PCMIN2 1 +#define AUD_HW_PCMIN3 2 +#define AUD_HW_IECIN1 3 +#define AUD_HW_DIECIN1 4 + +#define AUD_NAME_PCMIN1 "aio-pcmin1" +#define AUD_NAME_PCMIN2 "aio-pcmin2" +#define AUD_NAME_PCMIN3 "aio-pcmin3" +#define AUD_NAME_IECIN1 "aio-iecin1" +#define AUD_NAME_DIECIN1 "aio-diecin1" + +#define AUD_HW_HPCMOUT1 0 +#define AUD_HW_PCMOUT1 1 +#define AUD_HW_PCMOUT2 2 +#define AUD_HW_PCMOUT3 3 +#define AUD_HW_EPCMOUT1 4 +#define AUD_HW_EPCMOUT2 5 +#define AUD_HW_EPCMOUT3 6 +#define AUD_HW_EPCMOUT6 9 +#define AUD_HW_HIECOUT1 10 +#define AUD_HW_IECOUT1 11 +#define AUD_HW_CMASTER 31 + +#define AUD_NAME_HPCMOUT1 "aio-hpcmout1" +#define AUD_NAME_PCMOUT1 "aio-pcmout1" +#define AUD_NAME_PCMOUT2 "aio-pcmout2" +#define AUD_NAME_PCMOUT3 "aio-pcmout3" +#define AUD_NAME_EPCMOUT1 "aio-epcmout1" +#define AUD_NAME_EPCMOUT2 "aio-epcmout2" +#define AUD_NAME_EPCMOUT3 "aio-epcmout3" +#define AUD_NAME_EPCMOUT6 "aio-epcmout6" +#define AUD_NAME_HIECOUT1 "aio-hiecout1" +#define AUD_NAME_IECOUT1 "aio-iecout1" +#define AUD_NAME_CMASTER "aio-cmaster" +#define AUD_NAME_HIECCOMPOUT1 "aio-hieccompout1" +#define AUD_NAME_IECCOMPOUT1 "aio-ieccompout1" + +#define AUD_GNAME_HDMI "aio-hdmi" +#define AUD_GNAME_LINE "aio-line" +#define AUD_GNAME_AUX "aio-aux" +#define AUD_GNAME_IEC "aio-iec" + +#define AUD_CLK_IO 0 +#define AUD_CLK_A1 1 +#define AUD_CLK_F1 2 +#define AUD_CLK_A2 3 +#define AUD_CLK_F2 4 +#define AUD_CLK_A 5 +#define AUD_CLK_F 6 +#define AUD_CLK_APLL 7 +#define AUD_CLK_RX0 8 +#define AUD_CLK_USB0 9 +#define AUD_CLK_HSC0 10 + +#define AUD_PLL_A1 0 +#define AUD_PLL_F1 1 +#define AUD_PLL_A2 2 +#define AUD_PLL_F2 3 +#define AUD_PLL_APLL 4 +#define AUD_PLL_RX0 5 +#define AUD_PLL_USB0 6 +#define AUD_PLL_HSC0 7 + +#define AUD_PLLDIV_1_2 0 +#define AUD_PLLDIV_1_3 1 +#define AUD_PLLDIV_1_1 2 +#define AUD_PLLDIV_2_3 3 + +#define AUD_RING_SIZE (128 * 1024) + +#define AUD_MIN_FRAGMENT 4 +#define AUD_MAX_FRAGMENT 8 +#define AUD_MIN_FRAGMENT_SIZE (4 * 1024) +#define AUD_MAX_FRAGMENT_SIZE (16 * 1024) + +/* + * This is a selector for virtual register map of AIO. + * + * map: Specify the index of virtual register map. + * hw : Specify the ID of real register map, selector uses this value. + * A meaning of this value depends specification of SoC. + */ +struct uniphier_aio_selector { + int map; + int hw; +}; + +/** + * 'SoftWare MAPping' setting of UniPhier AIO registers. + * + * We have to setup 'virtual' register maps to access 'real' registers of AIO. + * This feature is legacy and meaningless but AIO needs this to work. + * + * Each hardware blocks have own virtual register maps as following: + * + * Address Virtual Real + * ------- --------- --------------- + * 0x12000 DMAC map0 --> [selector] --> DMAC hardware 3 + * 0x12080 DMAC map1 --> [selector] --> DMAC hardware 1 + * ... + * 0x42000 Port map0 --> [selector] --> Port hardware 1 + * 0x42400 Port map1 --> [selector] --> Port hardware 2 + * ... + * + * ch : Input or output channel of DMAC + * rb : Ring buffer + * iport: PCM input port + * iif : Input interface + * oport: PCM output port + * oif : Output interface + * och : Output channel of DMAC for sampling rate converter + * + * These are examples for sound data paths: + * + * For caputure device: + * (outer of AIO) -> iport -> iif -> ch -> rb -> (CPU) + * For playback device: + * (CPU) -> rb -> ch -> oif -> oport -> (outer of AIO) + * For sampling rate converter device: + * (CPU) -> rb -> ch -> oif -> (HW SRC) -> iif -> och -> orb -> (CPU) + */ +struct uniphier_aio_swmap { + int type; + int dir; + + struct uniphier_aio_selector ch; + struct uniphier_aio_selector rb; + struct uniphier_aio_selector iport; + struct uniphier_aio_selector iif; + struct uniphier_aio_selector oport; + struct uniphier_aio_selector oif; + struct uniphier_aio_selector och; +}; + +struct uniphier_aio_spec { + const char *name; + const char *gname; + struct uniphier_aio_swmap swm; +}; + +struct uniphier_aio_pll { + bool enable; + unsigned int freq; +}; + +struct uniphier_aio_chip_spec { + const struct uniphier_aio_spec *specs; + int num_specs; + const struct uniphier_aio_pll *plls; + int num_plls; + struct snd_soc_dai_driver *dais; + int num_dais; + + /* DMA access mode, this is workaround for DMA hungup */ + int addr_ext; +}; + +struct uniphier_aio_sub { + struct uniphier_aio *aio; + + /* Guard sub->rd_offs and wr_offs from IRQ handler. */ + spinlock_t lock; + + const struct uniphier_aio_swmap *swm; + const struct uniphier_aio_spec *spec; + + /* For PCM audio */ + struct snd_pcm_substream *substream; + struct snd_pcm_hw_params params; + + /* For compress audio */ + struct snd_compr_stream *cstream; + struct snd_compr_params cparams; + unsigned char *compr_area; + dma_addr_t compr_addr; + size_t compr_bytes; + int pass_through; + enum IEC61937_PC iec_pc; + bool iec_header; + + /* Both PCM and compress audio */ + bool use_mmap; + int setting; + int running; + u64 rd_offs; + u64 wr_offs; + u32 threshold; + u64 rd_org; + u64 wr_org; + u64 rd_total; + u64 wr_total; +}; + +struct uniphier_aio { + struct uniphier_aio_chip *chip; + + struct uniphier_aio_sub sub[2]; + + unsigned int fmt; + /* Set one of AUD_CLK_X */ + int clk_in; + int clk_out; + /* Set one of AUD_PLL_X */ + int pll_in; + int pll_out; + /* Set one of AUD_PLLDIV_X */ + int plldiv; +}; + +struct uniphier_aio_chip { + struct platform_device *pdev; + const struct uniphier_aio_chip_spec *chip_spec; + + struct uniphier_aio *aios; + int num_aios; + struct uniphier_aio_pll *plls; + int num_plls; + + struct clk *clk; + struct reset_control *rst; + struct regmap *regmap; + struct regmap *regmap_sg; + int active; +}; + +static inline struct uniphier_aio *uniphier_priv(struct snd_soc_dai *dai) +{ + struct uniphier_aio_chip *chip = snd_soc_dai_get_drvdata(dai); + + return &chip->aios[dai->id]; +} + +int uniphier_aiodma_soc_register_platform(struct platform_device *pdev); +extern const struct snd_compr_ops uniphier_aio_compr_ops; + +int uniphier_aio_dai_probe(struct snd_soc_dai *dai); +int uniphier_aio_dai_remove(struct snd_soc_dai *dai); +int uniphier_aio_dai_suspend(struct snd_soc_dai *dai); +int uniphier_aio_dai_resume(struct snd_soc_dai *dai); +int uniphier_aio_probe(struct platform_device *pdev); +int uniphier_aio_remove(struct platform_device *pdev); +extern const struct snd_soc_dai_ops uniphier_aio_i2s_ops; +extern const struct snd_soc_dai_ops uniphier_aio_spdif_ops; + +u64 aio_rb_cnt(struct uniphier_aio_sub *sub); +u64 aio_rbt_cnt_to_end(struct uniphier_aio_sub *sub); +u64 aio_rb_space(struct uniphier_aio_sub *sub); +u64 aio_rb_space_to_end(struct uniphier_aio_sub *sub); + +void aio_iecout_set_enable(struct uniphier_aio_chip *chip, bool enable); +int aio_chip_set_pll(struct uniphier_aio_chip *chip, int pll_id, + unsigned int freq); +void aio_chip_init(struct uniphier_aio_chip *chip); +int aio_init(struct uniphier_aio_sub *sub); +void aio_port_reset(struct uniphier_aio_sub *sub); +int aio_port_set_rate(struct uniphier_aio_sub *sub, int rate); +int aio_port_set_fmt(struct uniphier_aio_sub *sub); +int aio_port_set_clk(struct uniphier_aio_sub *sub); +int aio_port_set_param(struct uniphier_aio_sub *sub, int pass_through, + const struct snd_pcm_hw_params *params); +void aio_port_set_enable(struct uniphier_aio_sub *sub, int enable); +int aio_if_set_param(struct uniphier_aio_sub *sub, int pass_through); +int aio_oport_set_stream_type(struct uniphier_aio_sub *sub, + enum IEC61937_PC pc); +void aio_src_reset(struct uniphier_aio_sub *sub); +int aio_src_set_param(struct uniphier_aio_sub *sub, + const struct snd_pcm_hw_params *params); +int aio_srcif_set_param(struct uniphier_aio_sub *sub); +int aio_srcch_set_param(struct uniphier_aio_sub *sub); +void aio_srcch_set_enable(struct uniphier_aio_sub *sub, int enable); + +int aiodma_ch_set_param(struct uniphier_aio_sub *sub); +void aiodma_ch_set_enable(struct uniphier_aio_sub *sub, int enable); +int aiodma_rb_set_threshold(struct uniphier_aio_sub *sub, u64 size, u32 th); +int aiodma_rb_set_buffer(struct uniphier_aio_sub *sub, u64 start, u64 end, + int period); +void aiodma_rb_sync(struct uniphier_aio_sub *sub, u64 start, u64 size, + int period); +bool aiodma_rb_is_irq(struct uniphier_aio_sub *sub); +void aiodma_rb_clear_irq(struct uniphier_aio_sub *sub); + +#endif /* SND_UNIPHIER_AIO_H__ */ diff --git a/sound/soc/uniphier/evea.c b/sound/soc/uniphier/evea.c index 0cc9efff1d9a..73fd6730095c 100644 --- a/sound/soc/uniphier/evea.c +++ b/sound/soc/uniphier/evea.c @@ -1,22 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 -/* - * Socionext UniPhier EVEA ADC/DAC codec driver. - * - * Copyright (c) 2016-2017 Socionext Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; version 2 - * of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ +// +// Socionext UniPhier EVEA ADC/DAC codec driver. +// +// Copyright (c) 2016-2017 Socionext Inc. #include <linux/clk.h> #include <linux/module.h> @@ -32,6 +18,8 @@ #define AADCPOW(n) (0x0078 + 0x04 * (n)) #define AADCPOW_AADC_POWD BIT(0) +#define ALINSW1 0x0088 +#define ALINSW1_SEL1_SHIFT 3 #define AHPOUTPOW 0x0098 #define AHPOUTPOW_HP_ON BIT(4) #define ALINEPOW 0x009c @@ -220,8 +208,8 @@ static void evea_update_switch_all(struct evea_priv *evea) static int evea_get_switch_lin(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_lin; @@ -231,8 +219,8 @@ static int evea_get_switch_lin(struct snd_kcontrol *kcontrol, static int evea_set_switch_lin(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_lin == ucontrol->value.integer.value[0]) return 0; @@ -245,8 +233,8 @@ static int evea_set_switch_lin(struct snd_kcontrol *kcontrol, static int evea_get_switch_lo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_lo; @@ -256,8 +244,8 @@ static int evea_get_switch_lo(struct snd_kcontrol *kcontrol, static int evea_set_switch_lo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_lo == ucontrol->value.integer.value[0]) return 0; @@ -270,8 +258,8 @@ static int evea_set_switch_lo(struct snd_kcontrol *kcontrol, static int evea_get_switch_hp(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_hp; @@ -281,8 +269,8 @@ static int evea_get_switch_hp(struct snd_kcontrol *kcontrol, static int evea_set_switch_hp(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_hp == ucontrol->value.integer.value[0]) return 0; @@ -292,7 +280,16 @@ static int evea_set_switch_hp(struct snd_kcontrol *kcontrol, return evea_update_switch_hp(evea); } -static const struct snd_kcontrol_new eva_controls[] = { +static const char * const linsw1_sel1_text[] = { + "LIN1", "LIN2", "LIN3" +}; + +static SOC_ENUM_SINGLE_DECL(linsw1_sel1_enum, + ALINSW1, ALINSW1_SEL1_SHIFT, + linsw1_sel1_text); + +static const struct snd_kcontrol_new evea_controls[] = { + SOC_ENUM("Line Capture Source", linsw1_sel1_enum), SOC_SINGLE_BOOL_EXT("Line Capture Switch", 0, evea_get_switch_lin, evea_set_switch_lin), SOC_SINGLE_BOOL_EXT("Line Playback Switch", 0, @@ -301,9 +298,9 @@ static const struct snd_kcontrol_new eva_controls[] = { evea_get_switch_hp, evea_set_switch_hp), }; -static int evea_codec_probe(struct snd_soc_codec *codec) +static int evea_codec_probe(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); evea->switch_lin = 1; evea->switch_lo = 1; @@ -315,9 +312,9 @@ static int evea_codec_probe(struct snd_soc_codec *codec) return 0; } -static int evea_codec_suspend(struct snd_soc_codec *codec) +static int evea_codec_suspend(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); evea_set_power_state_off(evea); @@ -331,9 +328,9 @@ static int evea_codec_suspend(struct snd_soc_codec *codec) return 0; } -static int evea_codec_resume(struct snd_soc_codec *codec) +static int evea_codec_resume(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); int ret; ret = clk_prepare_enable(evea->clk); @@ -376,19 +373,20 @@ err_out_clock: return ret; } -static struct snd_soc_codec_driver soc_codec_evea = { - .probe = evea_codec_probe, - .suspend = evea_codec_suspend, - .resume = evea_codec_resume, - - .component_driver = { - .dapm_widgets = evea_widgets, - .num_dapm_widgets = ARRAY_SIZE(evea_widgets), - .dapm_routes = evea_routes, - .num_dapm_routes = ARRAY_SIZE(evea_routes), - .controls = eva_controls, - .num_controls = ARRAY_SIZE(eva_controls), - }, +static struct snd_soc_component_driver soc_codec_evea = { + .probe = evea_codec_probe, + .suspend = evea_codec_suspend, + .resume = evea_codec_resume, + .dapm_widgets = evea_widgets, + .num_dapm_widgets = ARRAY_SIZE(evea_widgets), + .dapm_routes = evea_routes, + .num_dapm_routes = ARRAY_SIZE(evea_routes), + .controls = evea_controls, + .num_controls = ARRAY_SIZE(evea_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_driver soc_dai_evea[] = { @@ -505,7 +503,7 @@ static int evea_probe(struct platform_device *pdev) platform_set_drvdata(pdev, evea); - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_evea, + ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_evea, soc_dai_evea, ARRAY_SIZE(soc_dai_evea)); if (ret) goto err_out_reset_adamv; @@ -534,8 +532,6 @@ static int evea_remove(struct platform_device *pdev) { struct evea_priv *evea = platform_get_drvdata(pdev); - snd_soc_unregister_codec(&pdev->dev); - reset_control_assert(evea->rst_adamv); reset_control_assert(evea->rst_exiv); reset_control_assert(evea->rst); diff --git a/sound/soc/xtensa/xtfpga-i2s.c b/sound/soc/xtensa/xtfpga-i2s.c index 2472144b329e..503560916620 100644 --- a/sound/soc/xtensa/xtfpga-i2s.c +++ b/sound/soc/xtensa/xtfpga-i2s.c @@ -483,13 +483,10 @@ static const struct snd_pcm_ops xtfpga_pcm_ops = { .pointer = xtfpga_pcm_pointer, }; -static const struct snd_soc_platform_driver xtfpga_soc_platform = { - .pcm_new = xtfpga_pcm_new, - .ops = &xtfpga_pcm_ops, -}; - static const struct snd_soc_component_driver xtfpga_i2s_component = { .name = DRV_NAME, + .pcm_new = xtfpga_pcm_new, + .ops = &xtfpga_pcm_ops, }; static const struct snd_soc_dai_ops xtfpga_i2s_dai_ops = { @@ -591,18 +588,13 @@ static int xtfpga_i2s_probe(struct platform_device *pdev) goto err; } - err = snd_soc_register_platform(&pdev->dev, &xtfpga_soc_platform); - if (err < 0) { - dev_err(&pdev->dev, "couldn't register platform\n"); - goto err; - } err = devm_snd_soc_register_component(&pdev->dev, &xtfpga_i2s_component, xtfpga_i2s_dai, ARRAY_SIZE(xtfpga_i2s_dai)); if (err < 0) { dev_err(&pdev->dev, "couldn't register component\n"); - goto err_unregister_platform; + goto err; } pm_runtime_enable(&pdev->dev); @@ -615,8 +607,6 @@ static int xtfpga_i2s_probe(struct platform_device *pdev) err_pm_disable: pm_runtime_disable(&pdev->dev); -err_unregister_platform: - snd_soc_unregister_platform(&pdev->dev); err: dev_err(&pdev->dev, "%s: err = %d\n", __func__, err); return err; @@ -626,7 +616,6 @@ static int xtfpga_i2s_remove(struct platform_device *pdev) { struct xtfpga_i2s *i2s = dev_get_drvdata(&pdev->dev); - snd_soc_unregister_platform(&pdev->dev); if (i2s->regmap && !IS_ERR(i2s->regmap)) { regmap_write(i2s->regmap, XTFPGA_I2S_CONFIG, 0); regmap_write(i2s->regmap, XTFPGA_I2S_INT_MASK, 0); diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 9afb8ab524c7..06b22624ab7a 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -347,17 +347,20 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret) { struct snd_usb_audio *chip = cval->head.mixer->chip; - unsigned char buf[4 + 3 * sizeof(__u32)]; /* enough space for one range */ + /* enough space for one range */ + unsigned char buf[sizeof(__u16) + 3 * sizeof(__u32)]; unsigned char *val; - int idx = 0, ret, size; + int idx = 0, ret, val_size, size; __u8 bRequest; + val_size = uac2_ctl_value_size(cval->val_type); + if (request == UAC_GET_CUR) { bRequest = UAC2_CS_CUR; - size = uac2_ctl_value_size(cval->val_type); + size = val_size; } else { bRequest = UAC2_CS_RANGE; - size = sizeof(buf); + size = sizeof(__u16) + 3 * val_size; } memset(buf, 0, sizeof(buf)); @@ -390,16 +393,17 @@ error: val = buf + sizeof(__u16); break; case UAC_GET_MAX: - val = buf + sizeof(__u16) * 2; + val = buf + sizeof(__u16) + val_size; break; case UAC_GET_RES: - val = buf + sizeof(__u16) * 3; + val = buf + sizeof(__u16) + val_size * 2; break; default: return -EINVAL; } - *value_ret = convert_signed_value(cval, snd_usb_combine_bytes(val, sizeof(__u16))); + *value_ret = convert_signed_value(cval, + snd_usb_combine_bytes(val, val_size)); return 0; } diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index b9c9a19f9588..3cbfae6604f9 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -357,6 +357,15 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, alts = &iface->altsetting[1]; goto add_sync_ep; + case USB_ID(0x1397, 0x0002): + ep = 0x81; + iface = usb_ifnum_to_if(dev, 1); + + if (!iface || iface->num_altsetting == 0) + return -EINVAL; + + alts = &iface->altsetting[1]; + goto add_sync_ep; } if (attr == USB_ENDPOINT_SYNC_ASYNC && diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 50252046b01d..754e632a27bd 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h @@ -3325,4 +3325,51 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), } }, +{ + /* + * Bower's & Wilkins PX headphones only support the 48 kHz sample rate + * even though it advertises more. The capture interface doesn't work + * even on windows. + */ + USB_DEVICE(0x19b5, 0x0021), + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .ifnum = QUIRK_ANY_INTERFACE, + .type = QUIRK_COMPOSITE, + .data = (const struct snd_usb_audio_quirk[]) { + { + .ifnum = 0, + .type = QUIRK_AUDIO_STANDARD_MIXER, + }, + /* Capture */ + { + .ifnum = 1, + .type = QUIRK_IGNORE_INTERFACE, + }, + /* Playback */ + { + .ifnum = 2, + .type = QUIRK_AUDIO_FIXED_ENDPOINT, + .data = &(const struct audioformat) { + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .channels = 2, + .iface = 2, + .altsetting = 1, + .altset_idx = 1, + .attributes = UAC_EP_CS_ATTR_FILL_MAX | + UAC_EP_CS_ATTR_SAMPLE_RATE, + .endpoint = 0x03, + .ep_attr = USB_ENDPOINT_XFER_ISOC, + .rates = SNDRV_PCM_RATE_48000, + .rate_min = 48000, + .rate_max = 48000, + .nr_rates = 1, + .rate_table = (unsigned int[]) { + 48000 + } + } + }, + } + } +}, + #undef USB_DEVICE_VENDOR_SPEC diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index a66ef5777887..ea8f3de92fa4 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -1363,8 +1363,11 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, return SNDRV_PCM_FMTBIT_DSD_U32_BE; break; - /* Amanero Combo384 USB interface with native DSD support */ - case USB_ID(0x16d0, 0x071a): + /* Amanero Combo384 USB based DACs with native DSD support */ + case USB_ID(0x16d0, 0x071a): /* Amanero - Combo384 */ + case USB_ID(0x2ab6, 0x0004): /* T+A DAC8DSD-V2.0, MP1000E-V2.0, MP2000R-V2.0, MP2500R-V2.0, MP3100HV-V2.0 */ + case USB_ID(0x2ab6, 0x0005): /* T+A USB HD Audio 1 */ + case USB_ID(0x2ab6, 0x0006): /* T+A USB HD Audio 2 */ if (fp->altsetting == 2) { switch (le16_to_cpu(chip->dev->descriptor.bcdDevice)) { case 0x199: diff --git a/sound/x86/intel_hdmi_audio.c b/sound/x86/intel_hdmi_audio.c index a0951505c7f5..4ed9d0c41843 100644 --- a/sound/x86/intel_hdmi_audio.c +++ b/sound/x86/intel_hdmi_audio.c @@ -50,6 +50,7 @@ /*standard module options for ALSA. This module supports only one card*/ static int hdmi_card_index = SNDRV_DEFAULT_IDX1; static char *hdmi_card_id = SNDRV_DEFAULT_STR1; +static bool single_port; module_param_named(index, hdmi_card_index, int, 0444); MODULE_PARM_DESC(index, @@ -57,6 +58,9 @@ MODULE_PARM_DESC(index, module_param_named(id, hdmi_card_id, charp, 0444); MODULE_PARM_DESC(id, "ID string for INTEL Intel HDMI Audio controller."); +module_param(single_port, bool, 0444); +MODULE_PARM_DESC(single_port, + "Single-port mode (for compatibility)"); /* * ELD SA bits in the CEA Speaker Allocation data block @@ -1579,7 +1583,11 @@ static irqreturn_t display_pipe_interrupt_handler(int irq, void *dev_id) static void notify_audio_lpe(struct platform_device *pdev, int port) { struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev); - struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; + struct snd_intelhad *ctx; + + ctx = &card_ctx->pcm_ctx[single_port ? 0 : port]; + if (single_port) + ctx->port = port; schedule_work(&ctx->hdmi_audio_wq); } @@ -1743,6 +1751,7 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) { struct snd_card *card; struct snd_intelhad_card *card_ctx; + struct snd_intelhad *ctx; struct snd_pcm *pcm; struct intel_hdmi_lpe_audio_pdata *pdata; int irq; @@ -1787,6 +1796,21 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) platform_set_drvdata(pdev, card_ctx); + card_ctx->num_pipes = pdata->num_pipes; + card_ctx->num_ports = single_port ? 1 : pdata->num_ports; + + for_each_port(card_ctx, port) { + ctx = &card_ctx->pcm_ctx[port]; + ctx->card_ctx = card_ctx; + ctx->dev = card_ctx->dev; + ctx->port = single_port ? -1 : port; + ctx->pipe = -1; + + spin_lock_init(&ctx->had_spinlock); + mutex_init(&ctx->mutex); + INIT_WORK(&ctx->hdmi_audio_wq, had_audio_wq); + } + dev_dbg(&pdev->dev, "%s: mmio_start = 0x%x, mmio_end = 0x%x\n", __func__, (unsigned int)res_mmio->start, (unsigned int)res_mmio->end); @@ -1816,19 +1840,12 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) init_channel_allocations(); card_ctx->num_pipes = pdata->num_pipes; - card_ctx->num_ports = pdata->num_ports; + card_ctx->num_ports = single_port ? 1 : pdata->num_ports; for_each_port(card_ctx, port) { - struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port]; int i; - ctx->card_ctx = card_ctx; - ctx->dev = card_ctx->dev; - ctx->port = port; - ctx->pipe = -1; - - INIT_WORK(&ctx->hdmi_audio_wq, had_audio_wq); - + ctx = &card_ctx->pcm_ctx[port]; ret = snd_pcm_new(card, INTEL_HAD, port, MAX_PB_STREAMS, MAX_CAP_STREAMS, &pcm); if (ret) |