Skip to content

Commit 1f89aa9

Browse files
claudiubezneageertu
authored andcommitted
pinctrl: renesas: rzg2l: Adapt for different SD/PWPR register offsets
SD, PWPR power registers have different offsets b/w RZ/G2L and RZ/G3S. Add a per SoC configuration data structure that is initialized with the proper register offsets for individual SoCs. The rzg2l_hwcfg structure will be extended further in later commits. Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/20230929053915.1530607-16-claudiu.beznea@bp.renesas.com Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
1 parent 77e1896 commit 1f89aa9

File tree

1 file changed

+42
-10
lines changed

1 file changed

+42
-10
lines changed

drivers/pinctrl/renesas/pinctrl-rzg2l.c

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@
9898
#define IOLH(off) (0x1000 + (off) * 8)
9999
#define IEN(off) (0x1800 + (off) * 8)
100100
#define ISEL(off) (0x2C00 + (off) * 8)
101-
#define PWPR (0x3014)
102-
#define SD_CH(n) (0x3000 + (n) * 4)
101+
#define SD_CH(off, ch) ((off) + (ch) * 4)
103102
#define QSPI (0x3008)
104103

105104
#define PVDD_1800 1 /* I/O domain voltage <= 1.8V */
@@ -124,6 +123,24 @@
124123
#define RZG2L_TINT_IRQ_START_INDEX 9
125124
#define RZG2L_PACK_HWIRQ(t, i) (((t) << 16) | (i))
126125

126+
/**
127+
* struct rzg2l_register_offsets - specific register offsets
128+
* @pwpr: PWPR register offset
129+
* @sd_ch: SD_CH register offset
130+
*/
131+
struct rzg2l_register_offsets {
132+
u16 pwpr;
133+
u16 sd_ch;
134+
};
135+
136+
/**
137+
* struct rzg2l_hwcfg - hardware configuration data structure
138+
* @regs: hardware specific register offsets
139+
*/
140+
struct rzg2l_hwcfg {
141+
const struct rzg2l_register_offsets regs;
142+
};
143+
127144
struct rzg2l_dedicated_configs {
128145
const char *name;
129146
u32 config;
@@ -136,6 +153,7 @@ struct rzg2l_pinctrl_data {
136153
const struct rzg2l_dedicated_configs *dedicated_pins;
137154
unsigned int n_port_pins;
138155
unsigned int n_dedicated_pins;
156+
const struct rzg2l_hwcfg *hwcfg;
139157
};
140158

141159
struct rzg2l_pinctrl {
@@ -163,6 +181,7 @@ static const unsigned int iolh_groupb_oi[] = { 100, 66, 50, 33 };
163181
static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
164182
u8 pin, u8 off, u8 func)
165183
{
184+
const struct rzg2l_register_offsets *regs = &pctrl->data->hwcfg->regs;
166185
unsigned long flags;
167186
u32 reg;
168187

@@ -178,17 +197,17 @@ static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
178197
writeb(reg & ~BIT(pin), pctrl->base + PMC(off));
179198

180199
/* Set the PWPR register to allow PFC register to write */
181-
writel(0x0, pctrl->base + PWPR); /* B0WI=0, PFCWE=0 */
182-
writel(PWPR_PFCWE, pctrl->base + PWPR); /* B0WI=0, PFCWE=1 */
200+
writel(0x0, pctrl->base + regs->pwpr); /* B0WI=0, PFCWE=0 */
201+
writel(PWPR_PFCWE, pctrl->base + regs->pwpr); /* B0WI=0, PFCWE=1 */
183202

184203
/* Select Pin function mode with PFC register */
185204
reg = readl(pctrl->base + PFC(off));
186205
reg &= ~(PFC_MASK << (pin * 4));
187206
writel(reg | (func << (pin * 4)), pctrl->base + PFC(off));
188207

189208
/* Set the PWPR register to be write-protected */
190-
writel(0x0, pctrl->base + PWPR); /* B0WI=0, PFCWE=0 */
191-
writel(PWPR_B0WI, pctrl->base + PWPR); /* B0WI=1, PFCWE=0 */
209+
writel(0x0, pctrl->base + regs->pwpr); /* B0WI=0, PFCWE=0 */
210+
writel(PWPR_B0WI, pctrl->base + regs->pwpr); /* B0WI=1, PFCWE=0 */
192211

193212
/* Switch to Peripheral pin function with PMC register */
194213
reg = readb(pctrl->base + PMC(off));
@@ -523,6 +542,8 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
523542
{
524543
struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
525544
enum pin_config_param param = pinconf_to_config_param(*config);
545+
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
546+
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
526547
const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
527548
unsigned int *pin_data = pin->drv_data;
528549
unsigned int arg = 0;
@@ -558,9 +579,9 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
558579
u32 pwr_reg = 0x0;
559580

560581
if (cfg & PIN_CFG_IO_VMC_SD0)
561-
pwr_reg = SD_CH(0);
582+
pwr_reg = SD_CH(regs->sd_ch, 0);
562583
else if (cfg & PIN_CFG_IO_VMC_SD1)
563-
pwr_reg = SD_CH(1);
584+
pwr_reg = SD_CH(regs->sd_ch, 1);
564585
else if (cfg & PIN_CFG_IO_VMC_QSPI)
565586
pwr_reg = QSPI;
566587
else
@@ -612,6 +633,8 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
612633
struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
613634
const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
614635
unsigned int *pin_data = pin->drv_data;
636+
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
637+
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
615638
enum pin_config_param param;
616639
unsigned long flags;
617640
void __iomem *addr;
@@ -655,9 +678,9 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
655678
return -EINVAL;
656679

657680
if (cfg & PIN_CFG_IO_VMC_SD0)
658-
pwr_reg = SD_CH(0);
681+
pwr_reg = SD_CH(regs->sd_ch, 0);
659682
else if (cfg & PIN_CFG_IO_VMC_SD1)
660-
pwr_reg = SD_CH(1);
683+
pwr_reg = SD_CH(regs->sd_ch, 1);
661684
else if (cfg & PIN_CFG_IO_VMC_QSPI)
662685
pwr_reg = QSPI;
663686
else
@@ -1532,13 +1555,21 @@ static int rzg2l_pinctrl_probe(struct platform_device *pdev)
15321555
return 0;
15331556
}
15341557

1558+
static const struct rzg2l_hwcfg rzg2l_hwcfg = {
1559+
.regs = {
1560+
.pwpr = 0x3014,
1561+
.sd_ch = 0x3000,
1562+
},
1563+
};
1564+
15351565
static struct rzg2l_pinctrl_data r9a07g043_data = {
15361566
.port_pins = rzg2l_gpio_names,
15371567
.port_pin_configs = r9a07g043_gpio_configs,
15381568
.n_ports = ARRAY_SIZE(r9a07g043_gpio_configs),
15391569
.dedicated_pins = rzg2l_dedicated_pins.common,
15401570
.n_port_pins = ARRAY_SIZE(r9a07g043_gpio_configs) * RZG2L_PINS_PER_PORT,
15411571
.n_dedicated_pins = ARRAY_SIZE(rzg2l_dedicated_pins.common),
1572+
.hwcfg = &rzg2l_hwcfg,
15421573
};
15431574

15441575
static struct rzg2l_pinctrl_data r9a07g044_data = {
@@ -1549,6 +1580,7 @@ static struct rzg2l_pinctrl_data r9a07g044_data = {
15491580
.n_port_pins = ARRAY_SIZE(r9a07g044_gpio_configs) * RZG2L_PINS_PER_PORT,
15501581
.n_dedicated_pins = ARRAY_SIZE(rzg2l_dedicated_pins.common) +
15511582
ARRAY_SIZE(rzg2l_dedicated_pins.rzg2l_pins),
1583+
.hwcfg = &rzg2l_hwcfg,
15521584
};
15531585

15541586
static const struct of_device_id rzg2l_pinctrl_of_table[] = {

0 commit comments

Comments
 (0)