162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2012 Freescale Semiconductor, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __PINCTRL_MXS_H
762306a36Sopenharmony_ci#define __PINCTRL_MXS_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/platform_device.h>
1062306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define SET	0x4
1362306a36Sopenharmony_ci#define CLR	0x8
1462306a36Sopenharmony_ci#define TOG	0xc
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define MXS_PINCTRL_PIN(pin)	PINCTRL_PIN(pin, #pin)
1762306a36Sopenharmony_ci#define PINID(bank, pin)	((bank) * 32 + (pin))
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * pinmux-id bit field definitions
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * bank:	15..12	(4)
2362306a36Sopenharmony_ci * pin:		11..4	(8)
2462306a36Sopenharmony_ci * muxsel:	3..0	(4)
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci#define MUXID_TO_PINID(m)	PINID((m) >> 12 & 0xf, (m) >> 4 & 0xff)
2762306a36Sopenharmony_ci#define MUXID_TO_MUXSEL(m)	((m) & 0xf)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define PINID_TO_BANK(p)	((p) >> 5)
3062306a36Sopenharmony_ci#define PINID_TO_PIN(p)		((p) % 32)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/*
3362306a36Sopenharmony_ci * pin config bit field definitions
3462306a36Sopenharmony_ci *
3562306a36Sopenharmony_ci * pull-up:	6..5	(2)
3662306a36Sopenharmony_ci * voltage:	4..3	(2)
3762306a36Sopenharmony_ci * mA:		2..0	(3)
3862306a36Sopenharmony_ci *
3962306a36Sopenharmony_ci * MSB of each field is presence bit for the config.
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_ci#define PULL_PRESENT		(1 << 6)
4262306a36Sopenharmony_ci#define PULL_SHIFT		5
4362306a36Sopenharmony_ci#define VOL_PRESENT		(1 << 4)
4462306a36Sopenharmony_ci#define VOL_SHIFT		3
4562306a36Sopenharmony_ci#define MA_PRESENT		(1 << 2)
4662306a36Sopenharmony_ci#define MA_SHIFT		0
4762306a36Sopenharmony_ci#define PIN_CONFIG_TO_PULL(c)	((c) >> PULL_SHIFT & 0x1)
4862306a36Sopenharmony_ci#define PIN_CONFIG_TO_VOL(c)	((c) >> VOL_SHIFT & 0x1)
4962306a36Sopenharmony_ci#define PIN_CONFIG_TO_MA(c)	((c) >> MA_SHIFT & 0x3)
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct mxs_function {
5262306a36Sopenharmony_ci	const char *name;
5362306a36Sopenharmony_ci	const char **groups;
5462306a36Sopenharmony_ci	unsigned ngroups;
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct mxs_group {
5862306a36Sopenharmony_ci	const char *name;
5962306a36Sopenharmony_ci	unsigned int *pins;
6062306a36Sopenharmony_ci	unsigned npins;
6162306a36Sopenharmony_ci	u8 *muxsel;
6262306a36Sopenharmony_ci	u8 config;
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistruct mxs_regs {
6662306a36Sopenharmony_ci	u16 muxsel;
6762306a36Sopenharmony_ci	u16 drive;
6862306a36Sopenharmony_ci	u16 pull;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct mxs_pinctrl_soc_data {
7262306a36Sopenharmony_ci	const struct mxs_regs *regs;
7362306a36Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
7462306a36Sopenharmony_ci	unsigned npins;
7562306a36Sopenharmony_ci	struct mxs_function *functions;
7662306a36Sopenharmony_ci	unsigned nfunctions;
7762306a36Sopenharmony_ci	struct mxs_group *groups;
7862306a36Sopenharmony_ci	unsigned ngroups;
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciint mxs_pinctrl_probe(struct platform_device *pdev,
8262306a36Sopenharmony_ci		      struct mxs_pinctrl_soc_data *soc);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#endif /* __PINCTRL_MXS_H */
85