*参照元 [#lbbf9126] #backlinks *説明 [#wb85fdfa] -パス: 複数あり --CONFIG_GPIOLIB 有効: [[linux-4.4.1/sound/soc/soc-jack.c]] --CONFIG_GPIOLIB 無効: [[linux-4.4.1/include/sound/soc.h]] -FIXME: これは何? --説明 **引数 [#xa83da75] -struct snd_soc_jack *jack -- --[[linux-4.4.1/snd_soc_jack]] -int count -- -struct snd_soc_jack_gpio *gpios -- --[[linux-4.4.1/snd_soc_jack_gpio]] **返り値 [#qe3cacd5] -int -- **参考 [#ie37d567] *実装 [#me3f8391] **CONFIG_GPIOLIB 有効: sound/soc/soc-jack.c [#wc8c029a] /** * 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; } - --[[linux-4.4.1/dev_err()]] 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; } - --[[linux-4.4.1/gpiod_get_index()]] --[[linux-4.4.1/IS_ERR()]] --[[linux-4.4.1/PTR_ERR()]] } 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; } - --[[linux-4.4.1/gpio_is_valid()]] ret = gpio_request_one(gpios[i].gpio, GPIOF_IN, gpios[i].name); if (ret) goto undo; - --[[linux-4.4.1/gpio_request_one()]] gpios[i].desc = gpio_to_desc(gpios[i].gpio); - --[[linux-4.4.1/gpio_to_desc()]] } got_gpio: INIT_DELAYED_WORK(&gpios[i].work, gpio_work); gpios[i].jack = jack; - --[[linux-4.4.1/INIT_DELAYED_WORK()]] --[[linux-4.4.1/gpio_work()]] 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; - --[[linux-4.4.1/request_any_context_irq()]] --[[linux-4.4.1/gpiod_to_irq()]] --[[linux-4.4.1/gpio_handler()]] 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); } - --[[linux-4.4.1/irq_set_irq_wake()]] /* Expose GPIO value over sysfs for diagnostic purposes */ gpiod_export(gpios[i].desc, false); - --[[linux-4.4.1/gpiod_export()]] /* Update initial jack status */ schedule_delayed_work(&gpios[i].work, msecs_to_jiffies(gpios[i].debounce_time)); } - --[[linux-4.4.1/schedule_delayed_work()]] --[[linux-4.4.1/msecs_to_jiffies()]] return 0; err: gpio_free(gpios[i].gpio); undo: snd_soc_jack_free_gpios(jack, i, gpios); - --[[linux-4.4.1/gpio_free()]] --[[linux-4.4.1/snd_soc_jack_free_gpios()]] return ret; } EXPORT_SYMBOL_GPL(snd_soc_jack_add_gpios); - --[[linux-4.4.1/EXPORT_SYMBOL_GPL()]] **CONFIG_GPIOLIB 無効: include/sound/soc.h [#vb57945d] static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, struct snd_soc_jack_gpio *gpios) { return 0; } *コメント [#obe4e477]