// 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