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 */
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+
127144struct 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
141159struct rzg2l_pinctrl {
@@ -163,6 +181,7 @@ static const unsigned int iolh_groupb_oi[] = { 100, 66, 50, 33 };
163181static 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+
15351565static 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
15441575static 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
15541586static const struct of_device_id rzg2l_pinctrl_of_table [] = {
0 commit comments