1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Intel Tangier pinctrl functions
4 *
5 * Copyright (C) 2016, 2023 Intel Corporation
6 *
7 * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
8 *          Raag Jadav <raag.jadav@intel.com>
9 */
10
11#ifndef PINCTRL_TANGIER_H
12#define PINCTRL_TANGIER_H
13
14#include <linux/spinlock_types.h>
15#include <linux/types.h>
16
17#include <linux/pinctrl/pinctrl.h>
18
19#include "pinctrl-intel.h"
20
21struct device;
22struct platform_device;
23
24#define TNG_FAMILY_NR			64
25#define TNG_FAMILY_LEN			0x400
26
27/**
28 * struct tng_family - Tangier pin family description
29 * @barno: MMIO BAR number where registers for this family reside
30 * @pin_base: Starting pin of pins in this family
31 * @npins: Number of pins in this family
32 * @protected: True if family is protected by access
33 * @regs: Family specific common registers
34 */
35struct tng_family {
36	unsigned int barno;
37	unsigned int pin_base;
38	size_t npins;
39	bool protected;
40	void __iomem *regs;
41};
42
43#define TNG_FAMILY(b, s, e)				\
44	{						\
45		.barno = (b),				\
46		.pin_base = (s),			\
47		.npins = (e) - (s) + 1,			\
48	}
49
50#define TNG_FAMILY_PROTECTED(b, s, e)			\
51	{						\
52		.barno = (b),				\
53		.pin_base = (s),			\
54		.npins = (e) - (s) + 1,			\
55		.protected = true,			\
56	}
57
58/**
59 * struct tng_pinctrl - Tangier pinctrl private structure
60 * @dev: Pointer to the device structure
61 * @lock: Lock to serialize register access
62 * @pctldesc: Pin controller description
63 * @pctldev: Pointer to the pin controller device
64 * @families: Array of families this pinctrl handles
65 * @nfamilies: Number of families in the array
66 * @functions: Array of functions
67 * @nfunctions: Number of functions in the array
68 * @groups: Array of pin groups
69 * @ngroups: Number of groups in the array
70 * @pins: Array of pins this pinctrl controls
71 * @npins: Number of pins in the array
72 */
73struct tng_pinctrl {
74	struct device *dev;
75	raw_spinlock_t lock;
76	struct pinctrl_desc pctldesc;
77	struct pinctrl_dev *pctldev;
78
79	/* Pin controller configuration */
80	const struct tng_family *families;
81	size_t nfamilies;
82	const struct intel_function *functions;
83	size_t nfunctions;
84	const struct intel_pingroup *groups;
85	size_t ngroups;
86	const struct pinctrl_pin_desc *pins;
87	size_t npins;
88};
89
90int devm_tng_pinctrl_probe(struct platform_device *pdev);
91
92#endif /* PINCTRL_TANGIER_H */
93