drivers/pinctrl/qcom/pinctrl-msm.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/qcom/pinctrl-msm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/qcom/pinctrl-msm.c- Extension
.c- Size
- 44005 bytes
- Lines
- 1627
- Domain
- Driver Families
- Bucket
- drivers/pinctrl
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/delay.hlinux/err.hlinux/gpio/driver.hlinux/interrupt.hlinux/io.hlinux/log2.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/pm.hlinux/firmware/qcom/qcom_scm.hlinux/reboot.hlinux/seq_file.hlinux/slab.hlinux/spinlock.hlinux/string_choices.hlinux/pinctrl/machine.hlinux/pinctrl/pinconf-generic.hlinux/pinctrl/pinconf.hlinux/pinctrl/pinmux.hlinux/soc/qcom/irq.h../core.h../pinconf.h../pinctrl-utils.h../pinmux.hpinctrl-msm.h
Detected Declarations
struct msm_pinctrlfunction msm_readl_intr_targetfunction msm_writel_intr_targetfunction msm_ack_intr_statusfunction msm_get_groups_countfunction msm_get_group_pinsfunction msm_pinmux_requestfunction msm_pinmux_set_muxfunction msm_pinmux_request_gpiofunction msm_config_regfunction msm_regval_to_drivefunction msm_config_group_getfunction msm_config_group_setfunction msm_gpio_direction_inputfunction msm_gpio_direction_outputfunction msm_gpio_get_directionfunction msm_gpio_getfunction msm_gpio_setfunction msm_gpio_dbg_show_onefunction msm_gpio_dbg_showfunction msm_gpio_init_valid_maskfunction msm_gpio_update_dual_edge_posfunction msm_gpio_irq_maskfunction msm_gpio_irq_unmaskfunction msm_gpio_irq_enablefunction msm_gpio_irq_disablefunction msm_gpio_update_dual_edge_parentfunction msm_gpio_irq_ackfunction msm_gpio_irq_eoifunction msm_gpio_needs_dual_edge_parent_workaroundfunction msm_gpio_irq_init_valid_maskfunction msm_gpio_irq_set_typefunction msm_gpio_irq_set_wakefunction msm_gpio_irq_reqresfunction msm_gpio_irq_relresfunction msm_gpio_irq_set_affinityfunction msm_gpio_irq_set_vcpu_affinityfunction msm_gpio_irq_handlerfunction msm_gpio_wakeirqfunction msm_gpio_needs_valid_maskfunction msm_gpio_initfunction gpiochip_add_pin_rangefunction msm_ps_hold_restartfunction msm_ps_hold_powerofffunction msm_pinctrl_setup_pm_resetfunction msm_pinctrl_suspendfunction msm_pinctrl_resumefunction msm_pinctrl_probe
Annotated Snippet
struct msm_pinctrl {
struct device *dev;
struct pinctrl_dev *pctrl;
struct gpio_chip chip;
struct pinctrl_desc desc;
int irq;
bool intr_target_use_scm;
raw_spinlock_t lock;
DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
DECLARE_BITMAP(skip_wake_irqs, MAX_NR_GPIO);
DECLARE_BITMAP(disabled_for_mux, MAX_NR_GPIO);
DECLARE_BITMAP(ever_gpio, MAX_NR_GPIO);
const struct msm_pinctrl_soc_data *soc;
void __iomem *regs[MAX_NR_TILES];
u32 phys_base[MAX_NR_TILES];
};
#define MSM_ACCESSOR(name) \
static u32 msm_readl_##name(struct msm_pinctrl *pctrl, \
const struct msm_pingroup *g) \
{ \
return readl(pctrl->regs[g->tile] + g->name##_reg); \
} \
static void msm_writel_##name(u32 val, struct msm_pinctrl *pctrl, \
const struct msm_pingroup *g) \
{ \
writel(val, pctrl->regs[g->tile] + g->name##_reg); \
}
MSM_ACCESSOR(ctl)
MSM_ACCESSOR(io)
MSM_ACCESSOR(intr_cfg)
MSM_ACCESSOR(intr_status)
static u32 msm_readl_intr_target(struct msm_pinctrl *pctrl,
const struct msm_pingroup *g)
{
u32 reg = g->intr_target_reg ? g->intr_target_reg : g->intr_cfg_reg;
return readl(pctrl->regs[g->tile] + reg);
}
static void msm_writel_intr_target(u32 val, struct msm_pinctrl *pctrl,
const struct msm_pingroup *g)
{
u32 reg = g->intr_target_reg ? g->intr_target_reg : g->intr_cfg_reg;
writel(val, pctrl->regs[g->tile] + reg);
}
static void msm_ack_intr_status(struct msm_pinctrl *pctrl,
const struct msm_pingroup *g)
{
u32 val = g->intr_ack_high ? BIT(g->intr_status_bit) : 0;
msm_writel_intr_status(val, pctrl, g);
}
static int msm_get_groups_count(struct pinctrl_dev *pctldev)
{
struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
return pctrl->soc->ngroups;
}
static const char *msm_get_group_name(struct pinctrl_dev *pctldev,
unsigned group)
{
struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
return pctrl->soc->groups[group].grp.name;
}
static int msm_get_group_pins(struct pinctrl_dev *pctldev,
unsigned group,
const unsigned **pins,
unsigned *num_pins)
{
struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
*pins = pctrl->soc->groups[group].grp.pins;
*num_pins = pctrl->soc->groups[group].grp.npins;
return 0;
}
Annotation
- Immediate include surface: `linux/delay.h`, `linux/err.h`, `linux/gpio/driver.h`, `linux/interrupt.h`, `linux/io.h`, `linux/log2.h`, `linux/module.h`, `linux/of.h`.
- Detected declarations: `struct msm_pinctrl`, `function msm_readl_intr_target`, `function msm_writel_intr_target`, `function msm_ack_intr_status`, `function msm_get_groups_count`, `function msm_get_group_pins`, `function msm_pinmux_request`, `function msm_pinmux_set_mux`, `function msm_pinmux_request_gpio`, `function msm_config_reg`.
- Atlas domain: Driver Families / drivers/pinctrl.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.