162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * IMX pinmux core definitions
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2012 Freescale Semiconductor, Inc.
662306a36Sopenharmony_ci * Copyright (C) 2012 Linaro Ltd.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Author: Dong Aisheng <dong.aisheng@linaro.org>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __DRIVERS_PINCTRL_IMX_H
1262306a36Sopenharmony_ci#define __DRIVERS_PINCTRL_IMX_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/pinctrl/pinmux.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct platform_device;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciextern struct pinmux_ops imx_pmx_ops;
1962306a36Sopenharmony_ciextern const struct dev_pm_ops imx_pinctrl_pm_ops;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/**
2262306a36Sopenharmony_ci * struct imx_pin_mmio - MMIO pin configurations
2362306a36Sopenharmony_ci * @mux_mode: the mux mode for this pin.
2462306a36Sopenharmony_ci * @input_reg: the select input register offset for this pin if any
2562306a36Sopenharmony_ci *	0 if no select input setting needed.
2662306a36Sopenharmony_ci * @input_val: the select input value for this pin.
2762306a36Sopenharmony_ci * @configs: the config for this pin.
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_cistruct imx_pin_mmio {
3062306a36Sopenharmony_ci	unsigned int mux_mode;
3162306a36Sopenharmony_ci	u16 input_reg;
3262306a36Sopenharmony_ci	unsigned int input_val;
3362306a36Sopenharmony_ci	unsigned long config;
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/**
3762306a36Sopenharmony_ci * struct imx_pin_scu - SCU pin configurations
3862306a36Sopenharmony_ci * @mux: the mux mode for this pin.
3962306a36Sopenharmony_ci * @configs: the config for this pin.
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_cistruct imx_pin_scu {
4262306a36Sopenharmony_ci	unsigned int mux_mode;
4362306a36Sopenharmony_ci	unsigned long config;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/**
4762306a36Sopenharmony_ci * struct imx_pin - describes a single i.MX pin
4862306a36Sopenharmony_ci * @pin: the pin_id of this pin
4962306a36Sopenharmony_ci * @conf: config type of this pin, either mmio or scu
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_cistruct imx_pin {
5262306a36Sopenharmony_ci	unsigned int pin;
5362306a36Sopenharmony_ci	union {
5462306a36Sopenharmony_ci		struct imx_pin_mmio mmio;
5562306a36Sopenharmony_ci		struct imx_pin_scu scu;
5662306a36Sopenharmony_ci	} conf;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/**
6062306a36Sopenharmony_ci * struct imx_pin_reg - describe a pin reg map
6162306a36Sopenharmony_ci * @mux_reg: mux register offset
6262306a36Sopenharmony_ci * @conf_reg: config register offset
6362306a36Sopenharmony_ci */
6462306a36Sopenharmony_cistruct imx_pin_reg {
6562306a36Sopenharmony_ci	s16 mux_reg;
6662306a36Sopenharmony_ci	s16 conf_reg;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/**
7062306a36Sopenharmony_ci * @dev: a pointer back to containing device
7162306a36Sopenharmony_ci * @base: the offset to the controller in virtual memory
7262306a36Sopenharmony_ci */
7362306a36Sopenharmony_cistruct imx_pinctrl {
7462306a36Sopenharmony_ci	struct device *dev;
7562306a36Sopenharmony_ci	struct pinctrl_dev *pctl;
7662306a36Sopenharmony_ci	void __iomem *base;
7762306a36Sopenharmony_ci	void __iomem *input_sel_base;
7862306a36Sopenharmony_ci	const struct imx_pinctrl_soc_info *info;
7962306a36Sopenharmony_ci	struct imx_pin_reg *pin_regs;
8062306a36Sopenharmony_ci	unsigned int group_index;
8162306a36Sopenharmony_ci	struct mutex mutex;
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistruct imx_pinctrl_soc_info {
8562306a36Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
8662306a36Sopenharmony_ci	unsigned int npins;
8762306a36Sopenharmony_ci	unsigned int flags;
8862306a36Sopenharmony_ci	const char *gpr_compatible;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/* MUX_MODE shift and mask in case SHARE_MUX_CONF_REG */
9162306a36Sopenharmony_ci	unsigned int mux_mask;
9262306a36Sopenharmony_ci	u8 mux_shift;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	int (*gpio_set_direction)(struct pinctrl_dev *pctldev,
9562306a36Sopenharmony_ci				  struct pinctrl_gpio_range *range,
9662306a36Sopenharmony_ci				  unsigned offset,
9762306a36Sopenharmony_ci				  bool input);
9862306a36Sopenharmony_ci	int (*imx_pinconf_get)(struct pinctrl_dev *pctldev, unsigned int pin_id,
9962306a36Sopenharmony_ci			       unsigned long *config);
10062306a36Sopenharmony_ci	int (*imx_pinconf_set)(struct pinctrl_dev *pctldev, unsigned int pin_id,
10162306a36Sopenharmony_ci			       unsigned long *configs, unsigned int num_configs);
10262306a36Sopenharmony_ci	void (*imx_pinctrl_parse_pin)(struct imx_pinctrl *ipctl,
10362306a36Sopenharmony_ci				      unsigned int *pin_id, struct imx_pin *pin,
10462306a36Sopenharmony_ci				      const __be32 **list_p);
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#define SHARE_MUX_CONF_REG	BIT(0)
10862306a36Sopenharmony_ci#define ZERO_OFFSET_VALID	BIT(1)
10962306a36Sopenharmony_ci#define IMX_USE_SCU		BIT(2)
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define NO_MUX		0x0
11262306a36Sopenharmony_ci#define NO_PAD		0x0
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#define IMX_PINCTRL_PIN(pin) PINCTRL_PIN(pin, #pin)
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define PAD_CTL_MASK(len)	((1 << len) - 1)
11762306a36Sopenharmony_ci#define IMX_MUX_MASK	0x7
11862306a36Sopenharmony_ci#define IOMUXC_CONFIG_SION	(0x1 << 4)
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciint imx_pinctrl_probe(struct platform_device *pdev,
12162306a36Sopenharmony_ci			const struct imx_pinctrl_soc_info *info);
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci#define BM_PAD_CTL_GP_ENABLE		BIT(30)
12462306a36Sopenharmony_ci#define BM_PAD_CTL_IFMUX_ENABLE		BIT(31)
12562306a36Sopenharmony_ci#define BP_PAD_CTL_IFMUX		27
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ciint imx_pinctrl_sc_ipc_init(struct platform_device *pdev);
12862306a36Sopenharmony_ciint imx_pinconf_get_scu(struct pinctrl_dev *pctldev, unsigned pin_id,
12962306a36Sopenharmony_ci			unsigned long *config);
13062306a36Sopenharmony_ciint imx_pinconf_set_scu(struct pinctrl_dev *pctldev, unsigned pin_id,
13162306a36Sopenharmony_ci			unsigned long *configs, unsigned num_configs);
13262306a36Sopenharmony_civoid imx_pinctrl_parse_pin_scu(struct imx_pinctrl *ipctl,
13362306a36Sopenharmony_ci			       unsigned int *pin_id, struct imx_pin *pin,
13462306a36Sopenharmony_ci			       const __be32 **list_p);
13562306a36Sopenharmony_ci#endif /* __DRIVERS_PINCTRL_IMX_H */
136