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 21 struct device; 22 struct 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 */ 35 struct 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 */ 73 struct 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 90 int devm_tng_pinctrl_probe(struct platform_device *pdev); 91 92 #endif /* PINCTRL_TANGIER_H */ 93