Lines Matching +full:gpio +full:- +full:cfg

1 // SPDX-License-Identifier: GPL-2.0+
3 // soc-ac97.c -- ALSA SoC Audio Layer AC97 support
11 // with code, comments and ideas from :-
17 #include <linux/gpio.h>
18 #include <linux/gpio/driver.h>
57 return gpio_priv->component; in gpio_to_component()
63 return -EINVAL; in snd_soc_ac97_gpio_request()
73 dev_dbg(component->dev, "set gpio %d to output\n", offset); in snd_soc_ac97_gpio_direction_in()
85 dev_dbg(component->dev, "get gpio %d : %d\n", offset, in snd_soc_ac97_gpio_get()
97 gpio_priv->gpios_set &= ~(1 << offset); in snd_soc_ac97_gpio_set()
98 gpio_priv->gpios_set |= (!!value) << offset; in snd_soc_ac97_gpio_set()
100 gpio_priv->gpios_set); in snd_soc_ac97_gpio_set()
101 dev_dbg(component->dev, "set gpio %d to %d\n", offset, !!value); in snd_soc_ac97_gpio_set()
109 dev_dbg(component->dev, "set gpio %d to output\n", offset); in snd_soc_ac97_gpio_direction_out()
132 gpio_priv = devm_kzalloc(component->dev, sizeof(*gpio_priv), GFP_KERNEL); in snd_soc_ac97_init_gpio()
134 return -ENOMEM; in snd_soc_ac97_init_gpio()
135 ac97->gpio_priv = gpio_priv; in snd_soc_ac97_init_gpio()
136 gpio_priv->component = component; in snd_soc_ac97_init_gpio()
137 gpio_priv->gpio_chip = snd_soc_ac97_gpio_chip; in snd_soc_ac97_init_gpio()
138 gpio_priv->gpio_chip.ngpio = AC97_NUM_GPIOS; in snd_soc_ac97_init_gpio()
139 gpio_priv->gpio_chip.parent = component->dev; in snd_soc_ac97_init_gpio()
140 gpio_priv->gpio_chip.base = -1; in snd_soc_ac97_init_gpio()
142 ret = gpiochip_add_data(&gpio_priv->gpio_chip, gpio_priv); in snd_soc_ac97_init_gpio()
144 dev_err(component->dev, "Failed to add GPIOs: %d\n", ret); in snd_soc_ac97_init_gpio()
150 gpiochip_remove(&ac97->gpio_priv->gpio_chip); in snd_soc_ac97_free_gpio()
165 * snd_soc_alloc_ac97_component() - Allocate new a AC'97 device
169 * it. The caller is responsible to either call device_add(&ac97->dev) to
170 * register the device, or to call put_device(&ac97->dev) to free the device.
180 return ERR_PTR(-ENOMEM); in snd_soc_alloc_ac97_component()
182 ac97->bus = &soc_ac97_bus; in snd_soc_alloc_ac97_component()
183 ac97->num = 0; in snd_soc_alloc_ac97_component()
185 ac97->dev.bus = &ac97_bus_type; in snd_soc_alloc_ac97_component()
186 ac97->dev.parent = component->card->dev; in snd_soc_alloc_ac97_component()
187 ac97->dev.release = soc_ac97_device_release; in snd_soc_alloc_ac97_component()
189 dev_set_name(&ac97->dev, "%d-%d:%s", in snd_soc_alloc_ac97_component()
190 component->card->snd_card->number, 0, in snd_soc_alloc_ac97_component()
191 component->name); in snd_soc_alloc_ac97_component()
193 device_initialize(&ac97->dev); in snd_soc_alloc_ac97_component()
200 * snd_soc_new_ac97_component - initailise AC97 device
205 * Initialises AC97 component resources for use by ad-hoc devices only.
226 dev_err(component->dev, "Failed to reset AC97 device: %d\n", in snd_soc_new_ac97_component()
232 ret = device_add(&ac97->dev); in snd_soc_new_ac97_component()
243 put_device(&ac97->dev); in snd_soc_new_ac97_component()
249 * snd_soc_free_ac97_component - free AC97 component device
257 device_del(&ac97->dev); in snd_soc_free_ac97_component()
258 ac97->bus = NULL; in snd_soc_free_ac97_component()
259 put_device(&ac97->dev); in snd_soc_free_ac97_component()
300 struct snd_ac97_reset_cfg *cfg) in snd_soc_ac97_parse_pinctl() argument
304 int gpio; in snd_soc_ac97_parse_pinctl() local
312 cfg->pctl = p; in snd_soc_ac97_parse_pinctl()
314 state = pinctrl_lookup_state(p, "ac97-reset"); in snd_soc_ac97_parse_pinctl()
316 dev_err(dev, "Can't find pinctrl state ac97-reset\n"); in snd_soc_ac97_parse_pinctl()
319 cfg->pstate_reset = state; in snd_soc_ac97_parse_pinctl()
321 state = pinctrl_lookup_state(p, "ac97-warm-reset"); in snd_soc_ac97_parse_pinctl()
323 dev_err(dev, "Can't find pinctrl state ac97-warm-reset\n"); in snd_soc_ac97_parse_pinctl()
326 cfg->pstate_warm_reset = state; in snd_soc_ac97_parse_pinctl()
328 state = pinctrl_lookup_state(p, "ac97-running"); in snd_soc_ac97_parse_pinctl()
330 dev_err(dev, "Can't find pinctrl state ac97-running\n"); in snd_soc_ac97_parse_pinctl()
333 cfg->pstate_run = state; in snd_soc_ac97_parse_pinctl()
335 gpio = of_get_named_gpio(dev->of_node, "ac97-gpios", 0); in snd_soc_ac97_parse_pinctl()
336 if (gpio < 0) { in snd_soc_ac97_parse_pinctl()
337 dev_err(dev, "Can't find ac97-sync gpio\n"); in snd_soc_ac97_parse_pinctl()
338 return gpio; in snd_soc_ac97_parse_pinctl()
340 ret = devm_gpio_request(dev, gpio, "AC97 link sync"); in snd_soc_ac97_parse_pinctl()
342 dev_err(dev, "Failed requesting ac97-sync gpio\n"); in snd_soc_ac97_parse_pinctl()
345 cfg->gpio_sync = gpio; in snd_soc_ac97_parse_pinctl()
347 gpio = of_get_named_gpio(dev->of_node, "ac97-gpios", 1); in snd_soc_ac97_parse_pinctl()
348 if (gpio < 0) { in snd_soc_ac97_parse_pinctl()
349 dev_err(dev, "Can't find ac97-sdata gpio %d\n", gpio); in snd_soc_ac97_parse_pinctl()
350 return gpio; in snd_soc_ac97_parse_pinctl()
352 ret = devm_gpio_request(dev, gpio, "AC97 link sdata"); in snd_soc_ac97_parse_pinctl()
354 dev_err(dev, "Failed requesting ac97-sdata gpio\n"); in snd_soc_ac97_parse_pinctl()
357 cfg->gpio_sdata = gpio; in snd_soc_ac97_parse_pinctl()
359 gpio = of_get_named_gpio(dev->of_node, "ac97-gpios", 2); in snd_soc_ac97_parse_pinctl()
360 if (gpio < 0) { in snd_soc_ac97_parse_pinctl()
361 dev_err(dev, "Can't find ac97-reset gpio\n"); in snd_soc_ac97_parse_pinctl()
362 return gpio; in snd_soc_ac97_parse_pinctl()
364 ret = devm_gpio_request(dev, gpio, "AC97 link reset"); in snd_soc_ac97_parse_pinctl()
366 dev_err(dev, "Failed requesting ac97-reset gpio\n"); in snd_soc_ac97_parse_pinctl()
369 cfg->gpio_reset = gpio; in snd_soc_ac97_parse_pinctl()
383 return -EBUSY; in snd_soc_set_ac97_ops()
393 * snd_soc_set_ac97_ops_of_reset - Set ac97 ops with generic ac97 reset functions
398 * the device node of pdev to get pinctrl states and gpio numbers to use.
403 struct device *dev = &pdev->dev; in snd_soc_set_ac97_ops_of_reset()
404 struct snd_ac97_reset_cfg cfg; in snd_soc_set_ac97_ops_of_reset() local
407 ret = snd_soc_ac97_parse_pinctl(dev, &cfg); in snd_soc_set_ac97_ops_of_reset()
415 ops->warm_reset = snd_soc_ac97_warm_reset; in snd_soc_set_ac97_ops_of_reset()
416 ops->reset = snd_soc_ac97_reset; in snd_soc_set_ac97_ops_of_reset()
418 snd_ac97_rst_cfg = cfg; in snd_soc_set_ac97_ops_of_reset()