| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * Intel Tangier pinctrl functions | |
| * | |
| * Copyright (C) 2016-2023 Intel Corporation | |
| * | |
| * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | |
| * Raag Jadav <raag.jadav@intel.com> | |
| */ | |
| #ifndef PINCTRL_TANGIER_H | |
| #define PINCTRL_TANGIER_H | |
| #include <linux/spinlock_types.h> | |
| #include <linux/types.h> | |
| #include <linux/pinctrl/pinctrl.h> | |
| #include "pinctrl-intel.h" | |
| struct device; | |
| struct platform_device; | |
| #define TNG_FAMILY_NR 64 | |
| #define TNG_FAMILY_LEN 0x400 | |
| /** | |
| * struct tng_family - Tangier pin family description | |
| * @barno: MMIO BAR number where registers for this family reside | |
| * @pin_base: Starting pin of pins in this family | |
| * @npins: Number of pins in this family | |
| * @protected: True if family is protected by access | |
| * @regs: Family specific common registers | |
| */ | |
| struct tng_family { | |
| unsigned int barno; | |
| unsigned int pin_base; | |
| size_t npins; | |
| bool protected; | |
| void __iomem *regs; | |
| }; | |
| #define TNG_FAMILY(b, s, e) \ | |
| { \ | |
| .barno = (b), \ | |
| .pin_base = (s), \ | |
| .npins = (e) - (s) + 1, \ | |
| } | |
| #define TNG_FAMILY_PROTECTED(b, s, e) \ | |
| { \ | |
| .barno = (b), \ | |
| .pin_base = (s), \ | |
| .npins = (e) - (s) + 1, \ | |
| .protected = true, \ | |
| } | |
| /** | |
| * struct tng_pinctrl - Tangier pinctrl private structure | |
| * @dev: Pointer to the device structure | |
| * @lock: Lock to serialize register access | |
| * @pctldesc: Pin controller description | |
| * @pctldev: Pointer to the pin controller device | |
| * @families: Array of families this pinctrl handles | |
| * @nfamilies: Number of families in the array | |
| * @functions: Array of functions | |
| * @nfunctions: Number of functions in the array | |
| * @groups: Array of pin groups | |
| * @ngroups: Number of groups in the array | |
| * @pins: Array of pins this pinctrl controls | |
| * @npins: Number of pins in the array | |
| */ | |
| struct tng_pinctrl { | |
| struct device *dev; | |
| raw_spinlock_t lock; | |
| struct pinctrl_desc pctldesc; | |
| struct pinctrl_dev *pctldev; | |
| /* Pin controller configuration */ | |
| const struct tng_family *families; | |
| size_t nfamilies; | |
| const struct intel_function *functions; | |
| size_t nfunctions; | |
| const struct intel_pingroup *groups; | |
| size_t ngroups; | |
| const struct pinctrl_pin_desc *pins; | |
| size_t npins; | |
| }; | |
| int devm_tng_pinctrl_probe(struct platform_device *pdev); | |
| #endif /* PINCTRL_TANGIER_H */ |