Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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/bitops.h>
10#include <linux/bitfield.h>
11#include "../core.h"
12
13#define LPI_SLEW_RATE_CTL_REG 0xa000
14#define LPI_TLMM_REG_OFFSET 0x1000
15#define LPI_SLEW_RATE_MAX 0x03
16#define LPI_SLEW_BITS_SIZE 0x02
17#define LPI_SLEW_RATE_MASK GENMASK(1, 0)
18#define LPI_GPIO_CFG_REG 0x00
19#define LPI_GPIO_PULL_MASK GENMASK(1, 0)
20#define LPI_GPIO_FUNCTION_MASK GENMASK(5, 2)
21#define LPI_GPIO_OUT_STRENGTH_MASK GENMASK(8, 6)
22#define LPI_GPIO_OE_MASK BIT(9)
23#define LPI_GPIO_VALUE_REG 0x04
24#define LPI_GPIO_VALUE_IN_MASK BIT(0)
25#define LPI_GPIO_VALUE_OUT_MASK BIT(1)
26
27#define LPI_GPIO_BIAS_DISABLE 0x0
28#define LPI_GPIO_PULL_DOWN 0x1
29#define LPI_GPIO_KEEPER 0x2
30#define LPI_GPIO_PULL_UP 0x3
31#define LPI_GPIO_DS_TO_VAL(v) (v / 2 - 1)
32#define LPI_NO_SLEW -1
33
34#define LPI_FUNCTION(fname) \
35 [LPI_MUX_##fname] = { \
36 .name = #fname, \
37 .groups = fname##_groups, \
38 .ngroups = ARRAY_SIZE(fname##_groups), \
39 }
40
41#define LPI_PINGROUP(id, soff, f1, f2, f3, f4) \
42 { \
43 .group.name = "gpio" #id, \
44 .group.pins = gpio##id##_pins, \
45 .pin = id, \
46 .slew_offset = soff, \
47 .group.num_pins = ARRAY_SIZE(gpio##id##_pins), \
48 .funcs = (int[]){ \
49 LPI_MUX_gpio, \
50 LPI_MUX_##f1, \
51 LPI_MUX_##f2, \
52 LPI_MUX_##f3, \
53 LPI_MUX_##f4, \
54 }, \
55 .nfuncs = 5, \
56 }
57
58struct lpi_pingroup {
59 struct group_desc group;
60 unsigned int pin;
61 /* Bit offset in slew register for SoundWire pins only */
62 int slew_offset;
63 unsigned int *funcs;
64 unsigned int nfuncs;
65};
66
67struct lpi_function {
68 const char *name;
69 const char * const *groups;
70 unsigned int ngroups;
71};
72
73struct lpi_pinctrl_variant_data {
74 const struct pinctrl_pin_desc *pins;
75 int npins;
76 const struct lpi_pingroup *groups;
77 int ngroups;
78 const struct lpi_function *functions;
79 int nfunctions;
80 bool is_clk_optional;
81};
82
83int lpi_pinctrl_probe(struct platform_device *pdev);
84int lpi_pinctrl_remove(struct platform_device *pdev);
85
86#endif /*__PINCTRL_LPASS_LPI_H__*/