162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Intel Tangier pinctrl functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2016, 2023 Intel Corporation 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com> 862306a36Sopenharmony_ci * Raag Jadav <raag.jadav@intel.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef PINCTRL_TANGIER_H 1262306a36Sopenharmony_ci#define PINCTRL_TANGIER_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/spinlock_types.h> 1562306a36Sopenharmony_ci#include <linux/types.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "pinctrl-intel.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct device; 2262306a36Sopenharmony_cistruct platform_device; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define TNG_FAMILY_NR 64 2562306a36Sopenharmony_ci#define TNG_FAMILY_LEN 0x400 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/** 2862306a36Sopenharmony_ci * struct tng_family - Tangier pin family description 2962306a36Sopenharmony_ci * @barno: MMIO BAR number where registers for this family reside 3062306a36Sopenharmony_ci * @pin_base: Starting pin of pins in this family 3162306a36Sopenharmony_ci * @npins: Number of pins in this family 3262306a36Sopenharmony_ci * @protected: True if family is protected by access 3362306a36Sopenharmony_ci * @regs: Family specific common registers 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_cistruct tng_family { 3662306a36Sopenharmony_ci unsigned int barno; 3762306a36Sopenharmony_ci unsigned int pin_base; 3862306a36Sopenharmony_ci size_t npins; 3962306a36Sopenharmony_ci bool protected; 4062306a36Sopenharmony_ci void __iomem *regs; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define TNG_FAMILY(b, s, e) \ 4462306a36Sopenharmony_ci { \ 4562306a36Sopenharmony_ci .barno = (b), \ 4662306a36Sopenharmony_ci .pin_base = (s), \ 4762306a36Sopenharmony_ci .npins = (e) - (s) + 1, \ 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define TNG_FAMILY_PROTECTED(b, s, e) \ 5162306a36Sopenharmony_ci { \ 5262306a36Sopenharmony_ci .barno = (b), \ 5362306a36Sopenharmony_ci .pin_base = (s), \ 5462306a36Sopenharmony_ci .npins = (e) - (s) + 1, \ 5562306a36Sopenharmony_ci .protected = true, \ 5662306a36Sopenharmony_ci } 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/** 5962306a36Sopenharmony_ci * struct tng_pinctrl - Tangier pinctrl private structure 6062306a36Sopenharmony_ci * @dev: Pointer to the device structure 6162306a36Sopenharmony_ci * @lock: Lock to serialize register access 6262306a36Sopenharmony_ci * @pctldesc: Pin controller description 6362306a36Sopenharmony_ci * @pctldev: Pointer to the pin controller device 6462306a36Sopenharmony_ci * @families: Array of families this pinctrl handles 6562306a36Sopenharmony_ci * @nfamilies: Number of families in the array 6662306a36Sopenharmony_ci * @functions: Array of functions 6762306a36Sopenharmony_ci * @nfunctions: Number of functions in the array 6862306a36Sopenharmony_ci * @groups: Array of pin groups 6962306a36Sopenharmony_ci * @ngroups: Number of groups in the array 7062306a36Sopenharmony_ci * @pins: Array of pins this pinctrl controls 7162306a36Sopenharmony_ci * @npins: Number of pins in the array 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cistruct tng_pinctrl { 7462306a36Sopenharmony_ci struct device *dev; 7562306a36Sopenharmony_ci raw_spinlock_t lock; 7662306a36Sopenharmony_ci struct pinctrl_desc pctldesc; 7762306a36Sopenharmony_ci struct pinctrl_dev *pctldev; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci /* Pin controller configuration */ 8062306a36Sopenharmony_ci const struct tng_family *families; 8162306a36Sopenharmony_ci size_t nfamilies; 8262306a36Sopenharmony_ci const struct intel_function *functions; 8362306a36Sopenharmony_ci size_t nfunctions; 8462306a36Sopenharmony_ci const struct intel_pingroup *groups; 8562306a36Sopenharmony_ci size_t ngroups; 8662306a36Sopenharmony_ci const struct pinctrl_pin_desc *pins; 8762306a36Sopenharmony_ci size_t npins; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciint devm_tng_pinctrl_probe(struct platform_device *pdev); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#endif /* PINCTRL_TANGIER_H */ 93