diff mbox series

[1/6] misc: add Qualcomm GENI SE QUP device driver

Message ID 20230330194736.2400593-2-vladimir.zapolskiy@linaro.org
State Superseded
Headers show
Series serial: msm-geni: fix UART baudrate on modern platforms | expand

Commit Message

Vladimir Zapolskiy March 30, 2023, 7:47 p.m. UTC
This change adds a Qualcomm GENI SE QUP device driver as a wrapper for
actually enabled and used serial devices found on a board.

At the moment the driver is pretty simple, its intention is to populate
childred devices and provide I/O mem read interface to them as clients,
this is needed for GENI UART driver to set up a proper clock divider
and provide the actually asked baud rate.

Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
---
 drivers/misc/Kconfig        |  6 ++++++
 drivers/misc/Makefile       |  1 +
 drivers/misc/qcom-geni-se.c | 42 +++++++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+)
 create mode 100644 drivers/misc/qcom-geni-se.c

Comments

Konrad Dybcio March 31, 2023, 1:23 a.m. UTC | #1
On 30.03.2023 21:47, Vladimir Zapolskiy wrote:
> This change adds a Qualcomm GENI SE QUP device driver as a wrapper for
> actually enabled and used serial devices found on a board.
> 
> At the moment the driver is pretty simple, its intention is to populate
> childred devices and provide I/O mem read interface to them as clients,
> this is needed for GENI UART driver to set up a proper clock divider
> and provide the actually asked baud rate.
> 
> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> ---
>  drivers/misc/Kconfig        |  6 ++++++
>  drivers/misc/Makefile       |  1 +
>  drivers/misc/qcom-geni-se.c | 42 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 49 insertions(+)
>  create mode 100644 drivers/misc/qcom-geni-se.c
> 
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index b5707a15c504..348e1ab407ad 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -511,6 +511,12 @@ config WINBOND_W83627
>  	  legacy UART or other devices in the Winbond Super IO chips
>  	  on X86 platforms.
>  
> +config QCOM_GENI_SE
> +	bool "Qualcomm GENI Serial Engine Driver"
> +	help
> +	  The driver manages Generic Interface (GENI) firmware based
> +	  Qualcomm Technologies, Inc. Universal Peripheral (QUP) Wrapper.
> +
>  config QFW
>  	bool
>  	help
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index 3b792f2a14ce..52aed096021f 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -60,6 +60,7 @@ obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o
>  obj-$(CONFIG_P2SB) += p2sb-uclass.o
>  obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
>  obj-$(CONFIG_$(SPL_)PWRSEQ) += pwrseq-uclass.o
> +obj-$(CONFIG_QCOM_GENI_SE) += qcom-geni-se.o
>  ifdef CONFIG_QFW
>  obj-y += qfw.o
>  obj-$(CONFIG_QFW_PIO) += qfw_pio.o
> diff --git a/drivers/misc/qcom-geni-se.c b/drivers/misc/qcom-geni-se.c
> new file mode 100644
> index 000000000000..4f1775b11f62
> --- /dev/null
> +++ b/drivers/misc/qcom-geni-se.c
> @@ -0,0 +1,42 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Qualcomm Generic Interface (GENI) Serial Engine (SE) Wrapper
> + *
> + * (C) Copyright 2023 Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <misc.h>
> +#include <asm/io.h>
> +
> +static int geni_se_qup_read(struct udevice *dev, int offset,
> +			    void *buf, int size)
> +{
> +	fdt_addr_t base = dev_read_addr(dev);
> +
> +	if (size != sizeof(u32))
> +		return -EINVAL;
> +
> +	*(u32 *)buf = readl(base + offset);
Maybe 

u32 *buffer = buf;

[...]

*buf = readl..

would be more stylish, but that's a nit and I don't have
any other complaints! :D

Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>

Konrad
> +
> +	return 0;
> +}
> +
> +static struct misc_ops geni_se_qup_ops = {
> +	.read = geni_se_qup_read,
> +};
> +
> +static const struct udevice_id geni_se_qup_ids[] = {
> +	{ .compatible = "qcom,geni-se-qup" },
> +	{}
> +};
> +
> +U_BOOT_DRIVER(geni_se_qup) = {
> +	.name = "geni_se_qup",
> +	.id = UCLASS_MISC,
> +	.of_match = geni_se_qup_ids,
> +	.bind = dm_scan_fdt_dev,
> +	.ops = &geni_se_qup_ops,
> +	.flags  = DM_FLAG_PRE_RELOC,
> +};
Vladimir Zapolskiy April 12, 2023, 12:45 p.m. UTC | #2
On 3/31/23 04:23, Konrad Dybcio wrote:
> 
> 
> On 30.03.2023 21:47, Vladimir Zapolskiy wrote:
>> This change adds a Qualcomm GENI SE QUP device driver as a wrapper for
>> actually enabled and used serial devices found on a board.
>>
>> At the moment the driver is pretty simple, its intention is to populate
>> childred devices and provide I/O mem read interface to them as clients,
>> this is needed for GENI UART driver to set up a proper clock divider
>> and provide the actually asked baud rate.
>>
>> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
>> ---
>>   drivers/misc/Kconfig        |  6 ++++++
>>   drivers/misc/Makefile       |  1 +
>>   drivers/misc/qcom-geni-se.c | 42 +++++++++++++++++++++++++++++++++++++
>>   3 files changed, 49 insertions(+)
>>   create mode 100644 drivers/misc/qcom-geni-se.c
>>
>> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
>> index b5707a15c504..348e1ab407ad 100644
>> --- a/drivers/misc/Kconfig
>> +++ b/drivers/misc/Kconfig
>> @@ -511,6 +511,12 @@ config WINBOND_W83627
>>   	  legacy UART or other devices in the Winbond Super IO chips
>>   	  on X86 platforms.
>>   
>> +config QCOM_GENI_SE
>> +	bool "Qualcomm GENI Serial Engine Driver"
>> +	help
>> +	  The driver manages Generic Interface (GENI) firmware based
>> +	  Qualcomm Technologies, Inc. Universal Peripheral (QUP) Wrapper.
>> +
>>   config QFW
>>   	bool
>>   	help
>> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
>> index 3b792f2a14ce..52aed096021f 100644
>> --- a/drivers/misc/Makefile
>> +++ b/drivers/misc/Makefile
>> @@ -60,6 +60,7 @@ obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o
>>   obj-$(CONFIG_P2SB) += p2sb-uclass.o
>>   obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
>>   obj-$(CONFIG_$(SPL_)PWRSEQ) += pwrseq-uclass.o
>> +obj-$(CONFIG_QCOM_GENI_SE) += qcom-geni-se.o
>>   ifdef CONFIG_QFW
>>   obj-y += qfw.o
>>   obj-$(CONFIG_QFW_PIO) += qfw_pio.o
>> diff --git a/drivers/misc/qcom-geni-se.c b/drivers/misc/qcom-geni-se.c
>> new file mode 100644
>> index 000000000000..4f1775b11f62
>> --- /dev/null
>> +++ b/drivers/misc/qcom-geni-se.c
>> @@ -0,0 +1,42 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Qualcomm Generic Interface (GENI) Serial Engine (SE) Wrapper
>> + *
>> + * (C) Copyright 2023 Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <misc.h>
>> +#include <asm/io.h>
>> +
>> +static int geni_se_qup_read(struct udevice *dev, int offset,
>> +			    void *buf, int size)
>> +{
>> +	fdt_addr_t base = dev_read_addr(dev);
>> +
>> +	if (size != sizeof(u32))
>> +		return -EINVAL;
>> +
>> +	*(u32 *)buf = readl(base + offset);
> Maybe
> 
> u32 *buffer = buf;
> 
> [...]
> 
> *buf = readl..

Well, I'd rather keep it as is, since it's one code of line less.

> would be more stylish, but that's a nit and I don't have
> any other complaints! :D

In fact there is a minor issue with the driver, namely after some
testing I have to remove '.bind = dm_scan_fdt_dev' from the ops,
since it's already done on an upper level.

> Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> 

Thanks for review!

Best wishes,
Vladimir

>> +
>> +	return 0;
>> +}
>> +
>> +static struct misc_ops geni_se_qup_ops = {
>> +	.read = geni_se_qup_read,
>> +};
>> +
>> +static const struct udevice_id geni_se_qup_ids[] = {
>> +	{ .compatible = "qcom,geni-se-qup" },
>> +	{}
>> +};
>> +
>> +U_BOOT_DRIVER(geni_se_qup) = {
>> +	.name = "geni_se_qup",
>> +	.id = UCLASS_MISC,
>> +	.of_match = geni_se_qup_ids,
>> +	.bind = dm_scan_fdt_dev,
>> +	.ops = &geni_se_qup_ops,
>> +	.flags  = DM_FLAG_PRE_RELOC,
>> +};
Simon Glass April 19, 2023, 1:45 a.m. UTC | #3
Hi Vladimir,

On Wed, 12 Apr 2023 at 06:45, Vladimir Zapolskiy
<vladimir.zapolskiy@linaro.org> wrote:
>
> On 3/31/23 04:23, Konrad Dybcio wrote:
> >
> >
> > On 30.03.2023 21:47, Vladimir Zapolskiy wrote:
> >> This change adds a Qualcomm GENI SE QUP device driver as a wrapper for
> >> actually enabled and used serial devices found on a board.
> >>
> >> At the moment the driver is pretty simple, its intention is to populate
> >> childred devices and provide I/O mem read interface to them as clients,
> >> this is needed for GENI UART driver to set up a proper clock divider
> >> and provide the actually asked baud rate.
> >>
> >> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> >> ---
> >>   drivers/misc/Kconfig        |  6 ++++++
> >>   drivers/misc/Makefile       |  1 +
> >>   drivers/misc/qcom-geni-se.c | 42 +++++++++++++++++++++++++++++++++++++
> >>   3 files changed, 49 insertions(+)
> >>   create mode 100644 drivers/misc/qcom-geni-se.c
> >>
> >> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> >> index b5707a15c504..348e1ab407ad 100644
> >> --- a/drivers/misc/Kconfig
> >> +++ b/drivers/misc/Kconfig
> >> @@ -511,6 +511,12 @@ config WINBOND_W83627
> >>        legacy UART or other devices in the Winbond Super IO chips
> >>        on X86 platforms.
> >>
> >> +config QCOM_GENI_SE
> >> +    bool "Qualcomm GENI Serial Engine Driver"
> >> +    help
> >> +      The driver manages Generic Interface (GENI) firmware based
> >> +      Qualcomm Technologies, Inc. Universal Peripheral (QUP) Wrapper.
> >> +
> >>   config QFW
> >>      bool
> >>      help
> >> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> >> index 3b792f2a14ce..52aed096021f 100644
> >> --- a/drivers/misc/Makefile
> >> +++ b/drivers/misc/Makefile
> >> @@ -60,6 +60,7 @@ obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o
> >>   obj-$(CONFIG_P2SB) += p2sb-uclass.o
> >>   obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
> >>   obj-$(CONFIG_$(SPL_)PWRSEQ) += pwrseq-uclass.o
> >> +obj-$(CONFIG_QCOM_GENI_SE) += qcom-geni-se.o
> >>   ifdef CONFIG_QFW
> >>   obj-y += qfw.o
> >>   obj-$(CONFIG_QFW_PIO) += qfw_pio.o
> >> diff --git a/drivers/misc/qcom-geni-se.c b/drivers/misc/qcom-geni-se.c
> >> new file mode 100644
> >> index 000000000000..4f1775b11f62
> >> --- /dev/null
> >> +++ b/drivers/misc/qcom-geni-se.c
> >> @@ -0,0 +1,42 @@
> >> +// SPDX-License-Identifier: GPL-2.0+
> >> +/*
> >> + * Qualcomm Generic Interface (GENI) Serial Engine (SE) Wrapper
> >> + *
> >> + * (C) Copyright 2023 Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> >> + */
> >> +
> >> +#include <common.h>
> >> +#include <dm.h>
> >> +#include <misc.h>
> >> +#include <asm/io.h>
> >> +
> >> +static int geni_se_qup_read(struct udevice *dev, int offset,
> >> +                        void *buf, int size)
> >> +{
> >> +    fdt_addr_t base = dev_read_addr(dev);
> >> +
> >> +    if (size != sizeof(u32))
> >> +            return -EINVAL;
> >> +
> >> +    *(u32 *)buf = readl(base + offset);
> > Maybe
> >
> > u32 *buffer = buf;
> >
> > [...]
> >
> > *buf = readl..
>
> Well, I'd rather keep it as is, since it's one code of line less.
>
> > would be more stylish, but that's a nit and I don't have
> > any other complaints! :D
>
> In fact there is a minor issue with the driver, namely after some
> testing I have to remove '.bind = dm_scan_fdt_dev' from the ops,
> since it's already done on an upper level.
>
> > Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> >
>
> Thanks for review!
>
> Best wishes,
> Vladimir
>
> >> +
> >> +    return 0;
> >> +}
> >> +
> >> +static struct misc_ops geni_se_qup_ops = {
> >> +    .read = geni_se_qup_read,
> >> +};
> >> +
> >> +static const struct udevice_id geni_se_qup_ids[] = {
> >> +    { .compatible = "qcom,geni-se-qup" },
> >> +    {}
> >> +};
> >> +
> >> +U_BOOT_DRIVER(geni_se_qup) = {
> >> +    .name = "geni_se_qup",
> >> +    .id = UCLASS_MISC,
> >> +    .of_match = geni_se_qup_ids,
> >> +    .bind = dm_scan_fdt_dev,
> >> +    .ops = &geni_se_qup_ops,
> >> +    .flags  = DM_FLAG_PRE_RELOC,
> >> +};

Please note that misc_read() should return the number of bytes read, not 0.

Regards,
Simon
Vladimir Zapolskiy April 19, 2023, 9:11 a.m. UTC | #4
Hi Simon,

On 4/19/23 04:45, Simon Glass wrote:
> Hi Vladimir,
> 
> On Wed, 12 Apr 2023 at 06:45, Vladimir Zapolskiy
> <vladimir.zapolskiy@linaro.org> wrote:
>>
>> On 3/31/23 04:23, Konrad Dybcio wrote:
>>>
>>>
>>> On 30.03.2023 21:47, Vladimir Zapolskiy wrote:
>>>> This change adds a Qualcomm GENI SE QUP device driver as a wrapper for
>>>> actually enabled and used serial devices found on a board.
>>>>
>>>> At the moment the driver is pretty simple, its intention is to populate
>>>> childred devices and provide I/O mem read interface to them as clients,
>>>> this is needed for GENI UART driver to set up a proper clock divider
>>>> and provide the actually asked baud rate.
>>>>
>>>> Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
>>>> ---
>>>>    drivers/misc/Kconfig        |  6 ++++++
>>>>    drivers/misc/Makefile       |  1 +
>>>>    drivers/misc/qcom-geni-se.c | 42 +++++++++++++++++++++++++++++++++++++
>>>>    3 files changed, 49 insertions(+)
>>>>    create mode 100644 drivers/misc/qcom-geni-se.c
>>>>
>>>> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
>>>> index b5707a15c504..348e1ab407ad 100644
>>>> --- a/drivers/misc/Kconfig
>>>> +++ b/drivers/misc/Kconfig
>>>> @@ -511,6 +511,12 @@ config WINBOND_W83627
>>>>         legacy UART or other devices in the Winbond Super IO chips
>>>>         on X86 platforms.
>>>>
>>>> +config QCOM_GENI_SE
>>>> +    bool "Qualcomm GENI Serial Engine Driver"
>>>> +    help
>>>> +      The driver manages Generic Interface (GENI) firmware based
>>>> +      Qualcomm Technologies, Inc. Universal Peripheral (QUP) Wrapper.
>>>> +
>>>>    config QFW
>>>>       bool
>>>>       help
>>>> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
>>>> index 3b792f2a14ce..52aed096021f 100644
>>>> --- a/drivers/misc/Makefile
>>>> +++ b/drivers/misc/Makefile
>>>> @@ -60,6 +60,7 @@ obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o
>>>>    obj-$(CONFIG_P2SB) += p2sb-uclass.o
>>>>    obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
>>>>    obj-$(CONFIG_$(SPL_)PWRSEQ) += pwrseq-uclass.o
>>>> +obj-$(CONFIG_QCOM_GENI_SE) += qcom-geni-se.o
>>>>    ifdef CONFIG_QFW
>>>>    obj-y += qfw.o
>>>>    obj-$(CONFIG_QFW_PIO) += qfw_pio.o
>>>> diff --git a/drivers/misc/qcom-geni-se.c b/drivers/misc/qcom-geni-se.c
>>>> new file mode 100644
>>>> index 000000000000..4f1775b11f62
>>>> --- /dev/null
>>>> +++ b/drivers/misc/qcom-geni-se.c
>>>> @@ -0,0 +1,42 @@
>>>> +// SPDX-License-Identifier: GPL-2.0+
>>>> +/*
>>>> + * Qualcomm Generic Interface (GENI) Serial Engine (SE) Wrapper
>>>> + *
>>>> + * (C) Copyright 2023 Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
>>>> + */
>>>> +
>>>> +#include <common.h>
>>>> +#include <dm.h>
>>>> +#include <misc.h>
>>>> +#include <asm/io.h>
>>>> +
>>>> +static int geni_se_qup_read(struct udevice *dev, int offset,
>>>> +                        void *buf, int size)
>>>> +{
>>>> +    fdt_addr_t base = dev_read_addr(dev);
>>>> +
>>>> +    if (size != sizeof(u32))
>>>> +            return -EINVAL;
>>>> +
>>>> +    *(u32 *)buf = readl(base + offset);
>>> Maybe
>>>
>>> u32 *buffer = buf;
>>>
>>> [...]
>>>
>>> *buf = readl..
>>
>> Well, I'd rather keep it as is, since it's one code of line less.
>>
>>> would be more stylish, but that's a nit and I don't have
>>> any other complaints! :D
>>
>> In fact there is a minor issue with the driver, namely after some
>> testing I have to remove '.bind = dm_scan_fdt_dev' from the ops,
>> since it's already done on an upper level.
>>
>>> Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
>>>
>>
>> Thanks for review!
>>
>> Best wishes,
>> Vladimir
>>
>>>> +
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static struct misc_ops geni_se_qup_ops = {
>>>> +    .read = geni_se_qup_read,
>>>> +};
>>>> +
>>>> +static const struct udevice_id geni_se_qup_ids[] = {
>>>> +    { .compatible = "qcom,geni-se-qup" },
>>>> +    {}
>>>> +};
>>>> +
>>>> +U_BOOT_DRIVER(geni_se_qup) = {
>>>> +    .name = "geni_se_qup",
>>>> +    .id = UCLASS_MISC,
>>>> +    .of_match = geni_se_qup_ids,
>>>> +    .bind = dm_scan_fdt_dev,
>>>> +    .ops = &geni_se_qup_ops,
>>>> +    .flags  = DM_FLAG_PRE_RELOC,
>>>> +};
> 
> Please note that misc_read() should return the number of bytes read, not 0.

oh, definitely this should be fixed, and consequently it requires v3 to be sent.

Thank you for review!

--
Best wishes,
Vladimir
diff mbox series

Patch

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index b5707a15c504..348e1ab407ad 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -511,6 +511,12 @@  config WINBOND_W83627
 	  legacy UART or other devices in the Winbond Super IO chips
 	  on X86 platforms.
 
+config QCOM_GENI_SE
+	bool "Qualcomm GENI Serial Engine Driver"
+	help
+	  The driver manages Generic Interface (GENI) firmware based
+	  Qualcomm Technologies, Inc. Universal Peripheral (QUP) Wrapper.
+
 config QFW
 	bool
 	help
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 3b792f2a14ce..52aed096021f 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -60,6 +60,7 @@  obj-$(CONFIG_NUVOTON_NCT6102D) += nuvoton_nct6102d.o
 obj-$(CONFIG_P2SB) += p2sb-uclass.o
 obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
 obj-$(CONFIG_$(SPL_)PWRSEQ) += pwrseq-uclass.o
+obj-$(CONFIG_QCOM_GENI_SE) += qcom-geni-se.o
 ifdef CONFIG_QFW
 obj-y += qfw.o
 obj-$(CONFIG_QFW_PIO) += qfw_pio.o
diff --git a/drivers/misc/qcom-geni-se.c b/drivers/misc/qcom-geni-se.c
new file mode 100644
index 000000000000..4f1775b11f62
--- /dev/null
+++ b/drivers/misc/qcom-geni-se.c
@@ -0,0 +1,42 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Qualcomm Generic Interface (GENI) Serial Engine (SE) Wrapper
+ *
+ * (C) Copyright 2023 Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <misc.h>
+#include <asm/io.h>
+
+static int geni_se_qup_read(struct udevice *dev, int offset,
+			    void *buf, int size)
+{
+	fdt_addr_t base = dev_read_addr(dev);
+
+	if (size != sizeof(u32))
+		return -EINVAL;
+
+	*(u32 *)buf = readl(base + offset);
+
+	return 0;
+}
+
+static struct misc_ops geni_se_qup_ops = {
+	.read = geni_se_qup_read,
+};
+
+static const struct udevice_id geni_se_qup_ids[] = {
+	{ .compatible = "qcom,geni-se-qup" },
+	{}
+};
+
+U_BOOT_DRIVER(geni_se_qup) = {
+	.name = "geni_se_qup",
+	.id = UCLASS_MISC,
+	.of_match = geni_se_qup_ids,
+	.bind = dm_scan_fdt_dev,
+	.ops = &geni_se_qup_ops,
+	.flags  = DM_FLAG_PRE_RELOC,
+};