root/drivers/pinctrl/freescale/pinctrl-mxs.h
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright 2012 Freescale Semiconductor, Inc.
 */

#ifndef __PINCTRL_MXS_H
#define __PINCTRL_MXS_H

#include <linux/platform_device.h>
#include <linux/pinctrl/pinctrl.h>

#define SET     0x4
#define CLR     0x8
#define TOG     0xc

#define MXS_PINCTRL_PIN(pin)    PINCTRL_PIN(pin, #pin)
#define PINID(bank, pin)        ((bank) * 32 + (pin))

/*
 * pinmux-id bit field definitions
 *
 * bank:        15..12  (4)
 * pin:         11..4   (8)
 * muxsel:      3..0    (4)
 */
#define MUXID_TO_PINID(m)       PINID((m) >> 12 & 0xf, (m) >> 4 & 0xff)
#define MUXID_TO_MUXSEL(m)      ((m) & 0xf)

#define PINID_TO_BANK(p)        ((p) >> 5)
#define PINID_TO_PIN(p)         ((p) % 32)

/*
 * pin config bit field definitions
 *
 * pull-up:     6..5    (2)
 * voltage:     4..3    (2)
 * mA:          2..0    (3)
 *
 * MSB of each field is presence bit for the config.
 */
#define PULL_PRESENT            (1 << 6)
#define PULL_SHIFT              5
#define VOL_PRESENT             (1 << 4)
#define VOL_SHIFT               3
#define MA_PRESENT              (1 << 2)
#define MA_SHIFT                0
#define PIN_CONFIG_TO_PULL(c)   ((c) >> PULL_SHIFT & 0x1)
#define PIN_CONFIG_TO_VOL(c)    ((c) >> VOL_SHIFT & 0x1)
#define PIN_CONFIG_TO_MA(c)     ((c) >> MA_SHIFT & 0x3)

struct mxs_function {
        const char *name;
        const char **groups;
        unsigned ngroups;
};

struct mxs_group {
        const char *name;
        unsigned int *pins;
        unsigned npins;
        u8 *muxsel;
        u8 config;
};

struct mxs_regs {
        u16 muxsel;
        u16 drive;
        u16 pull;
};

struct mxs_pinctrl_soc_data {
        const struct mxs_regs *regs;
        const struct pinctrl_pin_desc *pins;
        unsigned npins;
        struct mxs_function *functions;
        unsigned nfunctions;
        struct mxs_group *groups;
        unsigned ngroups;
};

int mxs_pinctrl_probe(struct platform_device *pdev,
                      struct mxs_pinctrl_soc_data *soc);

#endif /* __PINCTRL_MXS_H */