13370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song/*
23370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * pinmux driver shared headfile for CSR SiRFsoc
33370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song *
43370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
53370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song *
63370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * Licensed under GPLv2 or later.
73370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song */
83370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
93370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#ifndef __PINMUX_SIRF_H__
103370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define __PINMUX_SIRF_H__
113370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
126a08a92ec45782e5543addf5f8785e2560a078f6Rong Wang#define SIRFSOC_NUM_PADS		622
136a08a92ec45782e5543addf5f8785e2560a078f6Rong Wang#define SIRFSOC_RSC_USB_UART_SHARE	0
146a08a92ec45782e5543addf5f8785e2560a078f6Rong Wang#define SIRFSOC_RSC_PIN_MUX		0x4
153370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
163370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_PAD_EN(g)		((g)*0x100 + 0x84)
173370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_PAD_EN_CLR(g)	((g)*0x100 + 0x90)
183370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTRL(g, i)			((g)*0x100 + (i)*4)
193370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_DSP_EN0			(0x80)
203370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_INT_STATUS(g)		((g)*0x100 + 0x8C)
213370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
223370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_INTR_LOW_MASK		0x1
233370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_INTR_HIGH_MASK		0x2
243370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_INTR_TYPE_MASK		0x4
253370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_INTR_EN_MASK		0x8
263370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_INTR_STS_MASK		0x10
273370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_OUT_EN_MASK		0x20
283370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_DATAOUT_MASK		0x40
293370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_DATAIN_MASK		0x80
303370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_PULL_MASK		0x100
313370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_PULL_HIGH		0x200
323370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_CTL_DSP_INT		0x400
333370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
343370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_NO_OF_BANKS        5
353370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_BANK_SIZE          32
363370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_GPIO_NUM(bank, index)	(((bank)*(32)) + (index))
373370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
383370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song/**
393370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * @dev: a pointer back to containing device
403370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * @virtbase: the offset to the controller in virtual memory
413370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song */
423370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_pmx {
433370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	struct device *dev;
443370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	struct pinctrl_dev *pmx;
453370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	void __iomem *gpio_virtbase;
463370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	void __iomem *rsc_virtbase;
473370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	u32 gpio_regs[SIRFSOC_GPIO_NO_OF_BANKS][SIRFSOC_GPIO_BANK_SIZE];
483370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	u32 ints_regs[SIRFSOC_GPIO_NO_OF_BANKS];
493370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	u32 paden_regs[SIRFSOC_GPIO_NO_OF_BANKS];
503370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	u32 dspen_regs;
513370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	u32 rsc_regs[3];
523370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	bool is_marco;
533370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
543370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
553370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song/* SIRFSOC_GPIO_PAD_EN set */
563370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_muxmask {
573370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	unsigned long group;
583370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	unsigned long mask;
593370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
603370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
613370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_padmux {
623370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	unsigned long muxmask_counts;
633370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const struct sirfsoc_muxmask *muxmask;
643370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	/* RSC_PIN_MUX set */
656a08a92ec45782e5543addf5f8785e2560a078f6Rong Wang	unsigned long ctrlreg;
663370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	unsigned long funcmask;
673370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	unsigned long funcval;
683370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
693370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
703370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song /**
713370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * struct sirfsoc_pin_group - describes a SiRFprimaII pin group
723370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * @name: the name of this specific pin group
733370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * @pins: an array of discrete physical pins used in this group, taken
743370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song *	from the driver-local pin enumeration space
753370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song * @num_pins: the number of pins in this group array, i.e. the number of
763370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song *	elements in .pins so we can iterate over that array
773370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song */
783370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_pin_group {
793370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const char *name;
803370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const unsigned int *pins;
813370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const unsigned num_pins;
823370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
833370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
843370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_PIN_GROUP(n, p)  \
853370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	{			\
863370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.name = n,	\
873370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.pins = p,	\
883370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.num_pins = ARRAY_SIZE(p),	\
893370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	}
903370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
913370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_pmx_func {
923370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const char *name;
933370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const char * const *groups;
943370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const unsigned num_groups;
953370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	const struct sirfsoc_padmux *padmux;
963370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
973370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
983370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#define SIRFSOC_PMX_FUNCTION(n, g, m)		\
993370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	{					\
1003370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.name = n,			\
1013370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.groups = g,			\
1023370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.num_groups = ARRAY_SIZE(g),	\
1033370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song		.padmux = &m,			\
1043370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	}
1053370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
1063370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songstruct sirfsoc_pinctrl_data {
1073370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	struct pinctrl_pin_desc *pads;
1083370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	int pads_cnt;
1093370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	struct sirfsoc_pin_group *grps;
1103370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	int grps_cnt;
1113370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	struct sirfsoc_pmx_func *funcs;
1123370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song	int funcs_cnt;
1133370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song};
1143370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
1153370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songextern struct sirfsoc_pinctrl_data prima2_pinctrl_data;
1163370dc916c90578107cc8485ac86e6d6dc81a88fBarry Songextern struct sirfsoc_pinctrl_data atlas6_pinctrl_data;
1173370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song
1183370dc916c90578107cc8485ac86e6d6dc81a88fBarry Song#endif
119