Lines Matching +full:spin +full:- +full:up
1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/pinctrl/pinconf-generic.h>
19 #include "../pinctrl-utils.h"
22 #include "pinctrl-k1.h"
25 * +---------+----------+-----------+--------+--------+----------+--------+
27 * | up/down | strength | trigger | rate | detect | pull | mode |
28 * +---------+----------+-----------+--------+--------+----------+--------+
128 return pctrl->regs + spacemit_pin_to_offset(pin); in spacemit_pin_to_reg()
144 const struct spacemit_pin *pdata = pctrl->data->data; in spacemit_get_pin()
147 for (i = 0; i < pctrl->data->npins; i++) { in spacemit_get_pin()
158 return K1_PIN_GET_IO_TYPE(pin->flags); in spacemit_to_pin_io_type()
173 const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); in spacemit_pctrl_dbg_show() local
174 enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin); in spacemit_pctrl_dbg_show()
214 return tbl[num - 1].val; in spacemit_get_ds_value()
269 struct device *dev = pctrl->dev; in spacemit_pctrl_check_power()
273 of_property_read_u32(dn, "power-source", &power); in spacemit_pctrl_check_power()
288 return -ENOTSUPP; in spacemit_pctrl_check_power()
301 struct device *dev = pctrl->dev; in spacemit_pctrl_dt_node_to_map()
315 return -ENOMEM; in spacemit_pctrl_dt_node_to_map()
319 return -ENOMEM; in spacemit_pctrl_dt_node_to_map()
322 guard(mutex)(&pctrl->mutex); in spacemit_pctrl_dt_node_to_map()
333 return -EINVAL; in spacemit_pctrl_dt_node_to_map()
339 return -ENOMEM; in spacemit_pctrl_dt_node_to_map()
345 return -ENOMEM; in spacemit_pctrl_dt_node_to_map()
349 return -ENOMEM; in spacemit_pctrl_dt_node_to_map()
356 return -EINVAL; in spacemit_pctrl_dt_node_to_map()
363 return dev_err_probe(dev, -ENODEV, "failed to get pin %d\n", pins[i]); in spacemit_pctrl_dt_node_to_map()
372 map[nmaps].data.mux.function = np->name; in spacemit_pctrl_dt_node_to_map()
396 ret = pinmux_generic_add_function(pctldev, np->name, in spacemit_pctrl_dt_node_to_map()
400 return dev_err_probe(dev, ret, "error adding function %s\n", np->name); in spacemit_pctrl_dt_node_to_map()
429 return -EINVAL; in spacemit_pmx_set_mux()
431 configs = group->data; in spacemit_pmx_set_mux()
433 for (i = 0; i < group->grp.npins; i++) { in spacemit_pmx_set_mux()
434 const struct spacemit_pin *spin = configs[i].pin; in spacemit_pmx_set_mux() local
437 reg = spacemit_pin_to_reg(pctrl, spin->pin); in spacemit_pmx_set_mux()
440 guard(raw_spinlock_irqsave)(&pctrl->lock); in spacemit_pmx_set_mux()
453 const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); in spacemit_request_gpio() local
457 guard(raw_spinlock_irqsave)(&pctrl->lock); in spacemit_request_gpio()
458 writel_relaxed(spin->gpiofunc, reg); in spacemit_request_gpio()
480 return -EINVAL; in spacemit_pinconf_get()
492 return -EINVAL; in spacemit_pinconf_get()
502 static int spacemit_pinconf_generate_config(const struct spacemit_pin *spin, in spacemit_pinconf_generate_config() argument
512 if (!spin) in spacemit_pinconf_generate_config()
513 return -EINVAL; in spacemit_pinconf_generate_config()
556 return -EINVAL; in spacemit_pinconf_generate_config()
561 type = spacemit_to_pin_io_type(spin); in spacemit_pinconf_generate_config()
573 return -EINVAL; in spacemit_pinconf_generate_config()
589 return -EINVAL; in spacemit_pinconf_generate_config()
593 slew_rate = slew_rate > 1 ? (slew_rate - 2) : 0; in spacemit_pinconf_generate_config()
606 const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); in spacemit_pin_set_config() local
611 return -EINVAL; in spacemit_pin_set_config()
613 reg = spacemit_pin_to_reg(pctrl, spin->pin); in spacemit_pin_set_config()
615 guard(raw_spinlock_irqsave)(&pctrl->lock); in spacemit_pin_set_config()
627 const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); in spacemit_pinconf_set() local
630 if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value)) in spacemit_pinconf_set()
631 return -EINVAL; in spacemit_pinconf_set()
642 const struct spacemit_pin *spin; in spacemit_pinconf_group_set() local
649 return -EINVAL; in spacemit_pinconf_group_set()
651 spin = spacemit_get_pin(pctrl, group->grp.pins[0]); in spacemit_pinconf_group_set()
652 if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value)) in spacemit_pinconf_group_set()
653 return -EINVAL; in spacemit_pinconf_group_set()
655 for (i = 0; i < group->grp.npins; i++) in spacemit_pinconf_group_set()
656 spacemit_pin_set_config(pctrl, group->grp.pins[i], value); in spacemit_pinconf_group_set()
677 seq_puts(seq, ", bias strong pull up"); in spacemit_pinconf_dbg_pull()
679 seq_puts(seq, ", bias normal pull up"); in spacemit_pinconf_dbg_pull()
686 const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); in spacemit_pinconf_dbg_show() local
687 enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin); in spacemit_pinconf_dbg_show()
721 struct device *dev = &pdev->dev; in spacemit_pinctrl_probe()
728 return -ENODEV; in spacemit_pinctrl_probe()
730 if (pctrl_data->npins == 0) in spacemit_pinctrl_probe()
731 return dev_err_probe(dev, -EINVAL, "invalid pin data\n"); in spacemit_pinctrl_probe()
735 return -ENOMEM; in spacemit_pinctrl_probe()
737 pctrl->regs = devm_platform_ioremap_resource(pdev, 0); in spacemit_pinctrl_probe()
738 if (IS_ERR(pctrl->regs)) in spacemit_pinctrl_probe()
739 return PTR_ERR(pctrl->regs); in spacemit_pinctrl_probe()
741 pctrl->pdesc.name = dev_name(dev); in spacemit_pinctrl_probe()
742 pctrl->pdesc.pins = pctrl_data->pins; in spacemit_pinctrl_probe()
743 pctrl->pdesc.npins = pctrl_data->npins; in spacemit_pinctrl_probe()
744 pctrl->pdesc.pctlops = &spacemit_pctrl_ops; in spacemit_pinctrl_probe()
745 pctrl->pdesc.pmxops = &spacemit_pmx_ops; in spacemit_pinctrl_probe()
746 pctrl->pdesc.confops = &spacemit_pinconf_ops; in spacemit_pinctrl_probe()
747 pctrl->pdesc.owner = THIS_MODULE; in spacemit_pinctrl_probe()
749 pctrl->data = pctrl_data; in spacemit_pinctrl_probe()
750 pctrl->dev = dev; in spacemit_pinctrl_probe()
751 raw_spin_lock_init(&pctrl->lock); in spacemit_pinctrl_probe()
752 mutex_init(&pctrl->mutex); in spacemit_pinctrl_probe()
756 ret = devm_pinctrl_register_and_init(dev, &pctrl->pdesc, in spacemit_pinctrl_probe()
757 pctrl, &pctrl->pctl_dev); in spacemit_pinctrl_probe()
762 return pinctrl_enable(pctrl->pctl_dev); in spacemit_pinctrl_probe()
1034 { .compatible = "spacemit,k1-pinctrl", .data = &k1_pinctrl_data },
1042 .name = "k1-pinctrl",