1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Intel Tangier pinctrl functions 4 * 5 * Copyright (C) 2016, 2023 Intel Corporation 6 * 7 * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com> 8 * Raag Jadav <raag.jadav@intel.com> 9 */ 10 11#ifndef PINCTRL_TANGIER_H 12#define PINCTRL_TANGIER_H 13 14#include <linux/spinlock_types.h> 15#include <linux/types.h> 16 17#include <linux/pinctrl/pinctrl.h> 18 19#include "pinctrl-intel.h" 20 21struct device; 22struct platform_device; 23 24#define TNG_FAMILY_NR 64 25#define TNG_FAMILY_LEN 0x400 26 27/** 28 * struct tng_family - Tangier pin family description 29 * @barno: MMIO BAR number where registers for this family reside 30 * @pin_base: Starting pin of pins in this family 31 * @npins: Number of pins in this family 32 * @protected: True if family is protected by access 33 * @regs: Family specific common registers 34 */ 35struct tng_family { 36 unsigned int barno; 37 unsigned int pin_base; 38 size_t npins; 39 bool protected; 40 void __iomem *regs; 41}; 42 43#define TNG_FAMILY(b, s, e) \ 44 { \ 45 .barno = (b), \ 46 .pin_base = (s), \ 47 .npins = (e) - (s) + 1, \ 48 } 49 50#define TNG_FAMILY_PROTECTED(b, s, e) \ 51 { \ 52 .barno = (b), \ 53 .pin_base = (s), \ 54 .npins = (e) - (s) + 1, \ 55 .protected = true, \ 56 } 57 58/** 59 * struct tng_pinctrl - Tangier pinctrl private structure 60 * @dev: Pointer to the device structure 61 * @lock: Lock to serialize register access 62 * @pctldesc: Pin controller description 63 * @pctldev: Pointer to the pin controller device 64 * @families: Array of families this pinctrl handles 65 * @nfamilies: Number of families in the array 66 * @functions: Array of functions 67 * @nfunctions: Number of functions in the array 68 * @groups: Array of pin groups 69 * @ngroups: Number of groups in the array 70 * @pins: Array of pins this pinctrl controls 71 * @npins: Number of pins in the array 72 */ 73struct tng_pinctrl { 74 struct device *dev; 75 raw_spinlock_t lock; 76 struct pinctrl_desc pctldesc; 77 struct pinctrl_dev *pctldev; 78 79 /* Pin controller configuration */ 80 const struct tng_family *families; 81 size_t nfamilies; 82 const struct intel_function *functions; 83 size_t nfunctions; 84 const struct intel_pingroup *groups; 85 size_t ngroups; 86 const struct pinctrl_pin_desc *pins; 87 size_t npins; 88}; 89 90int devm_tng_pinctrl_probe(struct platform_device *pdev); 91 92#endif /* PINCTRL_TANGIER_H */ 93