156 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright (C) 2024 Inochi Amaoto <inochiama@outlook.com>4 */5 6#ifndef _PINCTRL_SOPHGO_CV18XX_H7#define _PINCTRL_SOPHGO_CV18XX_H8 9#include <linux/bits.h>10#include <linux/bitfield.h>11#include <linux/device.h>12#include <linux/mutex.h>13#include <linux/spinlock.h>14#include <linux/platform_device.h>15#include <linux/pinctrl/pinctrl.h>16#include <linux/pinctrl/pinconf.h>17 18enum cv1800_pin_io_type {19 IO_TYPE_1V8_ONLY = 0,20 IO_TYPE_1V8_OR_3V3 = 1,21 IO_TYPE_AUDIO = 2,22 IO_TYPE_ETH = 323};24 25#define CV1800_PINCONF_AREA_SYS 026#define CV1800_PINCONF_AREA_RTC 127 28struct cv1800_pinmux {29 u16 offset;30 u8 area;31 u8 max;32};33 34struct cv1800_pinmux2 {35 u16 offset;36 u8 area;37 u8 max;38 u8 pfunc;39};40 41struct cv1800_pinconf {42 u16 offset;43 u8 area;44};45 46#define CV1800_PIN_HAVE_MUX2 BIT(0)47#define CV1800_PIN_IO_TYPE GENMASK(2, 1)48 49#define CV1800_PIN_FLAG_IO_TYPE(type) \50 FIELD_PREP_CONST(CV1800_PIN_IO_TYPE, type)51struct cv1800_pin {52 u16 pin;53 u16 flags;54 u8 power_domain;55 struct cv1800_pinmux mux;56 struct cv1800_pinmux2 mux2;57 struct cv1800_pinconf conf;58};59 60#define PIN_POWER_STATE_1V8 180061#define PIN_POWER_STATE_3V3 330062 63/**64 * struct cv1800_vddio_cfg_ops - pin vddio operations65 *66 * @get_pull_up: get resistor for pull up;67 * @get_pull_down: get resistor for pull down.68 * @get_oc_map: get mapping for typical low level output current value to69 * register value map.70 * @get_schmitt_map: get mapping for register value to typical schmitt71 * threshold.72 */73struct cv1800_vddio_cfg_ops {74 int (*get_pull_up)(struct cv1800_pin *pin, const u32 *psmap);75 int (*get_pull_down)(struct cv1800_pin *pin, const u32 *psmap);76 int (*get_oc_map)(struct cv1800_pin *pin, const u32 *psmap,77 const u32 **map);78 int (*get_schmitt_map)(struct cv1800_pin *pin, const u32 *psmap,79 const u32 **map);80};81 82struct cv1800_pinctrl_data {83 const struct pinctrl_pin_desc *pins;84 const struct cv1800_pin *pindata;85 const char * const *pdnames;86 const struct cv1800_vddio_cfg_ops *vddio_ops;87 u16 npins;88 u16 npd;89};90 91static inline enum cv1800_pin_io_type cv1800_pin_io_type(struct cv1800_pin *pin)92{93 return FIELD_GET(CV1800_PIN_IO_TYPE, pin->flags);94};95 96int cv1800_pinctrl_probe(struct platform_device *pdev);97 98#define CV1800_FUNC_PIN(_id, _power_domain, _type, \99 _mux_area, _mux_offset, _mux_func_max) \100 { \101 .pin = (_id), \102 .power_domain = (_power_domain), \103 .flags = CV1800_PIN_FLAG_IO_TYPE(_type), \104 .mux = { \105 .area = (_mux_area), \106 .offset = (_mux_offset), \107 .max = (_mux_func_max), \108 }, \109 }110 111#define CV1800_GENERAL_PIN(_id, _power_domain, _type, \112 _mux_area, _mux_offset, _mux_func_max, \113 _conf_area, _conf_offset) \114 { \115 .pin = (_id), \116 .power_domain = (_power_domain), \117 .flags = CV1800_PIN_FLAG_IO_TYPE(_type), \118 .mux = { \119 .area = (_mux_area), \120 .offset = (_mux_offset), \121 .max = (_mux_func_max), \122 }, \123 .conf = { \124 .area = (_conf_area), \125 .offset = (_conf_offset), \126 }, \127 }128 129#define CV1800_GENERATE_PIN_MUX2(_id, _power_domain, _type, \130 _mux_area, _mux_offset, _mux_func_max, \131 _mux2_area, _mux2_offset, \132 _mux2_func_max, \133 _conf_area, _conf_offset) \134 { \135 .pin = (_id), \136 .power_domain = (_power_domain), \137 .flags = CV1800_PIN_FLAG_IO_TYPE(_type) | \138 CV1800_PIN_HAVE_MUX2, \139 .mux = { \140 .area = (_mux_area), \141 .offset = (_mux_offset), \142 .max = (_mux_func_max), \143 }, \144 .mux2 = { \145 .area = (_mux2_area), \146 .offset = (_mux2_offset), \147 .max = (_mux2_func_max), \148 }, \149 .conf = { \150 .area = (_conf_area), \151 .offset = (_conf_offset), \152 }, \153 }154 155#endif156