162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Intel Tangier pinctrl functions
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2016, 2023 Intel Corporation
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
862306a36Sopenharmony_ci *          Raag Jadav <raag.jadav@intel.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef PINCTRL_TANGIER_H
1262306a36Sopenharmony_ci#define PINCTRL_TANGIER_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/spinlock_types.h>
1562306a36Sopenharmony_ci#include <linux/types.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "pinctrl-intel.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistruct device;
2262306a36Sopenharmony_cistruct platform_device;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define TNG_FAMILY_NR			64
2562306a36Sopenharmony_ci#define TNG_FAMILY_LEN			0x400
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/**
2862306a36Sopenharmony_ci * struct tng_family - Tangier pin family description
2962306a36Sopenharmony_ci * @barno: MMIO BAR number where registers for this family reside
3062306a36Sopenharmony_ci * @pin_base: Starting pin of pins in this family
3162306a36Sopenharmony_ci * @npins: Number of pins in this family
3262306a36Sopenharmony_ci * @protected: True if family is protected by access
3362306a36Sopenharmony_ci * @regs: Family specific common registers
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_cistruct tng_family {
3662306a36Sopenharmony_ci	unsigned int barno;
3762306a36Sopenharmony_ci	unsigned int pin_base;
3862306a36Sopenharmony_ci	size_t npins;
3962306a36Sopenharmony_ci	bool protected;
4062306a36Sopenharmony_ci	void __iomem *regs;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define TNG_FAMILY(b, s, e)				\
4462306a36Sopenharmony_ci	{						\
4562306a36Sopenharmony_ci		.barno = (b),				\
4662306a36Sopenharmony_ci		.pin_base = (s),			\
4762306a36Sopenharmony_ci		.npins = (e) - (s) + 1,			\
4862306a36Sopenharmony_ci	}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define TNG_FAMILY_PROTECTED(b, s, e)			\
5162306a36Sopenharmony_ci	{						\
5262306a36Sopenharmony_ci		.barno = (b),				\
5362306a36Sopenharmony_ci		.pin_base = (s),			\
5462306a36Sopenharmony_ci		.npins = (e) - (s) + 1,			\
5562306a36Sopenharmony_ci		.protected = true,			\
5662306a36Sopenharmony_ci	}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/**
5962306a36Sopenharmony_ci * struct tng_pinctrl - Tangier pinctrl private structure
6062306a36Sopenharmony_ci * @dev: Pointer to the device structure
6162306a36Sopenharmony_ci * @lock: Lock to serialize register access
6262306a36Sopenharmony_ci * @pctldesc: Pin controller description
6362306a36Sopenharmony_ci * @pctldev: Pointer to the pin controller device
6462306a36Sopenharmony_ci * @families: Array of families this pinctrl handles
6562306a36Sopenharmony_ci * @nfamilies: Number of families in the array
6662306a36Sopenharmony_ci * @functions: Array of functions
6762306a36Sopenharmony_ci * @nfunctions: Number of functions in the array
6862306a36Sopenharmony_ci * @groups: Array of pin groups
6962306a36Sopenharmony_ci * @ngroups: Number of groups in the array
7062306a36Sopenharmony_ci * @pins: Array of pins this pinctrl controls
7162306a36Sopenharmony_ci * @npins: Number of pins in the array
7262306a36Sopenharmony_ci */
7362306a36Sopenharmony_cistruct tng_pinctrl {
7462306a36Sopenharmony_ci	struct device *dev;
7562306a36Sopenharmony_ci	raw_spinlock_t lock;
7662306a36Sopenharmony_ci	struct pinctrl_desc pctldesc;
7762306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* Pin controller configuration */
8062306a36Sopenharmony_ci	const struct tng_family *families;
8162306a36Sopenharmony_ci	size_t nfamilies;
8262306a36Sopenharmony_ci	const struct intel_function *functions;
8362306a36Sopenharmony_ci	size_t nfunctions;
8462306a36Sopenharmony_ci	const struct intel_pingroup *groups;
8562306a36Sopenharmony_ci	size_t ngroups;
8662306a36Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
8762306a36Sopenharmony_ci	size_t npins;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciint devm_tng_pinctrl_probe(struct platform_device *pdev);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#endif /* PINCTRL_TANGIER_H */
93