File Index
Files and directories
Sign in
FILE

pinctrl-sophgo.h

File preview with syntax highlighting.

linux-6.19.14/drivers/pinctrl/sophgo/pinctrl-sophgo.h C
  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.