| /* 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 */ |