Skip to content

Commit 5199695

Browse files
claudiubezneageertu
authored andcommitted
pinctrl: renesas: rzg2l: Add support to select power source for Ethernet pins
The GPIO controller available on RZ/G3S (but also on RZ/G2L) supports setting the power source for Ethernet pins. Based on the interface b/w the Ethernet controller and the Ethernet PHY, and on board design, a specific power source needs to be selected. The GPIO controller supports 1.8V, 2.5V, and 3.3V power source selection for the Ethernet pins. This can be selected though the ETHx_POC registers (x={0, 1}). Adjust the driver to support this, and to do proper instantiation for the RZ/G3S and RZ/G2L SoCs. On RZ/G2L only the get operation has been tested at the moment. While at it, as the power registers on RZ/G2L support access sizes of 8 bits, and these registers on RZ/G3S support access sizes of 8/16/32 bits, replace writel()/readl() on these registers with writeb()/readb(). This should allow us to use the same code on both SoCs w/o any issues. Signed-off-by: Claudiu Beznea <[email protected]> Reviewed-by: Geert Uytterhoeven <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Geert Uytterhoeven <[email protected]>
1 parent d3aaa72 commit 5199695

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

drivers/pinctrl/renesas/pinctrl-rzg2l.c

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,17 @@
107107
#define IEN(off) (0x1800 + (off) * 8)
108108
#define ISEL(off) (0x2C00 + (off) * 8)
109109
#define SD_CH(off, ch) ((off) + (ch) * 4)
110+
#define ETH_POC(off, ch) ((off) + (ch) * 4)
110111
#define QSPI (0x3008)
111112

113+
#define PVDD_2500 2 /* I/O domain voltage 2.5V */
112114
#define PVDD_1800 1 /* I/O domain voltage <= 1.8V */
113115
#define PVDD_3300 0 /* I/O domain voltage >= 3.3V */
114116

115117
#define PWPR_B0WI BIT(7) /* Bit Write Disable */
116118
#define PWPR_PFCWE BIT(6) /* PFC Register Write Enable */
117119

118120
#define PM_MASK 0x03
119-
#define PVDD_MASK 0x01
120121
#define PFC_MASK 0x07
121122
#define IEN_MASK 0x01
122123
#define IOLH_MASK 0x03
@@ -135,10 +136,12 @@
135136
* struct rzg2l_register_offsets - specific register offsets
136137
* @pwpr: PWPR register offset
137138
* @sd_ch: SD_CH register offset
139+
* @eth_poc: ETH_POC register offset
138140
*/
139141
struct rzg2l_register_offsets {
140142
u16 pwpr;
141143
u16 sd_ch;
144+
u16 eth_poc;
142145
};
143146

144147
/**
@@ -604,6 +607,10 @@ static int rzg2l_caps_to_pwr_reg(const struct rzg2l_register_offsets *regs, u32
604607
return SD_CH(regs->sd_ch, 0);
605608
if (caps & PIN_CFG_IO_VMC_SD1)
606609
return SD_CH(regs->sd_ch, 1);
610+
if (caps & PIN_CFG_IO_VMC_ETH0)
611+
return ETH_POC(regs->eth_poc, 0);
612+
if (caps & PIN_CFG_IO_VMC_ETH1)
613+
return ETH_POC(regs->eth_poc, 1);
607614
if (caps & PIN_CFG_IO_VMC_QSPI)
608615
return QSPI;
609616

@@ -615,6 +622,7 @@ static int rzg2l_get_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps
615622
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
616623
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
617624
int pwr_reg;
625+
u8 val;
618626

619627
if (caps & PIN_CFG_SOFT_PS)
620628
return pctrl->settings[pin].power_source;
@@ -623,25 +631,51 @@ static int rzg2l_get_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps
623631
if (pwr_reg < 0)
624632
return pwr_reg;
625633

626-
return (readl(pctrl->base + pwr_reg) & PVDD_MASK) ? 1800 : 3300;
634+
val = readb(pctrl->base + pwr_reg);
635+
switch (val) {
636+
case PVDD_1800:
637+
return 1800;
638+
case PVDD_2500:
639+
return 2500;
640+
case PVDD_3300:
641+
return 3300;
642+
default:
643+
/* Should not happen. */
644+
return -EINVAL;
645+
}
627646
}
628647

629648
static int rzg2l_set_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps, u32 ps)
630649
{
631650
const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
632651
const struct rzg2l_register_offsets *regs = &hwcfg->regs;
633652
int pwr_reg;
653+
u8 val;
634654

635655
if (caps & PIN_CFG_SOFT_PS) {
636656
pctrl->settings[pin].power_source = ps;
637657
return 0;
638658
}
639659

660+
switch (ps) {
661+
case 1800:
662+
val = PVDD_1800;
663+
break;
664+
case 2500:
665+
val = PVDD_2500;
666+
break;
667+
case 3300:
668+
val = PVDD_3300;
669+
break;
670+
default:
671+
return -EINVAL;
672+
}
673+
640674
pwr_reg = rzg2l_caps_to_pwr_reg(regs, caps);
641675
if (pwr_reg < 0)
642676
return pwr_reg;
643677

644-
writel((ps == 1800) ? PVDD_1800 : PVDD_3300, pctrl->base + pwr_reg);
678+
writeb(val, pctrl->base + pwr_reg);
645679
pctrl->settings[pin].power_source = ps;
646680

647681
return 0;
@@ -1885,6 +1919,7 @@ static const struct rzg2l_hwcfg rzg2l_hwcfg = {
18851919
.regs = {
18861920
.pwpr = 0x3014,
18871921
.sd_ch = 0x3000,
1922+
.eth_poc = 0x300c,
18881923
},
18891924
.iolh_groupa_ua = {
18901925
/* 3v3 power source */
@@ -1897,6 +1932,7 @@ static const struct rzg2l_hwcfg rzg3s_hwcfg = {
18971932
.regs = {
18981933
.pwpr = 0x3000,
18991934
.sd_ch = 0x3004,
1935+
.eth_poc = 0x3010,
19001936
},
19011937
.iolh_groupa_ua = {
19021938
/* 1v8 power source */

0 commit comments

Comments
 (0)