Lines Matching +full:nand +full:- +full:related

1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (C) 2014-2017 Broadcom
20 #include <linux/pinctrl/pinconf-generic.h>
26 #include "../pinctrl-utils.h"
135 * @gpio_mux: GPIO override related information
548 CYGNUS_PIN_GROUP(nand, 0x14, 20, 0),
685 CYGNUS_PIN_FUNCTION(nand),
702 return pinctrl->num_groups; in cygnus_get_groups_count()
710 return pinctrl->groups[selector].name; in cygnus_get_group_name()
719 *pins = pinctrl->groups[selector].pins; in cygnus_get_group_pins()
720 *num_pins = pinctrl->groups[selector].num_pins; in cygnus_get_group_pins()
728 seq_printf(s, " %s", dev_name(pctrl_dev->dev)); in cygnus_pin_dbg_show()
744 return pinctrl->num_functions; in cygnus_get_functions_count()
752 return pinctrl->functions[selector].name; in cygnus_get_function_name()
762 *groups = pinctrl->functions[selector].groups; in cygnus_get_function_groups()
763 *num_groups = pinctrl->functions[selector].num_groups; in cygnus_get_function_groups()
773 const struct cygnus_mux *mux = &grp->mux; in cygnus_pinmux_set()
779 if (mux->offset != mux_log[i].mux.offset || in cygnus_pinmux_set()
780 mux->shift != mux_log[i].mux.shift) in cygnus_pinmux_set()
793 if (mux_log[i].mux.alt != mux->alt) { in cygnus_pinmux_set()
794 dev_err(pinctrl->dev, in cygnus_pinmux_set()
796 dev_err(pinctrl->dev, "func:%s grp:%s\n", in cygnus_pinmux_set()
797 func->name, grp->name); in cygnus_pinmux_set()
798 return -EINVAL; in cygnus_pinmux_set()
808 mux_log[i].mux.alt = mux->alt; in cygnus_pinmux_set()
811 spin_lock_irqsave(&pinctrl->lock, flags); in cygnus_pinmux_set()
813 val = readl(pinctrl->base0 + grp->mux.offset); in cygnus_pinmux_set()
814 val &= ~(mask << grp->mux.shift); in cygnus_pinmux_set()
815 val |= grp->mux.alt << grp->mux.shift; in cygnus_pinmux_set()
816 writel(val, pinctrl->base0 + grp->mux.offset); in cygnus_pinmux_set()
818 spin_unlock_irqrestore(&pinctrl->lock, flags); in cygnus_pinmux_set()
828 &pinctrl->functions[func_select]; in cygnus_pinmux_set_mux()
829 const struct cygnus_pin_group *grp = &pinctrl->groups[grp_select]; in cygnus_pinmux_set_mux()
831 dev_dbg(pctrl_dev->dev, "func:%u name:%s grp:%u name:%s\n", in cygnus_pinmux_set_mux()
832 func_select, func->name, grp_select, grp->name); in cygnus_pinmux_set_mux()
834 dev_dbg(pctrl_dev->dev, "offset:0x%08x shift:%u alt:%u\n", in cygnus_pinmux_set_mux()
835 grp->mux.offset, grp->mux.shift, grp->mux.alt); in cygnus_pinmux_set_mux()
837 return cygnus_pinmux_set(pinctrl, func, grp, pinctrl->mux_log); in cygnus_pinmux_set_mux()
845 const struct cygnus_gpio_mux *mux = pctrl_dev->desc->pins[pin].drv_data; in cygnus_gpio_request_enable()
850 if (!mux->is_supported) in cygnus_gpio_request_enable()
851 return -ENOTSUPP; in cygnus_gpio_request_enable()
853 spin_lock_irqsave(&pinctrl->lock, flags); in cygnus_gpio_request_enable()
855 val = readl(pinctrl->base1 + mux->offset); in cygnus_gpio_request_enable()
856 val |= 0x3 << mux->shift; in cygnus_gpio_request_enable()
857 writel(val, pinctrl->base1 + mux->offset); in cygnus_gpio_request_enable()
859 spin_unlock_irqrestore(&pinctrl->lock, flags); in cygnus_gpio_request_enable()
861 dev_dbg(pctrl_dev->dev, in cygnus_gpio_request_enable()
863 pin, mux->offset, mux->shift); in cygnus_gpio_request_enable()
873 struct cygnus_gpio_mux *mux = pctrl_dev->desc->pins[pin].drv_data; in cygnus_gpio_disable_free()
877 if (!mux->is_supported) in cygnus_gpio_disable_free()
880 spin_lock_irqsave(&pinctrl->lock, flags); in cygnus_gpio_disable_free()
882 val = readl(pinctrl->base1 + mux->offset); in cygnus_gpio_disable_free()
883 val &= ~(0x3 << mux->shift); in cygnus_gpio_disable_free()
884 writel(val, pinctrl->base1 + mux->offset); in cygnus_gpio_disable_free()
886 spin_unlock_irqrestore(&pinctrl->lock, flags); in cygnus_gpio_disable_free()
888 dev_err(pctrl_dev->dev, in cygnus_gpio_disable_free()
890 pin, mux->offset, mux->shift); in cygnus_gpio_disable_free()
903 .name = "cygnus-pinmux",
913 pinctrl->mux_log = devm_kcalloc(pinctrl->dev, CYGNUS_NUM_IOMUX, in cygnus_mux_log_init()
916 if (!pinctrl->mux_log) in cygnus_mux_log_init()
917 return -ENOMEM; in cygnus_mux_log_init()
921 log = &pinctrl->mux_log[i * CYGNUS_NUM_MUX_PER_REG in cygnus_mux_log_init()
923 log->mux.offset = i * 4; in cygnus_mux_log_init()
924 log->mux.shift = j * 4; in cygnus_mux_log_init()
925 log->mux.alt = 0; in cygnus_mux_log_init()
926 log->is_configured = false; in cygnus_mux_log_init()
940 pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL); in cygnus_pinmux_probe()
942 return -ENOMEM; in cygnus_pinmux_probe()
944 pinctrl->dev = &pdev->dev; in cygnus_pinmux_probe()
946 spin_lock_init(&pinctrl->lock); in cygnus_pinmux_probe()
948 pinctrl->base0 = devm_platform_ioremap_resource(pdev, 0); in cygnus_pinmux_probe()
949 if (IS_ERR(pinctrl->base0)) { in cygnus_pinmux_probe()
950 dev_err(&pdev->dev, "unable to map I/O space\n"); in cygnus_pinmux_probe()
951 return PTR_ERR(pinctrl->base0); in cygnus_pinmux_probe()
954 pinctrl->base1 = devm_platform_ioremap_resource(pdev, 1); in cygnus_pinmux_probe()
955 if (IS_ERR(pinctrl->base1)) { in cygnus_pinmux_probe()
956 dev_err(&pdev->dev, "unable to map I/O space\n"); in cygnus_pinmux_probe()
957 return PTR_ERR(pinctrl->base1); in cygnus_pinmux_probe()
962 dev_err(&pdev->dev, "unable to initialize IOMUX log\n"); in cygnus_pinmux_probe()
966 pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL); in cygnus_pinmux_probe()
968 return -ENOMEM; in cygnus_pinmux_probe()
976 pinctrl->groups = cygnus_pin_groups; in cygnus_pinmux_probe()
977 pinctrl->num_groups = ARRAY_SIZE(cygnus_pin_groups); in cygnus_pinmux_probe()
978 pinctrl->functions = cygnus_pin_functions; in cygnus_pinmux_probe()
979 pinctrl->num_functions = ARRAY_SIZE(cygnus_pin_functions); in cygnus_pinmux_probe()
983 pinctrl->pctl = devm_pinctrl_register(&pdev->dev, &cygnus_pinctrl_desc, in cygnus_pinmux_probe()
985 if (IS_ERR(pinctrl->pctl)) { in cygnus_pinmux_probe()
986 dev_err(&pdev->dev, "unable to register Cygnus IOMUX pinctrl\n"); in cygnus_pinmux_probe()
987 return PTR_ERR(pinctrl->pctl); in cygnus_pinmux_probe()
994 { .compatible = "brcm,cygnus-pinmux" },
1000 .name = "cygnus-pinmux",