// SPDX-License-Identifier: GPL-2.0-only
/*
* Driver for the EP93xx pin controller
* based on linux/drivers/pinctrl/pinmux-gemini.c
*
* Copyright (C) 2022 Nikita Shubin <nikita.shubin@maquefel.me>
*
* This is a group-only pin controller.
*/
#include <linux/array_size.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/mfd/syscon.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/soc/cirrus/ep93xx.h>
#include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>
#include "pinctrl-utils.h"
#define DRIVER_NAME "pinctrl-ep93xx"
enum ep93xx_pinctrl_model {
EP93XX_9301_PINCTRL,
EP93XX_9307_PINCTRL,
EP93XX_9312_PINCTRL,
};
struct ep93xx_pmx {
struct device *dev;
struct pinctrl_dev *pctl;
struct ep93xx_regmap_adev *aux_dev;
struct regmap *map;
enum ep93xx_pinctrl_model model;
};
static void ep93xx_pinctrl_update_bits(struct ep93xx_pmx *pmx, unsigned int reg,
unsigned int mask, unsigned int val)
{
struct ep93xx_regmap_adev *aux = pmx->aux_dev;
aux->update_bits(aux->map, aux->lock, reg, mask, val);
}
struct ep93xx_pin_group {
struct pingroup grp;
u32 mask;
u32 value;
};
#define PMX_GROUP(_name, _pins, _mask, _value) \
{ \
.grp = PINCTRL_PINGROUP(_name, _pins, ARRAY_SIZE(_pins)), \
.mask = _mask, \
.value = _value, \
}
#define EP93XX_SYSCON_DEVCFG 0x80
/*
* There are several system configuration options selectable by the DeviceCfg and SysCfg
* registers. These registers provide the selection of several pin multiplexing options and also
* provide software access to the system reset configuration options. Please refer to the
* descriptions of the registers, “DeviceCfg” on page 5-25 and “SysCfg” on page 5-34, for a
* detailed explanation.
*/
#define EP93XX_SYSCON_DEVCFG_D1ONG BIT(30)
#define EP93XX_SYSCON_DEVCFG_D0ONG BIT(29)
#define EP93XX_SYSCON_DEVCFG_IONU2 BIT(28)
#define EP93XX_SYSCON_DEVCFG_GONK BIT(27)
#define EP93XX_SYSCON_DEVCFG_TONG BIT(26)
#define EP93XX_SYSCON_DEVCFG_MONG BIT(25)
#define EP93XX_SYSCON_DEVCFG_A2ONG BIT(22)
#define EP93XX_SYSCON_DEVCFG_A1ONG BIT(21)
#define EP93XX_SYSCON_DEVCFG_HONIDE BIT(11)