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/bits.h> 10 #include <linux/kernel.h> 11 12 #include "../core.h" 13 14 struct platform_device; 15 16 struct 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 .group.name = "gpio" #id, \ 49 .group.pins = gpio##id##_pins, \ 50 .pin = id, \ 51 .slew_offset = soff, \ 52 .group.num_pins = ARRAY_SIZE(gpio##id##_pins), \ 53 .funcs = (int[]){ \ 54 LPI_MUX_gpio, \ 55 LPI_MUX_##f1, \ 56 LPI_MUX_##f2, \ 57 LPI_MUX_##f3, \ 58 LPI_MUX_##f4, \ 59 }, \ 60 .nfuncs = 5, \ 61 } 62 63 struct lpi_pingroup { 64 struct group_desc group; 65 unsigned int pin; 66 /* Bit offset in slew register for SoundWire pins only */ 67 int slew_offset; 68 unsigned int *funcs; 69 unsigned int nfuncs; 70 }; 71 72 struct lpi_function { 73 const char *name; 74 const char * const *groups; 75 unsigned int ngroups; 76 }; 77 78 struct lpi_pinctrl_variant_data { 79 const struct pinctrl_pin_desc *pins; 80 int npins; 81 const struct lpi_pingroup *groups; 82 int ngroups; 83 const struct lpi_function *functions; 84 int nfunctions; 85 }; 86 87 int lpi_pinctrl_probe(struct platform_device *pdev); 88 void lpi_pinctrl_remove(struct platform_device *pdev); 89 90 #endif /*__PINCTRL_LPASS_LPI_H__*/ 91