参照元

説明

引数

返り値

参考

実装

CONFIG_GPIOLIB 有効: sound/soc/soc-jack.c

/**
 * snd_soc_jack_add_gpios - Associate GPIO pins with an ASoC jack
 *
 * @jack:  ASoC jack
 * @count: number of pins
 * @gpios: array of gpio pins
 *
 * This function will request gpio, set data direction and request irq
 * for each gpio in the array.
 */
int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
                        struct snd_soc_jack_gpio *gpios)
{
        int i, ret;

        for (i = 0; i < count; i++) {
                if (!gpios[i].name) {
                        dev_err(jack->card->dev,
                                "ASoC: No name for gpio at index %d\n", i);
                        ret = -EINVAL;
                        goto undo;
                }
                if (gpios[i].desc) {
                        /* Already have a GPIO descriptor. */
                        goto got_gpio;
                } else if (gpios[i].gpiod_dev) {
                        /* Get a GPIO descriptor */
                        gpios[i].desc = gpiod_get_index(gpios[i].gpiod_dev,
                                                        gpios[i].name,
                                                        gpios[i].idx, GPIOD_IN);
                        if (IS_ERR(gpios[i].desc)) {
                                ret = PTR_ERR(gpios[i].desc);
                                dev_err(gpios[i].gpiod_dev,
                                        "ASoC: Cannot get gpio at index %d: %d",
                                        i, ret);
                                goto undo;
                        }
                } else {
                        /* legacy GPIO number */
                        if (!gpio_is_valid(gpios[i].gpio)) {
                                dev_err(jack->card->dev,
                                        "ASoC: Invalid gpio %d\n",
                                        gpios[i].gpio);
                                ret = -EINVAL;
                                goto undo;
                        }
                        ret = gpio_request_one(gpios[i].gpio, GPIOF_IN,
                                               gpios[i].name);
                        if (ret)
                                goto undo;
                        gpios[i].desc = gpio_to_desc(gpios[i].gpio);
                }
got_gpio:
                INIT_DELAYED_WORK(&gpios[i].work, gpio_work);
                gpios[i].jack = jack;
                ret = request_any_context_irq(gpiod_to_irq(gpios[i].desc),
                                              gpio_handler,
                                              IRQF_TRIGGER_RISING |
                                              IRQF_TRIGGER_FALLING,
                                              gpios[i].name,
                                              &gpios[i]);
                if (ret < 0)
                        goto err;
                if (gpios[i].wake) {
                        ret = irq_set_irq_wake(gpiod_to_irq(gpios[i].desc), 1);
                        if (ret != 0)
                                dev_err(jack->card->dev,
                                        "ASoC: Failed to mark GPIO at index %d as wake source: %d\n",
                                        i, ret);
                }
                /* Expose GPIO value over sysfs for diagnostic purposes */
                gpiod_export(gpios[i].desc, false);
                /* Update initial jack status */
                schedule_delayed_work(&gpios[i].work,
                                      msecs_to_jiffies(gpios[i].debounce_time));
        }
        return 0;

err:
        gpio_free(gpios[i].gpio);
undo:
        snd_soc_jack_free_gpios(jack, i, gpios);
        return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_jack_add_gpios);

CONFIG_GPIOLIB 無効: include/sound/soc.h

static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
                                         struct snd_soc_jack_gpio *gpios)
{
        return 0;
}

コメント


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-27 (水) 18:30:03