1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2020 Linaro Ltd.
5 */
6#ifndef __PINCTRL_LPASS_LPI_H__
7#define __PINCTRL_LPASS_LPI_H__
8
9#include <linux/array_size.h>
10#include <linux/bits.h>
11
12#include "../core.h"
13
14struct platform_device;
15
16struct pinctrl_pin_desc;
17
18#define LPI_SLEW_RATE_CTL_REG	0xa000
19#define LPI_TLMM_REG_OFFSET		0x1000
20#define LPI_SLEW_RATE_MAX		0x03
21#define LPI_SLEW_BITS_SIZE		0x02
22#define LPI_SLEW_RATE_MASK		GENMASK(1, 0)
23#define LPI_GPIO_CFG_REG		0x00
24#define LPI_GPIO_PULL_MASK		GENMASK(1, 0)
25#define LPI_GPIO_FUNCTION_MASK		GENMASK(5, 2)
26#define LPI_GPIO_OUT_STRENGTH_MASK	GENMASK(8, 6)
27#define LPI_GPIO_OE_MASK		BIT(9)
28#define LPI_GPIO_VALUE_REG		0x04
29#define LPI_GPIO_VALUE_IN_MASK		BIT(0)
30#define LPI_GPIO_VALUE_OUT_MASK		BIT(1)
31
32#define LPI_GPIO_BIAS_DISABLE		0x0
33#define LPI_GPIO_PULL_DOWN		0x1
34#define LPI_GPIO_KEEPER			0x2
35#define LPI_GPIO_PULL_UP		0x3
36#define LPI_GPIO_DS_TO_VAL(v)		(v / 2 - 1)
37#define LPI_NO_SLEW				-1
38
39#define LPI_FUNCTION(fname)			                \
40	[LPI_MUX_##fname] = {		                \
41		.name = #fname,				\
42		.groups = fname##_groups,               \
43		.ngroups = ARRAY_SIZE(fname##_groups),	\
44	}
45
46#define LPI_PINGROUP(id, soff, f1, f2, f3, f4)		\
47	{						\
48		.pin = id,				\
49		.slew_offset = soff,			\
50		.funcs = (int[]){			\
51			LPI_MUX_gpio,			\
52			LPI_MUX_##f1,			\
53			LPI_MUX_##f2,			\
54			LPI_MUX_##f3,			\
55			LPI_MUX_##f4,			\
56		},					\
57		.nfuncs = 5,				\
58	}
59
60/*
61 * Slew rate control is done in the same register as rest of the
62 * pin configuration.
63 */
64#define LPI_FLAG_SLEW_RATE_SAME_REG			BIT(0)
65
66struct lpi_pingroup {
67	unsigned int pin;
68	/* Bit offset in slew register for SoundWire pins only */
69	int slew_offset;
70	unsigned int *funcs;
71	unsigned int nfuncs;
72};
73
74struct lpi_function {
75	const char *name;
76	const char * const *groups;
77	unsigned int ngroups;
78};
79
80struct lpi_pinctrl_variant_data {
81	const struct pinctrl_pin_desc *pins;
82	int npins;
83	const struct lpi_pingroup *groups;
84	int ngroups;
85	const struct lpi_function *functions;
86	int nfunctions;
87	unsigned int flags;
88};
89
90int lpi_pinctrl_probe(struct platform_device *pdev);
91void lpi_pinctrl_remove(struct platform_device *pdev);
92
93#endif /*__PINCTRL_LPASS_LPI_H__*/
94