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