98
98
#define IOLH (off ) (0x1000 + (off) * 8)
99
99
#define IEN (off ) (0x1800 + (off) * 8)
100
100
#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)
103
102
#define QSPI (0x3008)
104
103
105
104
#define PVDD_1800 1 /* I/O domain voltage <= 1.8V */
124
123
#define RZG2L_TINT_IRQ_START_INDEX 9
125
124
#define RZG2L_PACK_HWIRQ (t , i ) (((t) << 16) | (i))
126
125
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
+
127
144
struct rzg2l_dedicated_configs {
128
145
const char * name ;
129
146
u32 config ;
@@ -136,6 +153,7 @@ struct rzg2l_pinctrl_data {
136
153
const struct rzg2l_dedicated_configs * dedicated_pins ;
137
154
unsigned int n_port_pins ;
138
155
unsigned int n_dedicated_pins ;
156
+ const struct rzg2l_hwcfg * hwcfg ;
139
157
};
140
158
141
159
struct rzg2l_pinctrl {
@@ -163,6 +181,7 @@ static const unsigned int iolh_groupb_oi[] = { 100, 66, 50, 33 };
163
181
static void rzg2l_pinctrl_set_pfc_mode (struct rzg2l_pinctrl * pctrl ,
164
182
u8 pin , u8 off , u8 func )
165
183
{
184
+ const struct rzg2l_register_offsets * regs = & pctrl -> data -> hwcfg -> regs ;
166
185
unsigned long flags ;
167
186
u32 reg ;
168
187
@@ -178,17 +197,17 @@ static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
178
197
writeb (reg & ~BIT (pin ), pctrl -> base + PMC (off ));
179
198
180
199
/* 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 */
183
202
184
203
/* Select Pin function mode with PFC register */
185
204
reg = readl (pctrl -> base + PFC (off ));
186
205
reg &= ~(PFC_MASK << (pin * 4 ));
187
206
writel (reg | (func << (pin * 4 )), pctrl -> base + PFC (off ));
188
207
189
208
/* 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 */
192
211
193
212
/* Switch to Peripheral pin function with PMC register */
194
213
reg = readb (pctrl -> base + PMC (off ));
@@ -523,6 +542,8 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
523
542
{
524
543
struct rzg2l_pinctrl * pctrl = pinctrl_dev_get_drvdata (pctldev );
525
544
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 ;
526
547
const struct pinctrl_pin_desc * pin = & pctrl -> desc .pins [_pin ];
527
548
unsigned int * pin_data = pin -> drv_data ;
528
549
unsigned int arg = 0 ;
@@ -558,9 +579,9 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
558
579
u32 pwr_reg = 0x0 ;
559
580
560
581
if (cfg & PIN_CFG_IO_VMC_SD0 )
561
- pwr_reg = SD_CH (0 );
582
+ pwr_reg = SD_CH (regs -> sd_ch , 0 );
562
583
else if (cfg & PIN_CFG_IO_VMC_SD1 )
563
- pwr_reg = SD_CH (1 );
584
+ pwr_reg = SD_CH (regs -> sd_ch , 1 );
564
585
else if (cfg & PIN_CFG_IO_VMC_QSPI )
565
586
pwr_reg = QSPI ;
566
587
else
@@ -612,6 +633,8 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
612
633
struct rzg2l_pinctrl * pctrl = pinctrl_dev_get_drvdata (pctldev );
613
634
const struct pinctrl_pin_desc * pin = & pctrl -> desc .pins [_pin ];
614
635
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 ;
615
638
enum pin_config_param param ;
616
639
unsigned long flags ;
617
640
void __iomem * addr ;
@@ -655,9 +678,9 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
655
678
return - EINVAL ;
656
679
657
680
if (cfg & PIN_CFG_IO_VMC_SD0 )
658
- pwr_reg = SD_CH (0 );
681
+ pwr_reg = SD_CH (regs -> sd_ch , 0 );
659
682
else if (cfg & PIN_CFG_IO_VMC_SD1 )
660
- pwr_reg = SD_CH (1 );
683
+ pwr_reg = SD_CH (regs -> sd_ch , 1 );
661
684
else if (cfg & PIN_CFG_IO_VMC_QSPI )
662
685
pwr_reg = QSPI ;
663
686
else
@@ -1532,13 +1555,21 @@ static int rzg2l_pinctrl_probe(struct platform_device *pdev)
1532
1555
return 0 ;
1533
1556
}
1534
1557
1558
+ static const struct rzg2l_hwcfg rzg2l_hwcfg = {
1559
+ .regs = {
1560
+ .pwpr = 0x3014 ,
1561
+ .sd_ch = 0x3000 ,
1562
+ },
1563
+ };
1564
+
1535
1565
static struct rzg2l_pinctrl_data r9a07g043_data = {
1536
1566
.port_pins = rzg2l_gpio_names ,
1537
1567
.port_pin_configs = r9a07g043_gpio_configs ,
1538
1568
.n_ports = ARRAY_SIZE (r9a07g043_gpio_configs ),
1539
1569
.dedicated_pins = rzg2l_dedicated_pins .common ,
1540
1570
.n_port_pins = ARRAY_SIZE (r9a07g043_gpio_configs ) * RZG2L_PINS_PER_PORT ,
1541
1571
.n_dedicated_pins = ARRAY_SIZE (rzg2l_dedicated_pins .common ),
1572
+ .hwcfg = & rzg2l_hwcfg ,
1542
1573
};
1543
1574
1544
1575
static struct rzg2l_pinctrl_data r9a07g044_data = {
@@ -1549,6 +1580,7 @@ static struct rzg2l_pinctrl_data r9a07g044_data = {
1549
1580
.n_port_pins = ARRAY_SIZE (r9a07g044_gpio_configs ) * RZG2L_PINS_PER_PORT ,
1550
1581
.n_dedicated_pins = ARRAY_SIZE (rzg2l_dedicated_pins .common ) +
1551
1582
ARRAY_SIZE (rzg2l_dedicated_pins .rzg2l_pins ),
1583
+ .hwcfg = & rzg2l_hwcfg ,
1552
1584
};
1553
1585
1554
1586
static const struct of_device_id rzg2l_pinctrl_of_table [] = {
0 commit comments