162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci * Copyright (c) 2020 Linaro Ltd.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef __PINCTRL_LPASS_LPI_H__
762306a36Sopenharmony_ci#define __PINCTRL_LPASS_LPI_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/bits.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "../core.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct platform_device;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct pinctrl_pin_desc;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define LPI_SLEW_RATE_CTL_REG	0xa000
1962306a36Sopenharmony_ci#define LPI_TLMM_REG_OFFSET		0x1000
2062306a36Sopenharmony_ci#define LPI_SLEW_RATE_MAX		0x03
2162306a36Sopenharmony_ci#define LPI_SLEW_BITS_SIZE		0x02
2262306a36Sopenharmony_ci#define LPI_SLEW_RATE_MASK		GENMASK(1, 0)
2362306a36Sopenharmony_ci#define LPI_GPIO_CFG_REG		0x00
2462306a36Sopenharmony_ci#define LPI_GPIO_PULL_MASK		GENMASK(1, 0)
2562306a36Sopenharmony_ci#define LPI_GPIO_FUNCTION_MASK		GENMASK(5, 2)
2662306a36Sopenharmony_ci#define LPI_GPIO_OUT_STRENGTH_MASK	GENMASK(8, 6)
2762306a36Sopenharmony_ci#define LPI_GPIO_OE_MASK		BIT(9)
2862306a36Sopenharmony_ci#define LPI_GPIO_VALUE_REG		0x04
2962306a36Sopenharmony_ci#define LPI_GPIO_VALUE_IN_MASK		BIT(0)
3062306a36Sopenharmony_ci#define LPI_GPIO_VALUE_OUT_MASK		BIT(1)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define LPI_GPIO_BIAS_DISABLE		0x0
3362306a36Sopenharmony_ci#define LPI_GPIO_PULL_DOWN		0x1
3462306a36Sopenharmony_ci#define LPI_GPIO_KEEPER			0x2
3562306a36Sopenharmony_ci#define LPI_GPIO_PULL_UP		0x3
3662306a36Sopenharmony_ci#define LPI_GPIO_DS_TO_VAL(v)		(v / 2 - 1)
3762306a36Sopenharmony_ci#define LPI_NO_SLEW				-1
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define LPI_FUNCTION(fname)			                \
4062306a36Sopenharmony_ci	[LPI_MUX_##fname] = {		                \
4162306a36Sopenharmony_ci		.name = #fname,				\
4262306a36Sopenharmony_ci		.groups = fname##_groups,               \
4362306a36Sopenharmony_ci		.ngroups = ARRAY_SIZE(fname##_groups),	\
4462306a36Sopenharmony_ci	}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define LPI_PINGROUP(id, soff, f1, f2, f3, f4)		\
4762306a36Sopenharmony_ci	{						\
4862306a36Sopenharmony_ci		.group.name = "gpio" #id,			\
4962306a36Sopenharmony_ci		.group.pins = gpio##id##_pins,		\
5062306a36Sopenharmony_ci		.pin = id,				\
5162306a36Sopenharmony_ci		.slew_offset = soff,			\
5262306a36Sopenharmony_ci		.group.num_pins = ARRAY_SIZE(gpio##id##_pins),	\
5362306a36Sopenharmony_ci		.funcs = (int[]){			\
5462306a36Sopenharmony_ci			LPI_MUX_gpio,			\
5562306a36Sopenharmony_ci			LPI_MUX_##f1,			\
5662306a36Sopenharmony_ci			LPI_MUX_##f2,			\
5762306a36Sopenharmony_ci			LPI_MUX_##f3,			\
5862306a36Sopenharmony_ci			LPI_MUX_##f4,			\
5962306a36Sopenharmony_ci		},					\
6062306a36Sopenharmony_ci		.nfuncs = 5,				\
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct lpi_pingroup {
6462306a36Sopenharmony_ci	struct group_desc group;
6562306a36Sopenharmony_ci	unsigned int pin;
6662306a36Sopenharmony_ci	/* Bit offset in slew register for SoundWire pins only */
6762306a36Sopenharmony_ci	int slew_offset;
6862306a36Sopenharmony_ci	unsigned int *funcs;
6962306a36Sopenharmony_ci	unsigned int nfuncs;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct lpi_function {
7362306a36Sopenharmony_ci	const char *name;
7462306a36Sopenharmony_ci	const char * const *groups;
7562306a36Sopenharmony_ci	unsigned int ngroups;
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistruct lpi_pinctrl_variant_data {
7962306a36Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
8062306a36Sopenharmony_ci	int npins;
8162306a36Sopenharmony_ci	const struct lpi_pingroup *groups;
8262306a36Sopenharmony_ci	int ngroups;
8362306a36Sopenharmony_ci	const struct lpi_function *functions;
8462306a36Sopenharmony_ci	int nfunctions;
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciint lpi_pinctrl_probe(struct platform_device *pdev);
8862306a36Sopenharmony_ciint lpi_pinctrl_remove(struct platform_device *pdev);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#endif /*__PINCTRL_LPASS_LPI_H__*/
91