Lines Matching +full:k210 +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0-or-later
7 #include <linux/clk.h>
16 #include <linux/pinctrl/pinconf-generic.h>
21 #include <dt-bindings/pinctrl/k210-fpioa.h>
25 #include "pinctrl-utils.h"
28 * The K210 only implements 8 drive levels, even though
54 /* Strong pull up not implemented on K210 */
80 * struct k210_fpioa: Kendryte K210 FPIOA memory mapped registers
81 * @pins: 48 32-bits IO pin registers
99 struct clk *clk; member
100 struct clk *pclk;
132 * no pins 48-55).
465 { "output-polarity-invert", PIN_CONFIG_OUTPUT_INVERT, 1 },
466 { "input-polarity-invert", PIN_CONFIG_INPUT_INVERT, 1 },
487 for (i = K210_PC_DRIVE_MAX; i >= 0; i--) { in k210_pinconf_get_drive()
492 return -EINVAL; in k210_pinconf_get_drive()
500 u32 mode = k210_pinconf_mode_id_to_mode[info->mode_id]; in k210_pinmux_set_pin_function()
503 dev_dbg(pdata->dev, "set pin %u function %s (%u) -> 0x%08x\n", in k210_pinmux_set_pin_function()
504 pin, info->name, func, val); in k210_pinmux_set_pin_function()
506 writel(val, &pdata->fpioa->pins[pin]); in k210_pinmux_set_pin_function()
514 u32 val = readl(&pdata->fpioa->pins[pin]); in k210_pinconf_set_param()
517 dev_dbg(pdata->dev, "set pin %u param %u, arg 0x%x\n", in k210_pinconf_set_param()
526 return -EINVAL; in k210_pinconf_set_param()
531 return -EINVAL; in k210_pinconf_set_param()
558 val = readl(&pdata->fpioa->pins[pin]); in k210_pinconf_set_param()
588 return -EINVAL; in k210_pinconf_set_param()
591 writel(val, &pdata->fpioa->pins[pin]); in k210_pinconf_set_param()
603 return -EINVAL; in k210_pinconf_set()
621 seq_printf(s, "%#x", readl(&pdata->fpioa->pins[pin])); in k210_pinconf_dbg_show()
635 return -EINVAL; in k210_pinconf_group_set()
641 return -EINVAL; in k210_pinconf_group_set()
644 bit = BIT(selector - K210_NPINS); in k210_pinconf_group_set()
645 regmap_update_bits(pdata->sysctl_map, in k210_pinconf_group_set()
646 pdata->power_offset, in k210_pinconf_group_set()
664 ret = regmap_read(pdata->sysctl_map, pdata->power_offset, &val); in k210_pinconf_group_dbg_show()
666 dev_err(pdata->dev, "Failed to read power reg\n"); in k210_pinconf_group_dbg_show()
671 val & BIT(selector - K210_NPINS) ? "1.8" : "3.3"); in k210_pinconf_group_dbg_show()
711 return -EINVAL; in k210_pinmux_set_mux()
757 seq_printf(s, "%s", dev_name(pctldev->dev)); in k210_pinctrl_pin_dbg_show()
789 dev_err(pctldev->dev, "%pOF: could not parse node property\n", in k210_pinctrl_dt_subnode_to_map()
806 ret = -EINVAL; in k210_pinctrl_dt_subnode_to_map()
813 dev_dbg(pctldev->dev, "Pinmux %s: pin %u func %s\n", in k210_pinctrl_dt_subnode_to_map()
814 np->name, pin, func_name); in k210_pinctrl_dt_subnode_to_map()
820 dev_err(pctldev->dev, "%pOF add mux map failed %d\n", in k210_pinctrl_dt_subnode_to_map()
831 dev_err(pctldev->dev, in k210_pinctrl_dt_subnode_to_map()
890 .name = "k210-pinctrl",
902 struct k210_fpioa __iomem *fpioa = pdata->fpioa; in k210_fpioa_init_ties()
906 dev_dbg(pdata->dev, "Init pin ties\n"); in k210_fpioa_init_ties()
909 for (i = 0; i < ARRAY_SIZE(fpioa->tie_en); i++) { in k210_fpioa_init_ties()
914 dev_dbg(pdata->dev, in k210_fpioa_init_ties()
923 writel(val, &fpioa->tie_val[i]); in k210_fpioa_init_ties()
924 writel(val, &fpioa->tie_en[i]); in k210_fpioa_init_ties()
930 struct device *dev = &pdev->dev; in k210_fpioa_probe()
931 struct device_node *np = dev->of_node; in k210_fpioa_probe()
935 dev_info(dev, "K210 FPIOA pin controller\n"); in k210_fpioa_probe()
939 return -ENOMEM; in k210_fpioa_probe()
941 pdata->dev = dev; in k210_fpioa_probe()
944 pdata->fpioa = devm_platform_ioremap_resource(pdev, 0); in k210_fpioa_probe()
945 if (IS_ERR(pdata->fpioa)) in k210_fpioa_probe()
946 return PTR_ERR(pdata->fpioa); in k210_fpioa_probe()
948 pdata->clk = devm_clk_get(dev, "ref"); in k210_fpioa_probe()
949 if (IS_ERR(pdata->clk)) in k210_fpioa_probe()
950 return PTR_ERR(pdata->clk); in k210_fpioa_probe()
952 ret = clk_prepare_enable(pdata->clk); in k210_fpioa_probe()
956 pdata->pclk = devm_clk_get_optional(dev, "pclk"); in k210_fpioa_probe()
957 if (!IS_ERR(pdata->pclk)) { in k210_fpioa_probe()
958 ret = clk_prepare_enable(pdata->pclk); in k210_fpioa_probe()
963 pdata->sysctl_map = in k210_fpioa_probe()
965 "canaan,k210-sysctl-power", in k210_fpioa_probe()
966 1, &pdata->power_offset); in k210_fpioa_probe()
967 if (IS_ERR(pdata->sysctl_map)) { in k210_fpioa_probe()
968 ret = PTR_ERR(pdata->sysctl_map); in k210_fpioa_probe()
974 pdata->pctl = pinctrl_register(&k210_pinctrl_desc, dev, (void *)pdata); in k210_fpioa_probe()
975 if (IS_ERR(pdata->pctl)) { in k210_fpioa_probe()
976 ret = PTR_ERR(pdata->pctl); in k210_fpioa_probe()
983 clk_disable_unprepare(pdata->pclk); in k210_fpioa_probe()
985 clk_disable_unprepare(pdata->clk); in k210_fpioa_probe()
991 { .compatible = "canaan,k210-fpioa" },
998 .name = "k210-fpioa",