FILE
pinctrl-sophgo.h
File preview with syntax highlighting.
linux-6.19.14/drivers/pinctrl/sophgo/pinctrl-sophgo.h
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (C) 2024 Inochi Amaoto <inochiama@outlook.com> 4 */ 5 6#ifndef _PINCTRL_SOPHGO_H 7#define _PINCTRL_SOPHGO_H 8 9#include <linux/device.h> 10#include <linux/mutex.h> 11#include <linux/pinctrl/pinctrl.h> 12#include <linux/platform_device.h> 13#include <linux/spinlock.h> 14 15#include "../core.h" 16 17struct sophgo_pinctrl; 18 19struct sophgo_pin { 20 u16 id; 21 u16 flags; 22}; 23 24struct sophgo_pin_mux_config { 25 const struct sophgo_pin *pin; 26 u32 config; 27}; 28 29/** 30 * struct sophgo_cfg_ops - pin configuration operations 31 * 32 * @pctrl_init: soc specific init callback 33 * @verify_pinmux_config: verify the pinmux config for a pin 34 * @verify_pin_group: verify the whole pinmux group 35 * @dt_node_to_map_post: post init for the pinmux config map 36 * @compute_pinconf_config: compute pinconf config 37 * @set_pinconf_config: set pinconf config (the caller holds lock) 38 * @set_pinmux_config: set mux config (the caller holds lock) 39 */ 40struct sophgo_cfg_ops { 41 int (*pctrl_init)(struct platform_device *pdev, 42 struct sophgo_pinctrl *pctrl); 43 int (*verify_pinmux_config)(const struct sophgo_pin_mux_config *config); 44 int (*verify_pin_group)(const struct sophgo_pin_mux_config *pinmuxs, 45 unsigned int npins); 46 int (*dt_node_to_map_post)(struct device_node *cur, 47 struct sophgo_pinctrl *pctrl, 48 struct sophgo_pin_mux_config *pinmuxs, 49 unsigned int npins); 50 int (*compute_pinconf_config)(struct sophgo_pinctrl *pctrl, 51 const struct sophgo_pin *sp, 52 unsigned long *configs, 53 unsigned int num_configs, 54 u32 *value, u32 *mask); 55 int (*set_pinconf_config)(struct sophgo_pinctrl *pctrl, 56 const struct sophgo_pin *sp, 57 u32 value, u32 mask); 58 void (*set_pinmux_config)(struct sophgo_pinctrl *pctrl, 59 const struct sophgo_pin *sp, u32 config); 60}; 61 62/** 63 * struct sophgo_vddio_cfg_ops - pin vddio operations 64 * 65 * @get_pull_up: get resistorĀ for pull up; 66 * @get_pull_down: get resistorĀ for pull down. 67 * @get_oc_map: get mapping for typical low level output current value to 68 * register value map. 69 * @get_schmitt_map: get mapping for register value to typical schmitt 70 * threshold. 71 */ 72struct sophgo_vddio_cfg_ops { 73 int (*get_pull_up)(const struct sophgo_pin *pin, const u32 *psmap); 74 int (*get_pull_down)(const struct sophgo_pin *pin, const u32 *psmap); 75 int (*get_oc_map)(const struct sophgo_pin *pin, const u32 *psmap, 76 const u32 **map); 77 int (*get_schmitt_map)(const struct sophgo_pin *pin, const u32 *psmap, 78 const u32 **map); 79}; 80 81struct sophgo_pinctrl_data { 82 const struct pinctrl_pin_desc *pins; 83 const void *pindata; 84 const char * const *pdnames; 85 const struct sophgo_vddio_cfg_ops *vddio_ops; 86 const struct sophgo_cfg_ops *cfg_ops; 87 const struct pinctrl_ops *pctl_ops; 88 const struct pinmux_ops *pmx_ops; 89 const struct pinconf_ops *pconf_ops; 90 u16 npins; 91 u16 npds; 92 u16 pinsize; 93}; 94 95struct sophgo_pinctrl { 96 struct device *dev; 97 struct pinctrl_dev *pctrl_dev; 98 const struct sophgo_pinctrl_data *data; 99 struct pinctrl_desc pdesc; 100 101 struct mutex mutex; 102 raw_spinlock_t lock; 103 void *priv_ctrl; 104}; 105 106const struct sophgo_pin *sophgo_get_pin(struct sophgo_pinctrl *pctrl, 107 unsigned long pin_id); 108int sophgo_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, struct device_node *np, 109 struct pinctrl_map **maps, unsigned int *num_maps); 110int sophgo_pmx_set_mux(struct pinctrl_dev *pctldev, 111 unsigned int fsel, unsigned int gsel); 112int sophgo_pconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id, 113 unsigned long *configs, unsigned int num_configs); 114int sophgo_pconf_group_set(struct pinctrl_dev *pctldev, unsigned int gsel, 115 unsigned long *configs, unsigned int num_configs); 116u32 sophgo_pinctrl_typical_pull_down(struct sophgo_pinctrl *pctrl, 117 const struct sophgo_pin *pin, 118 const u32 *power_cfg); 119u32 sophgo_pinctrl_typical_pull_up(struct sophgo_pinctrl *pctrl, 120 const struct sophgo_pin *pin, 121 const u32 *power_cfg); 122int sophgo_pinctrl_oc2reg(struct sophgo_pinctrl *pctrl, 123 const struct sophgo_pin *pin, 124 const u32 *power_cfg, u32 target); 125int sophgo_pinctrl_reg2oc(struct sophgo_pinctrl *pctrl, 126 const struct sophgo_pin *pin, 127 const u32 *power_cfg, u32 reg); 128int sophgo_pinctrl_schmitt2reg(struct sophgo_pinctrl *pctrl, 129 const struct sophgo_pin *pin, 130 const u32 *power_cfg, u32 target); 131int sophgo_pinctrl_reg2schmitt(struct sophgo_pinctrl *pctrl, 132 const struct sophgo_pin *pin, 133 const u32 *power_cfg, u32 reg); 134int sophgo_pinctrl_probe(struct platform_device *pdev); 135 136#endif /* _PINCTRL_SOPHGO_H */
~/
Read-only file preview.