diff mbox

pinctrl: sh-pfc: r8a7795: Add DRIF support

Message ID 1466165981-65284-1-git-send-email-ramesh.shanmugasundaram@bp.renesas.com (mailing list archive)
State Superseded
Delegated to: Geert Uytterhoeven
Headers show

Commit Message

Ramesh Shanmugasundaram June 17, 2016, 12:19 p.m. UTC
This patch adds DRIF[0-3] pinmux support for r8a7795 SoC.

Signed-off-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
---
 drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121 +++++++++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)

Comments

Geert Uytterhoeven June 17, 2016, 1:24 p.m. UTC | #1
Hi Ramesh,

On Fri, Jun 17, 2016 at 2:19 PM, Ramesh Shanmugasundaram
<ramesh.shanmugasundaram@bp.renesas.com> wrote:
> This patch adds DRIF[0-3] pinmux support for r8a7795 SoC.
>
> Signed-off-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>

Thanks for your patch!

> ---
>  drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121 +++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>
> diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
> index 33be5d56..6f246ec 100644
> --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
> +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
> @@ -1658,6 +1658,91 @@ static const unsigned int canfd1_data_mux[] = {
>         CANFD1_TX_MARK,         CANFD1_RX_MARK,
>  };
>
> +/* - DRIF --------------------------------------------------------------- */
> +static const unsigned int drif0_data_a_pins[] = {
> +       /* CLK, SYNC, D0, D1 */
> +       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),
> +       RCAR_GP_PIN(6, 7),
> +};
> +static const unsigned int drif0_data_a_mux[] = {
> +       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK, RIF0_D1_A_MARK,
> +};

According to my information, each DRIF module consists of two sub-modules
(that's why there are 8 module clocks for 4 DRIF modules), each handling a data
pin, but sharing the CLK and SYNC signals.
Hence it's possible to receive using only one data pin. Is that correct?

Shouldn't the pinctrl data reflect that? The second unused data pin could be
used for something else.

One way to handle this is like SDHI and DU do: provide 2 sets of data, one for
single-bit, and one for dual-bit configurations:
  - "drif0_data1_a_pins" for CLK, SYNC, and D0,
  - "drif0_data2_a_pins" for CLK. SYNC, D0, and D1.

Alternative, it could be split in 3 groups:
  - "drif0_ctrl_a_pins" for CLK and SYNC,
  - "drif0_data0_a_pins for D0,
  - "drif0_data1_a_pins for D1.

I think the latter is preferable, as you can probably configure the DRIF to
receive data through D1 only, and leave D0 unused?

> +static const unsigned int drif3_data_a_pins[] = {
> +       /* CLK, SYNC, D0, D1 */
> +       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19),
> +       RCAR_GP_PIN(6, 10),

According to my datasheet, the above line should be

        RCAR_GP_PIN(6, 20),

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Ramesh Shanmugasundaram June 17, 2016, 2:16 p.m. UTC | #2
Hi Geert,

Thanks for your time and review

> >  drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121

> > +++++++++++++++++++++++++++++++++++

> >  1 file changed, 121 insertions(+)

> >

> > diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> > b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> > index 33be5d56..6f246ec 100644

> > --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> > +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> > @@ -1658,6 +1658,91 @@ static const unsigned int canfd1_data_mux[] = {

> >         CANFD1_TX_MARK,         CANFD1_RX_MARK,

> >  };

> >

> > +/* - DRIF

> > +--------------------------------------------------------------- */

> static const unsigned int drif0_data_a_pins[] = {

> > +       /* CLK, SYNC, D0, D1 */

> > +       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),

> > +       RCAR_GP_PIN(6, 7),

> > +};

> > +static const unsigned int drif0_data_a_mux[] = {

> > +       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK,

> > +RIF0_D1_A_MARK, };

> 

> According to my information, each DRIF module consists of two sub-modules

> (that's why there are 8 module clocks for 4 DRIF modules), each handling a

> data pin, but sharing the CLK and SYNC signals.

> Hence it's possible to receive using only one data pin. Is that correct?


Yes, that is correct.

> 

> Shouldn't the pinctrl data reflect that? The second unused data pin could

> be used for something else.


Is that possible? For e.g. when MOD_SEL0(bit8 -> sel_drif2) is set to 0, all the 4 pins are owned by DRIF IP(RIF2_XXX_A set) even though one of the RIF2_D0_A or RIF2_D1_A may be unused depending on the master it interfaces with. Am I missing something?

> 

> One way to handle this is like SDHI and DU do: provide 2 sets of data, one

> for single-bit, and one for dual-bit configurations:

>   - "drif0_data1_a_pins" for CLK, SYNC, and D0,

>   - "drif0_data2_a_pins" for CLK. SYNC, D0, and D1.

> 

> Alternative, it could be split in 3 groups:

>   - "drif0_ctrl_a_pins" for CLK and SYNC,

>   - "drif0_data0_a_pins for D0,

>   - "drif0_data1_a_pins for D1.

> 

> I think the latter is preferable, as you can probably configure the DRIF

> to receive data through D1 only, and leave D0 unused?

> 

> > +static const unsigned int drif3_data_a_pins[] = {

> > +       /* CLK, SYNC, D0, D1 */

> > +       RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19),

> > +       RCAR_GP_PIN(6, 10),

> 

> According to my datasheet, the above line should be

> 

>         RCAR_GP_PIN(6, 20),


You are right. Thanks again. I'll fix that typo :-(

Thanks,
Ramesh
Geert Uytterhoeven June 21, 2016, 7:37 a.m. UTC | #3
Hi Ramesh,

CC linux-gpio, LinusW, Laurent

On Fri, Jun 17, 2016 at 4:16 PM, Ramesh Shanmugasundaram
<ramesh.shanmugasundaram@bp.renesas.com> wrote:
>> >  drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121
>> > +++++++++++++++++++++++++++++++++++
>> >  1 file changed, 121 insertions(+)
>> >
>> > diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> > b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> > index 33be5d56..6f246ec 100644
>> > --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> > +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> > @@ -1658,6 +1658,91 @@ static const unsigned int canfd1_data_mux[] = {
>> >         CANFD1_TX_MARK,         CANFD1_RX_MARK,
>> >  };
>> >
>> > +/* - DRIF
>> > +--------------------------------------------------------------- */
>> static const unsigned int drif0_data_a_pins[] = {
>> > +       /* CLK, SYNC, D0, D1 */
>> > +       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),
>> > +       RCAR_GP_PIN(6, 7),
>> > +};
>> > +static const unsigned int drif0_data_a_mux[] = {
>> > +       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK,
>> > +RIF0_D1_A_MARK, };
>>
>> According to my information, each DRIF module consists of two sub-modules
>> (that's why there are 8 module clocks for 4 DRIF modules), each handling a
>> data pin, but sharing the CLK and SYNC signals.
>> Hence it's possible to receive using only one data pin. Is that correct?
>
> Yes, that is correct.
>
>> Shouldn't the pinctrl data reflect that? The second unused data pin could
>> be used for something else.
>
> Is that possible? For e.g. when MOD_SEL0(bit8 -> sel_drif2) is set to 0, all the 4 pins are owned by DRIF IP(RIF2_XXX_A set) even though one of the RIF2_D0_A or RIF2_D1_A may be unused depending on the master it interfaces with. Am I missing something?

You're right, the whole block is switched.

The unused data pin can still be configured as a GPIO, as the GPSR register
(to select between GPIO and IP function) takes precedence.

Linus/Laurent: I assume the GPIO also takes precedence in the Linux pinctrl
subsystem, or would it return an error, as the pin is claimed by the IP group?

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Ramesh Shanmugasundaram June 22, 2016, 1:51 p.m. UTC | #4
Hi Geert,

> CC linux-gpio, LinusW, Laurent

> 

> On Fri, Jun 17, 2016 at 4:16 PM, Ramesh Shanmugasundaram

> <ramesh.shanmugasundaram@bp.renesas.com> wrote:

> >> >  drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121

> >> > +++++++++++++++++++++++++++++++++++

> >> >  1 file changed, 121 insertions(+)

> >> >

> >> > diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> >> > b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> >> > index 33be5d56..6f246ec 100644

> >> > --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> >> > +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c

> >> > @@ -1658,6 +1658,91 @@ static const unsigned int canfd1_data_mux[] =

> {

> >> >         CANFD1_TX_MARK,         CANFD1_RX_MARK,

> >> >  };

> >> >

> >> > +/* - DRIF

> >> > +--------------------------------------------------------------- */

> >> static const unsigned int drif0_data_a_pins[] = {

> >> > +       /* CLK, SYNC, D0, D1 */

> >> > +       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),

> >> > +       RCAR_GP_PIN(6, 7),

> >> > +};

> >> > +static const unsigned int drif0_data_a_mux[] = {

> >> > +       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK,

> >> > +RIF0_D1_A_MARK, };

> >>

> >> According to my information, each DRIF module consists of two

> >> sub-modules (that's why there are 8 module clocks for 4 DRIF

> >> modules), each handling a data pin, but sharing the CLK and SYNC

> signals.

> >> Hence it's possible to receive using only one data pin. Is that

> correct?

> >

> > Yes, that is correct.

> >

> >> Shouldn't the pinctrl data reflect that? The second unused data pin

> >> could be used for something else.

> >

> > Is that possible? For e.g. when MOD_SEL0(bit8 -> sel_drif2) is set to 0,

> all the 4 pins are owned by DRIF IP(RIF2_XXX_A set) even though one of the

> RIF2_D0_A or RIF2_D1_A may be unused depending on the master it interfaces

> with. Am I missing something?

> 

> You're right, the whole block is switched.

> 

> The unused data pin can still be configured as a GPIO, as the GPSR

> register (to select between GPIO and IP function) takes precedence.


Is this precedence mentioned in h/w manual or is it based on current code & execution order? I assume it's the later?

> 

> Linus/Laurent: I assume the GPIO also takes precedence in the Linux

> pinctrl subsystem, or would it return an error, as the pin is claimed by

> the IP group?

> 


Looking at the code, pinctrl core does not allow multiple pin requests/claims when "strict" pmxops flag is set. However, Renesas pinctrl driver does not set this flag. So the request can proceed further in our case.

On my board, after IP claiming all the 4 pins I could still export one of the pins as GPIO (pinctrl subsystem is OK with it). From this point IP did not receive any data on this pin as expected. The other way around is around (GPIO->IP) is not possible because of this check in sh_pfc_func_set_mux.

359                 if (cfg->type != PINMUX_TYPE_NONE) {

I am happy with splitting the drif pins into three groups based on the above observation

  - "drif0_ctrl_a_pins" for CLK and SYNC,
  - "drif0_data0_a_pins for D0,
  - "drif0_data1_a_pins for D1.

If you are OK, I will send the reworked patch.

Thanks,
Ramesh
Geert Uytterhoeven June 22, 2016, 2:04 p.m. UTC | #5
Hi Ramesh,

On Wed, Jun 22, 2016 at 3:51 PM, Ramesh Shanmugasundaram
<ramesh.shanmugasundaram@bp.renesas.com> wrote:
>> CC linux-gpio, LinusW, Laurent
>>
>> On Fri, Jun 17, 2016 at 4:16 PM, Ramesh Shanmugasundaram
>> <ramesh.shanmugasundaram@bp.renesas.com> wrote:
>> >> >  drivers/pinctrl/sh-pfc/pfc-r8a7795.c | 121
>> >> > +++++++++++++++++++++++++++++++++++
>> >> >  1 file changed, 121 insertions(+)
>> >> >
>> >> > diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> >> > b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> >> > index 33be5d56..6f246ec 100644
>> >> > --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> >> > +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
>> >> > @@ -1658,6 +1658,91 @@ static const unsigned int canfd1_data_mux[] =
>> {
>> >> >         CANFD1_TX_MARK,         CANFD1_RX_MARK,
>> >> >  };
>> >> >
>> >> > +/* - DRIF
>> >> > +--------------------------------------------------------------- */
>> >> static const unsigned int drif0_data_a_pins[] = {
>> >> > +       /* CLK, SYNC, D0, D1 */
>> >> > +       RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),
>> >> > +       RCAR_GP_PIN(6, 7),
>> >> > +};
>> >> > +static const unsigned int drif0_data_a_mux[] = {
>> >> > +       RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK,
>> >> > +RIF0_D1_A_MARK, };
>> >>
>> >> According to my information, each DRIF module consists of two
>> >> sub-modules (that's why there are 8 module clocks for 4 DRIF
>> >> modules), each handling a data pin, but sharing the CLK and SYNC
>> signals.
>> >> Hence it's possible to receive using only one data pin. Is that
>> correct?
>> >
>> > Yes, that is correct.
>> >
>> >> Shouldn't the pinctrl data reflect that? The second unused data pin
>> >> could be used for something else.
>> >
>> > Is that possible? For e.g. when MOD_SEL0(bit8 -> sel_drif2) is set to 0,
>> all the 4 pins are owned by DRIF IP(RIF2_XXX_A set) even though one of the
>> RIF2_D0_A or RIF2_D1_A may be unused depending on the master it interfaces
>> with. Am I missing something?
>>
>> You're right, the whole block is switched.
>>
>> The unused data pin can still be configured as a GPIO, as the GPSR
>> register (to select between GPIO and IP function) takes precedence.
>
> Is this precedence mentioned in h/w manual or is it based on current code & execution order? I assume it's the later?

Please see Figure 6.2 ("Procedure for Changing Pin Function from Peripheral
function to GPIO."), which says clearing a bit in GPSR is sufficient to
configure the corresponding pin as a GPIO.

>> Linus/Laurent: I assume the GPIO also takes precedence in the Linux
>> pinctrl subsystem, or would it return an error, as the pin is claimed by
>> the IP group?
>
> Looking at the code, pinctrl core does not allow multiple pin requests/claims when "strict" pmxops flag is set. However, Renesas pinctrl driver does not set this flag. So the request can proceed further in our case.
>
> On my board, after IP claiming all the 4 pins I could still export one of the pins as GPIO (pinctrl subsystem is OK with it). From this point IP did not receive any data on this pin as expected. The other way around is around (GPIO->IP) is not possible because of this check in sh_pfc_func_set_mux.
>
> 359                 if (cfg->type != PINMUX_TYPE_NONE) {

Thanks for verifying!

> I am happy with splitting the drif pins into three groups based on the above observation
>
>   - "drif0_ctrl_a_pins" for CLK and SYNC,
>   - "drif0_data0_a_pins for D0,
>   - "drif0_data1_a_pins for D1.
>
> If you are OK, I will send the reworked patch.

Thanks, that sounds great!

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Linus Walleij June 23, 2016, 9:13 a.m. UTC | #6
On Tue, Jun 21, 2016 at 9:37 AM, Geert Uytterhoeven
<geert@linux-m68k.org> wrote:

> Linus/Laurent: I assume the GPIO also takes precedence in the Linux pinctrl
> subsystem, or would it return an error, as the pin is claimed by the IP group?

Complicated question. Depends on the .strict property is set on the pin
controller, see Documentation/pinctrl.txt

Yours,
Linus Walleij
diff mbox

Patch

diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
index 33be5d56..6f246ec 100644
--- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
+++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
@@ -1658,6 +1658,91 @@  static const unsigned int canfd1_data_mux[] = {
 	CANFD1_TX_MARK,         CANFD1_RX_MARK,
 };
 
+/* - DRIF --------------------------------------------------------------- */
+static const unsigned int drif0_data_a_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 10),
+	RCAR_GP_PIN(6, 7),
+};
+static const unsigned int drif0_data_a_mux[] = {
+	RIF0_CLK_A_MARK, RIF0_SYNC_A_MARK, RIF0_D0_A_MARK, RIF0_D1_A_MARK,
+};
+static const unsigned int drif0_data_b_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 1),
+	RCAR_GP_PIN(5, 2),
+};
+static const unsigned int drif0_data_b_mux[] = {
+	RIF0_CLK_B_MARK, RIF0_SYNC_B_MARK, RIF0_D0_B_MARK, RIF0_D1_B_MARK,
+};
+static const unsigned int drif0_data_c_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 15), RCAR_GP_PIN(5, 13),
+	RCAR_GP_PIN(5, 14),
+};
+static const unsigned int drif0_data_c_mux[] = {
+	RIF0_CLK_C_MARK, RIF0_SYNC_C_MARK, RIF0_D0_C_MARK, RIF0_D1_C_MARK,
+};
+
+static const unsigned int drif1_data_a_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19),
+	RCAR_GP_PIN(6, 20),
+};
+static const unsigned int drif1_data_a_mux[] = {
+	RIF1_CLK_A_MARK, RIF1_SYNC_A_MARK, RIF1_D0_A_MARK, RIF1_D1_A_MARK,
+};
+static const unsigned int drif1_data_b_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(5, 9), RCAR_GP_PIN(5, 3), RCAR_GP_PIN(5, 7),
+	RCAR_GP_PIN(5, 8),
+};
+static const unsigned int drif1_data_b_mux[] = {
+	RIF1_CLK_B_MARK, RIF1_SYNC_B_MARK, RIF1_D0_B_MARK, RIF1_D1_B_MARK,
+};
+static const unsigned int drif1_data_c_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 11), RCAR_GP_PIN(5, 6),
+	RCAR_GP_PIN(5, 10),
+};
+static const unsigned int drif1_data_c_mux[] = {
+	RIF1_CLK_C_MARK, RIF1_SYNC_C_MARK, RIF1_D0_C_MARK, RIF1_D1_C_MARK,
+};
+
+static const unsigned int drif2_data_a_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), RCAR_GP_PIN(6, 7),
+	RCAR_GP_PIN(6, 10),
+};
+static const unsigned int drif2_data_a_mux[] = {
+	RIF2_CLK_A_MARK, RIF2_SYNC_A_MARK, RIF2_D0_A_MARK, RIF2_D1_A_MARK,
+};
+static const unsigned int drif2_data_b_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 26), RCAR_GP_PIN(6, 27), RCAR_GP_PIN(6, 30),
+	RCAR_GP_PIN(6, 31),
+};
+static const unsigned int drif2_data_b_mux[] = {
+	RIF2_CLK_B_MARK, RIF2_SYNC_B_MARK, RIF2_D0_B_MARK, RIF2_D1_B_MARK,
+};
+
+static const unsigned int drif3_data_a_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 17), RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19),
+	RCAR_GP_PIN(6, 10),
+};
+static const unsigned int drif3_data_a_mux[] = {
+	RIF3_CLK_A_MARK, RIF3_SYNC_A_MARK, RIF3_D0_A_MARK, RIF3_D1_A_MARK,
+};
+static const unsigned int drif3_data_b_pins[] = {
+	/* CLK, SYNC, D0, D1 */
+	RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25), RCAR_GP_PIN(6, 28),
+	RCAR_GP_PIN(6, 29),
+};
+static const unsigned int drif3_data_b_mux[] = {
+	RIF3_CLK_B_MARK, RIF3_SYNC_B_MARK, RIF3_D0_B_MARK, RIF3_D1_B_MARK,
+};
+
 /* - HSCIF0 ----------------------------------------------------------------- */
 static const unsigned int hscif0_data_pins[] = {
 	/* RX, TX */
@@ -3350,6 +3435,16 @@  static const struct sh_pfc_pin_group pinmux_groups[] = {
 	SH_PFC_PIN_GROUP(canfd0_data_a),
 	SH_PFC_PIN_GROUP(canfd0_data_b),
 	SH_PFC_PIN_GROUP(canfd1_data),
+	SH_PFC_PIN_GROUP(drif0_data_a),
+	SH_PFC_PIN_GROUP(drif0_data_b),
+	SH_PFC_PIN_GROUP(drif0_data_c),
+	SH_PFC_PIN_GROUP(drif1_data_a),
+	SH_PFC_PIN_GROUP(drif1_data_b),
+	SH_PFC_PIN_GROUP(drif1_data_c),
+	SH_PFC_PIN_GROUP(drif2_data_a),
+	SH_PFC_PIN_GROUP(drif2_data_b),
+	SH_PFC_PIN_GROUP(drif3_data_a),
+	SH_PFC_PIN_GROUP(drif3_data_b),
 	SH_PFC_PIN_GROUP(hscif0_data),
 	SH_PFC_PIN_GROUP(hscif0_clk),
 	SH_PFC_PIN_GROUP(hscif0_ctrl),
@@ -3633,6 +3728,28 @@  static const char * const canfd1_groups[] = {
 	"canfd1_data",
 };
 
+static const char * const drif0_groups[] = {
+	"drif0_data_a",
+	"drif0_data_b",
+	"drif0_data_c",
+};
+
+static const char * const drif1_groups[] = {
+	"drif1_data_a",
+	"drif1_data_b",
+	"drif1_data_c",
+};
+
+static const char * const drif2_groups[] = {
+	"drif2_data_a",
+	"drif2_data_b",
+};
+
+static const char * const drif3_groups[] = {
+	"drif3_data_a",
+	"drif3_data_b",
+};
+
 static const char * const hscif0_groups[] = {
 	"hscif0_data",
 	"hscif0_clk",
@@ -3976,6 +4093,10 @@  static const struct sh_pfc_function pinmux_functions[] = {
 	SH_PFC_FUNCTION(can_clk),
 	SH_PFC_FUNCTION(canfd0),
 	SH_PFC_FUNCTION(canfd1),
+	SH_PFC_FUNCTION(drif0),
+	SH_PFC_FUNCTION(drif1),
+	SH_PFC_FUNCTION(drif2),
+	SH_PFC_FUNCTION(drif3),
 	SH_PFC_FUNCTION(hscif0),
 	SH_PFC_FUNCTION(hscif1),
 	SH_PFC_FUNCTION(hscif2),