Ignore:
Timestamp:
Mar 18, 2021, 8:57:36 PM (4 years ago)
Author:
David Azarewicz
Message:

Merge changes from Paul's uniaud32next branch.

Location:
GPL/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk

  • GPL/trunk/alsa-kernel/include/sound/control.h

    r598 r679  
     1/* SPDX-License-Identifier: GPL-2.0-or-later */
    12#ifndef __SOUND_CONTROL_H
    23#define __SOUND_CONTROL_H
     
    56 *  Header file for control interface
    67 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
    7  *
    8  *
    9  *   This program is free software; you can redistribute it and/or modify
    10  *   it under the terms of the GNU General Public License as published by
    11  *   the Free Software Foundation; either version 2 of the License, or
    12  *   (at your option) any later version.
    13  *
    14  *   This program is distributed in the hope that it will be useful,
    15  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
    16  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    17  *   GNU General Public License for more details.
    18  *
    19  *   You should have received a copy of the GNU General Public License
    20  *   along with this program; if not, write to the Free Software
    21  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
    22  *
    23  */
    24 
     8 */
     9
     10#include <linux/wait.h>
     11#include <linux/nospec.h>
    2512#include <sound/asound.h>
    2613
     
    3219typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol);
    3320typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol,
    34                                     int op_flag, /* 0=read,1=write,-1=command */
     21                                    int op_flag, /* SNDRV_CTL_TLV_OP_XXX */
    3522                                    unsigned int size,
    3623                                    unsigned int __user *tlv);
    3724
     25/* internal flag for skipping validations */
     26#ifdef CONFIG_SND_CTL_VALIDATION
     27#define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK        (1 << 27)
     28#define snd_ctl_skip_validation(info) \
     29        ((info)->access & SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK)
     30#else
     31#define SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK        0
     32#define snd_ctl_skip_validation(info)           true
     33#endif
     34
     35enum {
     36        SNDRV_CTL_TLV_OP_READ = 0,
     37        SNDRV_CTL_TLV_OP_WRITE = 1,
     38        SNDRV_CTL_TLV_OP_CMD = -1,
     39};
    3840
    3941struct snd_kcontrol_new {
     
    4143        unsigned int device;            /* device/client number */
    4244        unsigned int subdevice;         /* subdevice (substream) number */
    43         unsigned char *name;            /* ASCII name of item */
     45        const char *name;               /* ASCII name of item */
    4446        unsigned int index;             /* index of item */
    4547        unsigned int access;            /* access rights */
     
    7274        } tlv;
    7375        unsigned long private_value;
    74 #ifdef TARGET_OS2
    75         void *private_ptr;
    76 #endif
    7776        void *private_data;
    7877        void (*private_free)(struct snd_kcontrol *kcontrol);
    79 #ifndef TARGET_OS2
    80         struct snd_kcontrol_volatile vd[0];     /* volatile data */
    81 #else
    82         struct snd_kcontrol_volatile vd[1];     /* volatile data */
    83 #endif
     78        struct snd_kcontrol_volatile vd[];      /* volatile data */
    8479};
    8580
     
    9691struct pid;
    9792
     93enum {
     94        SND_CTL_SUBDEV_PCM,
     95        SND_CTL_SUBDEV_RAWMIDI,
     96        SND_CTL_SUBDEV_ITEMS,
     97};
     98
    9899struct snd_ctl_file {
    99100        struct list_head list;          /* list of all control files */
    100101        struct snd_card *card;
    101102        struct pid *pid;
    102         int prefer_pcm_subdevice;
    103         int prefer_rawmidi_subdevice;
     103        int preferred_subdevice[SND_CTL_SUBDEV_ITEMS];
    104104        wait_queue_head_t change_sleep;
    105105        spinlock_t read_lock;
     
    121121int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol);
    122122int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol);
     123int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace);
    123124int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);
    124125int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id);
     126int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id,
     127                        int active);
    125128struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid);
    126129struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id);
     
    138141#endif
    139142
     143int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type);
     144
    140145static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
    141146{
    142         return id->numid - kctl->id.numid;
     147        unsigned int ioff = id->numid - kctl->id.numid;
     148        return array_index_nospec(ioff, kctl->count);
    143149}
    144150
    145151static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
    146152{
    147         return id->index - kctl->id.index;
     153        unsigned int ioff = id->index - kctl->id.index;
     154        return array_index_nospec(ioff, kctl->count);
    148155}
    149156
     
    182189struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,
    183190                                                 const unsigned int *tlv);
    184 int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave,
    185                        unsigned int flags);
    186 /* optional flags for slave */
    187 #define SND_CTL_SLAVE_NEED_UPDATE       (1 << 0)
     191int _snd_ctl_add_follower(struct snd_kcontrol *master,
     192                          struct snd_kcontrol *follower,
     193                          unsigned int flags);
     194/* optional flags for follower */
     195#define SND_CTL_FOLLOWER_NEED_UPDATE    (1 << 0)
    188196
    189197/**
    190  * snd_ctl_add_slave - Add a virtual slave control
     198 * snd_ctl_add_follower - Add a virtual follower control
    191199 * @master: vmaster element
    192  * @slave: slave element to add
    193  *
    194  * Add a virtual slave control to the given master element created via
     200 * @follower: follower element to add
     201 *
     202 * Add a virtual follower control to the given master element created via
    195203 * snd_ctl_create_virtual_master() beforehand.
    196  * Returns zero if successful or a negative error code.
    197  *
    198  * All slaves must be the same type (returning the same information
    199  * via info callback).  The fucntion doesn't check it, so it's your
     204 *
     205 * All followers must be the same type (returning the same information
     206 * via info callback).  The function doesn't check it, so it's your
    200207 * responsibility.
    201208 *
     
    204211 * logarithmic volume control (dB level) thus no linear volume,
    205212 * master can only attenuate the volume without gain
     213 *
     214 * Return: Zero if successful or a negative error code.
    206215 */
    207216static inline int
    208 snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave)
    209 {
    210         return _snd_ctl_add_slave(master, slave, 0);
     217snd_ctl_add_follower(struct snd_kcontrol *master, struct snd_kcontrol *follower)
     218{
     219        return _snd_ctl_add_follower(master, follower, 0);
    211220}
    212221
    213222/**
    214  * snd_ctl_add_slave_uncached - Add a virtual slave control
     223 * snd_ctl_add_follower_uncached - Add a virtual follower control
    215224 * @master: vmaster element
    216  * @slave: slave element to add
    217  *
    218  * Add a virtual slave control to the given master.
    219  * Unlike snd_ctl_add_slave(), the element added via this function
     225 * @follower: follower element to add
     226 *
     227 * Add a virtual follower control to the given master.
     228 * Unlike snd_ctl_add_follower(), the element added via this function
    220229 * is supposed to have volatile values, and get callback is called
    221  * at each time quried from the master.
     230 * at each time queried from the master.
    222231 *
    223232 * When the control peeks the hardware values directly and the value
    224233 * can be changed by other means than the put callback of the element,
    225234 * this function should be used to keep the value always up-to-date.
     235 *
     236 * Return: Zero if successful or a negative error code.
    226237 */
    227238static inline int
    228 snd_ctl_add_slave_uncached(struct snd_kcontrol *master,
    229                            struct snd_kcontrol *slave)
    230 {
    231         return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE);
    232 }
     239snd_ctl_add_follower_uncached(struct snd_kcontrol *master,
     240                              struct snd_kcontrol *follower)
     241{
     242        return _snd_ctl_add_follower(master, follower, SND_CTL_FOLLOWER_NEED_UPDATE);
     243}
     244
     245int snd_ctl_add_vmaster_hook(struct snd_kcontrol *kctl,
     246                             void (*hook)(void *private_data, int),
     247                             void *private_data);
     248void snd_ctl_sync_vmaster(struct snd_kcontrol *kctl, bool hook_only);
     249#define snd_ctl_sync_vmaster_hook(kctl) snd_ctl_sync_vmaster(kctl, true)
     250int snd_ctl_apply_vmaster_followers(struct snd_kcontrol *kctl,
     251                                    int (*func)(struct snd_kcontrol *vfollower,
     252                                                struct snd_kcontrol *follower,
     253                                                void *arg),
     254                                    void *arg);
     255
     256/*
     257 * Helper functions for jack-detection controls
     258 */
     259struct snd_kcontrol *
     260snd_kctl_jack_new(const char *name, struct snd_card *card);
     261void snd_kctl_jack_report(struct snd_card *card,
     262                          struct snd_kcontrol *kctl, bool status);
    233263
    234264#endif  /* __SOUND_CONTROL_H */
Note: See TracChangeset for help on using the changeset viewer.