uboot/drivers/pinctrl/uniphier/pinctrl-uniphier.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2015-2016 Socionext Inc.
   3 *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#ifndef __PINCTRL_UNIPHIER_H__
   9#define __PINCTRL_UNIPHIER_H__
  10
  11#include <linux/bitops.h>
  12#include <linux/bug.h>
  13#include <linux/kernel.h>
  14#include <linux/types.h>
  15
  16#define UNIPHIER_PIN_ATTR_PACKED(iectrl)        (iectrl)
  17
  18static inline unsigned int uniphier_pin_get_iectrl(unsigned long data)
  19{
  20        return data;
  21}
  22
  23/**
  24 * struct uniphier_pinctrl_pin - pin data for UniPhier SoC
  25 *
  26 * @number: pin number
  27 * @data: additional per-pin data
  28 */
  29struct uniphier_pinctrl_pin {
  30        unsigned number;
  31        unsigned long data;
  32};
  33
  34/**
  35 * struct uniphier_pinctrl_group - pin group data for UniPhier SoC
  36 *
  37 * @name: pin group name
  38 * @pins: array of pins that belong to the group
  39 * @num_pins: number of pins in the group
  40 * @muxvals: array of values to be set to pinmux registers
  41 */
  42struct uniphier_pinctrl_group {
  43        const char *name;
  44        const unsigned *pins;
  45        unsigned num_pins;
  46        const int *muxvals;
  47};
  48
  49/**
  50 * struct uniphier_pinctrl_socdata - SoC data for UniPhier pin controller
  51 *
  52 * @pins: array of pin data
  53 * @pins_count: number of pin data
  54 * @groups: array of pin group data
  55 * @groups_count: number of pin group data
  56 * @functions: array of pinmux function names
  57 * @functions_count: number of pinmux functions
  58 * @mux_bits: bit width of each pinmux register
  59 * @reg_stride: stride of pinmux register address
  60 * @caps: SoC-specific capability flag
  61 */
  62struct uniphier_pinctrl_socdata {
  63        const struct uniphier_pinctrl_pin *pins;
  64        int pins_count;
  65        const struct uniphier_pinctrl_group *groups;
  66        int groups_count;
  67        const char * const *functions;
  68        int functions_count;
  69        unsigned caps;
  70#define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL     BIT(2)
  71#define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE   BIT(1)
  72#define UNIPHIER_PINCTRL_CAPS_MUX_4BIT          BIT(0)
  73};
  74
  75#define UNIPHIER_PINCTRL_PIN(a, b)                                      \
  76{                                                                       \
  77        .number = a,                                                    \
  78        .data = UNIPHIER_PIN_ATTR_PACKED(b),                            \
  79}
  80
  81#define __UNIPHIER_PINCTRL_GROUP(grp)                                   \
  82        {                                                               \
  83                .name = #grp,                                           \
  84                .pins = grp##_pins,                                     \
  85                .num_pins = ARRAY_SIZE(grp##_pins),                     \
  86                .muxvals = grp##_muxvals +                              \
  87                        BUILD_BUG_ON_ZERO(ARRAY_SIZE(grp##_pins) !=     \
  88                                          ARRAY_SIZE(grp##_muxvals)),   \
  89        }
  90
  91#define __UNIPHIER_PINMUX_FUNCTION(func)        #func
  92
  93#ifdef CONFIG_SPL_BUILD
  94        /*
  95         * a tricky way to drop unneeded *_pins and *_muxvals arrays from SPL,
  96         * suppressing "defined but not used" warnings.
  97         */
  98#define UNIPHIER_PINCTRL_GROUP(grp)                                     \
  99        { .num_pins = ARRAY_SIZE(grp##_pins) + ARRAY_SIZE(grp##_muxvals) }
 100#define UNIPHIER_PINMUX_FUNCTION(func)          NULL
 101#else
 102#define UNIPHIER_PINCTRL_GROUP(grp)             __UNIPHIER_PINCTRL_GROUP(grp)
 103#define UNIPHIER_PINMUX_FUNCTION(func)          __UNIPHIER_PINMUX_FUNCTION(func)
 104#endif
 105
 106#define UNIPHIER_PINCTRL_GROUP_SPL(grp)         __UNIPHIER_PINCTRL_GROUP(grp)
 107#define UNIPHIER_PINMUX_FUNCTION_SPL(func)      __UNIPHIER_PINMUX_FUNCTION(func)
 108
 109/**
 110 * struct uniphier_pinctrl_priv - private data for UniPhier pinctrl driver
 111 *
 112 * @base: base address of the pinctrl device
 113 * @socdata: SoC specific data
 114 */
 115struct uniphier_pinctrl_priv {
 116        void __iomem *base;
 117        struct uniphier_pinctrl_socdata *socdata;
 118};
 119
 120extern const struct pinctrl_ops uniphier_pinctrl_ops;
 121
 122int uniphier_pinctrl_probe(struct udevice *dev,
 123                           struct uniphier_pinctrl_socdata *socdata);
 124
 125#endif /* __PINCTRL_UNIPHIER_H__ */
 126