*参照元 [#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]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS