* [PATCH 0/2] drm/panel: Add NewVision NV3051D Panels @ 2022-09-06 18:52 Chris Morgan 2022-09-06 18:52 ` [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings Chris Morgan 2022-09-06 18:52 ` [PATCH 2/2] drm/panel: Add NewVision NV3051D MIPI-DSI LCD panel Chris Morgan 0 siblings, 2 replies; 8+ messages in thread From: Chris Morgan @ 2022-09-06 18:52 UTC (permalink / raw) To: dri-devel Cc: devicetree, krzysztof.kozlowski+dt, airlied, Chris Morgan, robh+dt, thierry.reding, sam From: Chris Morgan <macromorgan@hotmail.com> Add the NewVision NV3051D panel as found on the Anbernic RG353P and RG353V. The underlying LCD panel itself is unknown (the NV3051D is the controller), so the device name is used for the panel. Chris Morgan (2): dt-bindings: display: panel: Add NewVision NV3051D panel bindings drm/panel: Add NewVision NV3051D MIPI-DSI LCD panel .../display/panel/newvision,nv3051d.yaml | 48 ++ drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-newvision-nv3051d.c | 478 ++++++++++++++++++ 4 files changed, 536 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml create mode 100644 drivers/gpu/drm/panel/panel-newvision-nv3051d.c -- 2.25.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-06 18:52 [PATCH 0/2] drm/panel: Add NewVision NV3051D Panels Chris Morgan @ 2022-09-06 18:52 ` Chris Morgan 2022-09-07 12:53 ` Krzysztof Kozlowski 2022-09-06 18:52 ` [PATCH 2/2] drm/panel: Add NewVision NV3051D MIPI-DSI LCD panel Chris Morgan 1 sibling, 1 reply; 8+ messages in thread From: Chris Morgan @ 2022-09-06 18:52 UTC (permalink / raw) To: dri-devel Cc: devicetree, krzysztof.kozlowski+dt, airlied, Chris Morgan, robh+dt, thierry.reding, sam From: Chris Morgan <macromorgan@hotmail.com> Add documentation for the NewVision NV3051D panel bindings. Note that for the two expected consumers of this panel binding the underlying LCD model is unknown. Signed-off-by: Chris Morgan <macromorgan@hotmail.com> --- .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml new file mode 100644 index 000000000000..016168d8d7b2 --- /dev/null +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/newvision,nv3051d.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NewVision NV3051D based DSI panel driver + +maintainers: + - Chris Morgan <macromorgan@hotmail.com> + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + enum: + - anbernic,rg353p-panel + - anbernic,rg353v-panel + reg: true + backlight: true + port: true + reset-gpios: true + vdd-supply: + description: regulator that supplies the vdd voltage + +required: + - compatible + - reg + - backlight + - vdd-supply + +additionalProperties: false + +examples: + - | + dsi { + #address-cells = <1>; + #size-cells = <0>; + panel@0 { + compatible = "anbernic,rg353p-panel"; + reg = <0>; + backlight = <&backlight>; + vdd-supply = <&vcc3v3_lcd>; + }; + }; + +... -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-06 18:52 ` [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings Chris Morgan @ 2022-09-07 12:53 ` Krzysztof Kozlowski 2022-09-07 13:35 ` Chris Morgan 0 siblings, 1 reply; 8+ messages in thread From: Krzysztof Kozlowski @ 2022-09-07 12:53 UTC (permalink / raw) To: Chris Morgan, dri-devel Cc: devicetree, krzysztof.kozlowski+dt, airlied, Chris Morgan, robh+dt, thierry.reding, sam On 06/09/2022 20:52, Chris Morgan wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > Add documentation for the NewVision NV3051D panel bindings. > Note that for the two expected consumers of this panel binding > the underlying LCD model is unknown. > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > --- > .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ > 1 file changed, 48 insertions(+) > create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > new file mode 100644 > index 000000000000..016168d8d7b2 > --- /dev/null > +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/display/panel/newvision,nv3051d.yaml# You need to document vendor prefix... but the filename does not match compatible. > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: NewVision NV3051D based DSI panel driver This is confusing - compatibles say something else. > + > +maintainers: > + - Chris Morgan <macromorgan@hotmail.com> > + > +allOf: > + - $ref: panel-common.yaml# > + > +properties: > + compatible: > + enum: > + - anbernic,rg353p-panel > + - anbernic,rg353v-panel Missing space, missing documentation for vendor prefix. Strip "panel" suffix unless device is multifunctional. > + reg: true > + backlight: true Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-07 12:53 ` Krzysztof Kozlowski @ 2022-09-07 13:35 ` Chris Morgan 2022-09-08 15:18 ` Krzysztof Kozlowski 2022-09-09 1:42 ` Rob Herring 0 siblings, 2 replies; 8+ messages in thread From: Chris Morgan @ 2022-09-07 13:35 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: devicetree, krzysztof.kozlowski+dt, airlied, dri-devel, Chris Morgan, robh+dt, thierry.reding, sam On Wed, Sep 07, 2022 at 02:53:56PM +0200, Krzysztof Kozlowski wrote: > On 06/09/2022 20:52, Chris Morgan wrote: > > From: Chris Morgan <macromorgan@hotmail.com> > > > > Add documentation for the NewVision NV3051D panel bindings. > > Note that for the two expected consumers of this panel binding > > the underlying LCD model is unknown. > > > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > > --- > > .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ > > 1 file changed, 48 insertions(+) > > create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > > diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > new file mode 100644 > > index 000000000000..016168d8d7b2 > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > @@ -0,0 +1,48 @@ > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > > +%YAML 1.2 > > +--- > > +$id: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fschemas%2Fdisplay%2Fpanel%2Fnewvision%2Cnv3051d.yaml%23&data=05%7C01%7C%7C69d30de15aea41517acb08da90d0079f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637981520397977782%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=qfuvbrQYP3rKnp%2ByPmPmn%2BCJJOQkNkTGT49FkJmIics%3D&reserved=0 > > You need to document vendor prefix... but the filename does not match > compatible. Okay, will do that. This is a tricky one because while I know the panel controller IC (a NewVision NV3051D) I don't actually know the LCD panel itself, the vendor is somewhat tight lipped. I do know the product it goes into, so that's why I did what I did with the compatible strings. If that's not correct I guess let me know. I did see for other drivers (such as the NewVision NV3052C) the driver was written for the IC and the panel name was listed differently, hence what I was going for here. > > > +$schema: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fmeta-schemas%2Fcore.yaml%23&data=05%7C01%7C%7C69d30de15aea41517acb08da90d0079f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637981520397977782%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=AYwypW%2BA9xWCN6YYwC7oI5UDW6QmiP7%2FmAoKlm7x3jM%3D&reserved=0 > > + > > +title: NewVision NV3051D based DSI panel driver > > This is confusing - compatibles say something else. > Right. Driver IC is the NV3051D, LCD panel itself is... well... not sure... > > + > > +maintainers: > > + - Chris Morgan <macromorgan@hotmail.com> > > + > > +allOf: > > + - $ref: panel-common.yaml# > > + > > +properties: > > + compatible: > > + enum: > > + - anbernic,rg353p-panel > > + - anbernic,rg353v-panel > > Missing space, missing documentation for vendor prefix. > > Strip "panel" suffix unless device is multifunctional. > The device name itself is Anbernic RG353P (and RG353V). The driver is not multifunctional but again I don't really know what the LCD itself is called so I'm trying to name it after the device. I only know the driver IC. > > + reg: true > > + backlight: true > > > Best regards, > Krzysztof Thank you once again for all your help, sorry to be such a bother in this. I'm honestly not sure the best way to name and document a panel when I only know one of the part numbers (the IC). ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-07 13:35 ` Chris Morgan @ 2022-09-08 15:18 ` Krzysztof Kozlowski 2022-09-09 1:42 ` Rob Herring 1 sibling, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2022-09-08 15:18 UTC (permalink / raw) To: Chris Morgan Cc: devicetree, krzysztof.kozlowski+dt, airlied, dri-devel, Chris Morgan, robh+dt, thierry.reding, sam On 07/09/2022 15:35, Chris Morgan wrote: > On Wed, Sep 07, 2022 at 02:53:56PM +0200, Krzysztof Kozlowski wrote: >> On 06/09/2022 20:52, Chris Morgan wrote: >>> From: Chris Morgan <macromorgan@hotmail.com> >>> >>> Add documentation for the NewVision NV3051D panel bindings. >>> Note that for the two expected consumers of this panel binding >>> the underlying LCD model is unknown. >>> >>> Signed-off-by: Chris Morgan <macromorgan@hotmail.com> >>> --- >>> .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ >>> 1 file changed, 48 insertions(+) >>> create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml >>> >>> diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml >>> new file mode 100644 >>> index 000000000000..016168d8d7b2 >>> --- /dev/null >>> +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml >>> @@ -0,0 +1,48 @@ >>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) >>> +%YAML 1.2 >>> +--- >>> +$id: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fschemas%2Fdisplay%2Fpanel%2Fnewvision%2Cnv3051d.yaml%23&data=05%7C01%7C%7C69d30de15aea41517acb08da90d0079f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637981520397977782%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=qfuvbrQYP3rKnp%2ByPmPmn%2BCJJOQkNkTGT49FkJmIics%3D&reserved=0 >> >> You need to document vendor prefix... but the filename does not match >> compatible. > > Okay, will do that. This is a tricky one because while I know the panel > controller IC (a NewVision NV3051D) I don't actually know the LCD panel > itself, the vendor is somewhat tight lipped. I do know the product it > goes into, so that's why I did what I did with the compatible strings. > If that's not correct I guess let me know. I did see for other drivers > (such as the NewVision NV3052C) the driver was written for the IC > and the panel name was listed differently, hence what I was going for > here. If by "driver" you mean by "Linux driver", then it does not really matter. You describe here the hardware. The example of NV3052C follows this approach - proper compatible and file name matching hardware. Here your file name does not match hardware. > >> >>> +$schema: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fmeta-schemas%2Fcore.yaml%23&data=05%7C01%7C%7C69d30de15aea41517acb08da90d0079f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637981520397977782%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=AYwypW%2BA9xWCN6YYwC7oI5UDW6QmiP7%2FmAoKlm7x3jM%3D&reserved=0 >>> + >>> +title: NewVision NV3051D based DSI panel driver >> >> This is confusing - compatibles say something else. >> > > Right. Driver IC is the NV3051D, LCD panel itself is... well... not > sure... I guess similarly to ltk035c5444t this should be documentation of panel? > >>> + >>> +maintainers: >>> + - Chris Morgan <macromorgan@hotmail.com> >>> + >>> +allOf: >>> + - $ref: panel-common.yaml# >>> + >>> +properties: >>> + compatible: >>> + enum: >>> + - anbernic,rg353p-panel >>> + - anbernic,rg353v-panel >> >> Missing space, missing documentation for vendor prefix. >> >> Strip "panel" suffix unless device is multifunctional. >> > > The device name itself is Anbernic RG353P (and RG353V). The driver is > not multifunctional but again I don't really know what the LCD itself > is called so I'm trying to name it after the device. I only know the > driver IC. So skip panel. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-07 13:35 ` Chris Morgan 2022-09-08 15:18 ` Krzysztof Kozlowski @ 2022-09-09 1:42 ` Rob Herring 2022-09-12 21:40 ` Chris Morgan 1 sibling, 1 reply; 8+ messages in thread From: Rob Herring @ 2022-09-09 1:42 UTC (permalink / raw) To: Chris Morgan Cc: devicetree, krzysztof.kozlowski+dt, airlied, dri-devel, Chris Morgan, Krzysztof Kozlowski, thierry.reding, sam On Wed, Sep 07, 2022 at 08:35:13AM -0500, Chris Morgan wrote: > On Wed, Sep 07, 2022 at 02:53:56PM +0200, Krzysztof Kozlowski wrote: > > On 06/09/2022 20:52, Chris Morgan wrote: > > > From: Chris Morgan <macromorgan@hotmail.com> > > > > > > Add documentation for the NewVision NV3051D panel bindings. > > > Note that for the two expected consumers of this panel binding > > > the underlying LCD model is unknown. > > > > > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > > > --- > > > .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ > > > 1 file changed, 48 insertions(+) > > > create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > > > > diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > new file mode 100644 > > > index 000000000000..016168d8d7b2 > > > --- /dev/null > > > +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > @@ -0,0 +1,48 @@ > > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > > > +%YAML 1.2 > > > +--- > > > +$id: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fschemas%2Fdisplay%2Fpanel%2Fnewvision%2Cnv3051d.yaml%23&data=05%7C01%7C%7C69d30de15aea41517acb08da90d0079f%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637981520397977782%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=qfuvbrQYP3rKnp%2ByPmPmn%2BCJJOQkNkTGT49FkJmIics%3D&reserved=0 > > > > You need to document vendor prefix... but the filename does not match > > compatible. > > Okay, will do that. This is a tricky one because while I know the panel > controller IC (a NewVision NV3051D) I don't actually know the LCD panel > itself, the vendor is somewhat tight lipped. I do know the product it > goes into, so that's why I did what I did with the compatible strings. > If that's not correct I guess let me know. I did see for other drivers > (such as the NewVision NV3052C) the driver was written for the IC > and the panel name was listed differently, hence what I was going for > here. I think most cases like this targeting a specific LCD driver IC, there's a driver IC compatible as a fallback. (TBC, 'driver' here is not Linux driver, but the h/w chip.) Rob ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings 2022-09-09 1:42 ` Rob Herring @ 2022-09-12 21:40 ` Chris Morgan 0 siblings, 0 replies; 8+ messages in thread From: Chris Morgan @ 2022-09-12 21:40 UTC (permalink / raw) To: Rob Herring Cc: devicetree, krzysztof.kozlowski+dt, airlied, dri-devel, Chris Morgan, Krzysztof Kozlowski, thierry.reding, sam On Thu, Sep 08, 2022 at 08:42:35PM -0500, Rob Herring wrote: > On Wed, Sep 07, 2022 at 08:35:13AM -0500, Chris Morgan wrote: > > On Wed, Sep 07, 2022 at 02:53:56PM +0200, Krzysztof Kozlowski wrote: > > > On 06/09/2022 20:52, Chris Morgan wrote: > > > > From: Chris Morgan <macromorgan@hotmail.com> > > > > > > > > Add documentation for the NewVision NV3051D panel bindings. > > > > Note that for the two expected consumers of this panel binding > > > > the underlying LCD model is unknown. > > > > > > > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> > > > > --- > > > > .../display/panel/newvision,nv3051d.yaml | 48 +++++++++++++++++++ > > > > 1 file changed, 48 insertions(+) > > > > create mode 100644 Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > > > > > > diff --git a/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > > new file mode 100644 > > > > index 000000000000..016168d8d7b2 > > > > --- /dev/null > > > > +++ b/Documentation/devicetree/bindings/display/panel/newvision,nv3051d.yaml > > > > @@ -0,0 +1,48 @@ > > > > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > > > > +%YAML 1.2 > > > > +--- > > > > +$id: https://nam12.safelinks.protection.outlook.com/?url=http%3A%2F%2Fdevicetree.org%2Fschemas%2Fdisplay%2Fpanel%2Fnewvision%2Cnv3051d.yaml%23&data=05%7C01%7C%7Cab7f68ce677846b1638508da920493a4%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637982845610791935%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=6XxrzD1zkl8SYQqV9nkH1WzKfdcy6doNfzan8r228W0%3D&reserved=0 > > > > > > You need to document vendor prefix... but the filename does not match > > > compatible. > > > > Okay, will do that. This is a tricky one because while I know the panel > > controller IC (a NewVision NV3051D) I don't actually know the LCD panel > > itself, the vendor is somewhat tight lipped. I do know the product it > > goes into, so that's why I did what I did with the compatible strings. > > If that's not correct I guess let me know. I did see for other drivers > > (such as the NewVision NV3052C) the driver was written for the IC > > and the panel name was listed differently, hence what I was going for > > here. > > I think most cases like this targeting a specific LCD driver IC, there's > a driver IC compatible as a fallback. > > (TBC, 'driver' here is not Linux driver, but the h/w chip.) > > Rob So in this case would my compatible string in the devicetree need to be something like "anbernic,rg353-panel", "newvision,nv3051d" then? And the module itself have the compatible string of "newvision,nv3051d"? My fear is that I write this as a newvision,nv3051d kernel module and then later on there comes a new panel using the nv3051d that wants to use this too. Again keeping things confusing I have no LCD panel part number from the manufacturer for this, and I cannot see anything on the panel itself denoting what LCD it is. Thank you for your help. Just wrapping up getting some of my favorite devices supported in mainline. :-) ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/2] drm/panel: Add NewVision NV3051D MIPI-DSI LCD panel 2022-09-06 18:52 [PATCH 0/2] drm/panel: Add NewVision NV3051D Panels Chris Morgan 2022-09-06 18:52 ` [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings Chris Morgan @ 2022-09-06 18:52 ` Chris Morgan 1 sibling, 0 replies; 8+ messages in thread From: Chris Morgan @ 2022-09-06 18:52 UTC (permalink / raw) To: dri-devel Cc: devicetree, krzysztof.kozlowski+dt, airlied, Chris Morgan, robh+dt, thierry.reding, sam From: Chris Morgan <macromorgan@hotmail.com> Support NewVision NV3051D panels as found on the Anbernic RG353P and RG353V. The underlying panel part number for the RG353x devices is unknown, so the device name is used instead. Signed-off-by: Chris Morgan <macromorgan@hotmail.com> --- drivers/gpu/drm/panel/Kconfig | 9 + drivers/gpu/drm/panel/Makefile | 1 + .../gpu/drm/panel/panel-newvision-nv3051d.c | 478 ++++++++++++++++++ 3 files changed, 488 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-newvision-nv3051d.c diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig index a9043eacce97..7258d28dda2f 100644 --- a/drivers/gpu/drm/panel/Kconfig +++ b/drivers/gpu/drm/panel/Kconfig @@ -296,6 +296,15 @@ config DRM_PANEL_NEC_NL8048HL11 panel (found on the Zoom2/3/3630 SDP boards). To compile this driver as a module, choose M here. +config DRM_PANEL_NEWVISION_NV3051D + tristate "NewVision NV3051D DSI panel" + depends on OF + depends on DRM_MIPI_DSI + depends on BACKLIGHT_CLASS_DEVICE + help + This driver supports the NV3051D based panel found on the Anbernic + RG353P and RG353V. + config DRM_PANEL_NEWVISION_NV3052C tristate "NewVision NV3052C RGB/SPI panel" depends on OF && SPI diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile index 34e717382dbb..cb03b3a82738 100644 --- a/drivers/gpu/drm/panel/Makefile +++ b/drivers/gpu/drm/panel/Makefile @@ -27,6 +27,7 @@ obj-$(CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829) += panel-leadtek-ltk500hd1829.o obj-$(CONFIG_DRM_PANEL_LG_LB035Q02) += panel-lg-lb035q02.o obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o +obj-$(CONFIG_DRM_PANEL_NEWVISION_NV3051D) += panel-newvision-nv3051d.o obj-$(CONFIG_DRM_PANEL_NEWVISION_NV3052C) += panel-newvision-nv3052c.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT35510) += panel-novatek-nt35510.o obj-$(CONFIG_DRM_PANEL_NOVATEK_NT35560) += panel-novatek-nt35560.o diff --git a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c new file mode 100644 index 000000000000..c46edd4df765 --- /dev/null +++ b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c @@ -0,0 +1,478 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * NV3051D MIPI-DSI panel driver for Anbernic RG353x + * Copyright (C) 2022 Chris Morgan + * + * based on + * + * Elida kd35t133 3.5" MIPI-DSI panel driver + * Copyright (C) Theobroma Systems 2020 + */ + +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/media-bus-format.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/regulator/consumer.h> + +#include <video/display_timing.h> +#include <video/mipi_display.h> + +#include <drm/drm_mipi_dsi.h> +#include <drm/drm_modes.h> +#include <drm/drm_panel.h> + +struct panel_nv3051d { + struct device *dev; + struct drm_panel panel; + struct gpio_desc *reset_gpio; + struct regulator *vdd; + bool prepared; +}; + +static inline struct panel_nv3051d *panel_to_panelnv3051d(struct drm_panel *panel) +{ + return container_of(panel, struct panel_nv3051d, panel); +} + +#define dsi_dcs_write_seq(dsi, cmd, seq...) do { \ + static const u8 b[] = { cmd, seq }; \ + int ret; \ + ret = mipi_dsi_dcs_write_buffer(dsi, b, ARRAY_SIZE(b)); \ + if (ret < 0) \ + return ret; \ + } while (0) + +static int panel_nv3051d_init_sequence(struct panel_nv3051d *ctx) +{ + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); + + /* + * Init sequence was supplied by device vendor with no + * documentation. + */ + + dsi_dcs_write_seq(dsi, 0xFF, 0x30); + dsi_dcs_write_seq(dsi, 0xFF, 0x52); + dsi_dcs_write_seq(dsi, 0xFF, 0x01); + dsi_dcs_write_seq(dsi, 0xE3, 0x00); + dsi_dcs_write_seq(dsi, 0x03, 0x40); + dsi_dcs_write_seq(dsi, 0x04, 0x00); + dsi_dcs_write_seq(dsi, 0x05, 0x03); + dsi_dcs_write_seq(dsi, 0x24, 0x12); + dsi_dcs_write_seq(dsi, 0x25, 0x1E); + dsi_dcs_write_seq(dsi, 0x26, 0x28); + dsi_dcs_write_seq(dsi, 0x27, 0x52); + dsi_dcs_write_seq(dsi, 0x28, 0x57); + dsi_dcs_write_seq(dsi, 0x29, 0x01); + dsi_dcs_write_seq(dsi, 0x2A, 0xDF); + dsi_dcs_write_seq(dsi, 0x38, 0x9C); + dsi_dcs_write_seq(dsi, 0x39, 0xA7); + dsi_dcs_write_seq(dsi, 0x3A, 0x53); + dsi_dcs_write_seq(dsi, 0x44, 0x00); + dsi_dcs_write_seq(dsi, 0x49, 0x3C); + dsi_dcs_write_seq(dsi, 0x59, 0xFE); + dsi_dcs_write_seq(dsi, 0x5C, 0x00); + dsi_dcs_write_seq(dsi, 0x91, 0x77); + dsi_dcs_write_seq(dsi, 0x92, 0x77); + dsi_dcs_write_seq(dsi, 0xA0, 0x55); + dsi_dcs_write_seq(dsi, 0xA1, 0x50); + dsi_dcs_write_seq(dsi, 0xA4, 0x9C); + dsi_dcs_write_seq(dsi, 0xA7, 0x02); + dsi_dcs_write_seq(dsi, 0xA8, 0x01); + dsi_dcs_write_seq(dsi, 0xA9, 0x01); + dsi_dcs_write_seq(dsi, 0xAA, 0xFC); + dsi_dcs_write_seq(dsi, 0xAB, 0x28); + dsi_dcs_write_seq(dsi, 0xAC, 0x06); + dsi_dcs_write_seq(dsi, 0xAD, 0x06); + dsi_dcs_write_seq(dsi, 0xAE, 0x06); + dsi_dcs_write_seq(dsi, 0xAF, 0x03); + dsi_dcs_write_seq(dsi, 0xB0, 0x08); + dsi_dcs_write_seq(dsi, 0xB1, 0x26); + dsi_dcs_write_seq(dsi, 0xB2, 0x28); + dsi_dcs_write_seq(dsi, 0xB3, 0x28); + dsi_dcs_write_seq(dsi, 0xB4, 0x33); + dsi_dcs_write_seq(dsi, 0xB5, 0x08); + dsi_dcs_write_seq(dsi, 0xB6, 0x26); + dsi_dcs_write_seq(dsi, 0xB7, 0x08); + dsi_dcs_write_seq(dsi, 0xB8, 0x26); + dsi_dcs_write_seq(dsi, 0xFF, 0x30); + dsi_dcs_write_seq(dsi, 0xFF, 0x52); + dsi_dcs_write_seq(dsi, 0xFF, 0x02); + dsi_dcs_write_seq(dsi, 0xB1, 0x0E); + dsi_dcs_write_seq(dsi, 0xD1, 0x0E); + dsi_dcs_write_seq(dsi, 0xB4, 0x29); + dsi_dcs_write_seq(dsi, 0xD4, 0x2B); + dsi_dcs_write_seq(dsi, 0xB2, 0x0C); + dsi_dcs_write_seq(dsi, 0xD2, 0x0A); + dsi_dcs_write_seq(dsi, 0xB3, 0x28); + dsi_dcs_write_seq(dsi, 0xD3, 0x28); + dsi_dcs_write_seq(dsi, 0xB6, 0x11); + dsi_dcs_write_seq(dsi, 0xD6, 0x0D); + dsi_dcs_write_seq(dsi, 0xB7, 0x32); + dsi_dcs_write_seq(dsi, 0xD7, 0x30); + dsi_dcs_write_seq(dsi, 0xC1, 0x04); + dsi_dcs_write_seq(dsi, 0xE1, 0x06); + dsi_dcs_write_seq(dsi, 0xB8, 0x0A); + dsi_dcs_write_seq(dsi, 0xD8, 0x0A); + dsi_dcs_write_seq(dsi, 0xB9, 0x01); + dsi_dcs_write_seq(dsi, 0xD9, 0x01); + dsi_dcs_write_seq(dsi, 0xBD, 0x13); + dsi_dcs_write_seq(dsi, 0xDD, 0x13); + dsi_dcs_write_seq(dsi, 0xBC, 0x11); + dsi_dcs_write_seq(dsi, 0xDC, 0x11); + dsi_dcs_write_seq(dsi, 0xBB, 0x0F); + dsi_dcs_write_seq(dsi, 0xDB, 0x0F); + dsi_dcs_write_seq(dsi, 0xBA, 0x0F); + dsi_dcs_write_seq(dsi, 0xDA, 0x0F); + dsi_dcs_write_seq(dsi, 0xBE, 0x18); + dsi_dcs_write_seq(dsi, 0xDE, 0x18); + dsi_dcs_write_seq(dsi, 0xBF, 0x0F); + dsi_dcs_write_seq(dsi, 0xDF, 0x0F); + dsi_dcs_write_seq(dsi, 0xC0, 0x17); + dsi_dcs_write_seq(dsi, 0xE0, 0x17); + dsi_dcs_write_seq(dsi, 0xB5, 0x3B); + dsi_dcs_write_seq(dsi, 0xD5, 0x3C); + dsi_dcs_write_seq(dsi, 0xB0, 0x0B); + dsi_dcs_write_seq(dsi, 0xD0, 0x0C); + dsi_dcs_write_seq(dsi, 0xFF, 0x30); + dsi_dcs_write_seq(dsi, 0xFF, 0x52); + dsi_dcs_write_seq(dsi, 0xFF, 0x03); + dsi_dcs_write_seq(dsi, 0x00, 0x2A); + dsi_dcs_write_seq(dsi, 0x01, 0x2A); + dsi_dcs_write_seq(dsi, 0x02, 0x2A); + dsi_dcs_write_seq(dsi, 0x03, 0x2A); + dsi_dcs_write_seq(dsi, 0x04, 0x61); + dsi_dcs_write_seq(dsi, 0x05, 0x80); + dsi_dcs_write_seq(dsi, 0x06, 0xC7); + dsi_dcs_write_seq(dsi, 0x07, 0x01); + dsi_dcs_write_seq(dsi, 0x08, 0x82); + dsi_dcs_write_seq(dsi, 0x09, 0x83); + dsi_dcs_write_seq(dsi, 0x30, 0x2A); + dsi_dcs_write_seq(dsi, 0x31, 0x2A); + dsi_dcs_write_seq(dsi, 0x32, 0x2A); + dsi_dcs_write_seq(dsi, 0x33, 0x2A); + dsi_dcs_write_seq(dsi, 0x34, 0x61); + dsi_dcs_write_seq(dsi, 0x35, 0xC5); + dsi_dcs_write_seq(dsi, 0x36, 0x80); + dsi_dcs_write_seq(dsi, 0x37, 0x23); + dsi_dcs_write_seq(dsi, 0x40, 0x82); + dsi_dcs_write_seq(dsi, 0x41, 0x83); + dsi_dcs_write_seq(dsi, 0x42, 0x80); + dsi_dcs_write_seq(dsi, 0x43, 0x81); + dsi_dcs_write_seq(dsi, 0x44, 0x11); + dsi_dcs_write_seq(dsi, 0x45, 0xF2); + dsi_dcs_write_seq(dsi, 0x46, 0xF1); + dsi_dcs_write_seq(dsi, 0x47, 0x11); + dsi_dcs_write_seq(dsi, 0x48, 0xF4); + dsi_dcs_write_seq(dsi, 0x49, 0xF3); + dsi_dcs_write_seq(dsi, 0x50, 0x02); + dsi_dcs_write_seq(dsi, 0x51, 0x01); + dsi_dcs_write_seq(dsi, 0x52, 0x04); + dsi_dcs_write_seq(dsi, 0x53, 0x03); + dsi_dcs_write_seq(dsi, 0x54, 0x11); + dsi_dcs_write_seq(dsi, 0x55, 0xF6); + dsi_dcs_write_seq(dsi, 0x56, 0xF5); + dsi_dcs_write_seq(dsi, 0x57, 0x11); + dsi_dcs_write_seq(dsi, 0x58, 0xF8); + dsi_dcs_write_seq(dsi, 0x59, 0xF7); + dsi_dcs_write_seq(dsi, 0x7E, 0x02); + dsi_dcs_write_seq(dsi, 0x7F, 0x80); + dsi_dcs_write_seq(dsi, 0xE0, 0x5A); + dsi_dcs_write_seq(dsi, 0xB1, 0x00); + dsi_dcs_write_seq(dsi, 0xB4, 0x0E); + dsi_dcs_write_seq(dsi, 0xB5, 0x0F); + dsi_dcs_write_seq(dsi, 0xB6, 0x04); + dsi_dcs_write_seq(dsi, 0xB7, 0x07); + dsi_dcs_write_seq(dsi, 0xB8, 0x06); + dsi_dcs_write_seq(dsi, 0xB9, 0x05); + dsi_dcs_write_seq(dsi, 0xBA, 0x0F); + dsi_dcs_write_seq(dsi, 0xC7, 0x00); + dsi_dcs_write_seq(dsi, 0xCA, 0x0E); + dsi_dcs_write_seq(dsi, 0xCB, 0x0F); + dsi_dcs_write_seq(dsi, 0xCC, 0x04); + dsi_dcs_write_seq(dsi, 0xCD, 0x07); + dsi_dcs_write_seq(dsi, 0xCE, 0x06); + dsi_dcs_write_seq(dsi, 0xCF, 0x05); + dsi_dcs_write_seq(dsi, 0xD0, 0x0F); + dsi_dcs_write_seq(dsi, 0x81, 0x0F); + dsi_dcs_write_seq(dsi, 0x84, 0x0E); + dsi_dcs_write_seq(dsi, 0x85, 0x0F); + dsi_dcs_write_seq(dsi, 0x86, 0x07); + dsi_dcs_write_seq(dsi, 0x87, 0x04); + dsi_dcs_write_seq(dsi, 0x88, 0x05); + dsi_dcs_write_seq(dsi, 0x89, 0x06); + dsi_dcs_write_seq(dsi, 0x8A, 0x00); + dsi_dcs_write_seq(dsi, 0x97, 0x0F); + dsi_dcs_write_seq(dsi, 0x9A, 0x0E); + dsi_dcs_write_seq(dsi, 0x9B, 0x0F); + dsi_dcs_write_seq(dsi, 0x9C, 0x07); + dsi_dcs_write_seq(dsi, 0x9D, 0x04); + dsi_dcs_write_seq(dsi, 0x9E, 0x05); + dsi_dcs_write_seq(dsi, 0x9F, 0x06); + dsi_dcs_write_seq(dsi, 0xA0, 0x00); + dsi_dcs_write_seq(dsi, 0xFF, 0x30); + dsi_dcs_write_seq(dsi, 0xFF, 0x52); + dsi_dcs_write_seq(dsi, 0xFF, 0x02); + dsi_dcs_write_seq(dsi, 0x01, 0x01); + dsi_dcs_write_seq(dsi, 0x02, 0xDA); + dsi_dcs_write_seq(dsi, 0x03, 0xBA); + dsi_dcs_write_seq(dsi, 0x04, 0xA8); + dsi_dcs_write_seq(dsi, 0x05, 0x9A); + dsi_dcs_write_seq(dsi, 0x06, 0x70); + dsi_dcs_write_seq(dsi, 0x07, 0xFF); + dsi_dcs_write_seq(dsi, 0x08, 0x91); + dsi_dcs_write_seq(dsi, 0x09, 0x90); + dsi_dcs_write_seq(dsi, 0x0A, 0xFF); + dsi_dcs_write_seq(dsi, 0x0B, 0x8F); + dsi_dcs_write_seq(dsi, 0x0C, 0x60); + dsi_dcs_write_seq(dsi, 0x0D, 0x58); + dsi_dcs_write_seq(dsi, 0x0E, 0x48); + dsi_dcs_write_seq(dsi, 0x0F, 0x38); + dsi_dcs_write_seq(dsi, 0x10, 0x2B); + dsi_dcs_write_seq(dsi, 0xFF, 0x30); + dsi_dcs_write_seq(dsi, 0xFF, 0x52); + dsi_dcs_write_seq(dsi, 0xFF, 0x00); + dsi_dcs_write_seq(dsi, 0x36, 0x02); + dsi_dcs_write_seq(dsi, 0x3A, 0x70); + + dev_dbg(ctx->dev, "Panel init sequence done\n"); + + return 0; +} + +static int panel_nv3051d_unprepare(struct drm_panel *panel) +{ + struct panel_nv3051d *ctx = panel_to_panelnv3051d(panel); + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); + int ret; + + if (!ctx->prepared) + return 0; + + ret = mipi_dsi_dcs_set_display_off(dsi); + if (ret < 0) + dev_err(ctx->dev, "failed to set display off: %d\n", ret); + + msleep(20); + + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); + if (ret < 0) { + dev_err(ctx->dev, "failed to enter sleep mode: %d\n", ret); + return ret; + } + + usleep_range(10000, 15000); + + regulator_disable(ctx->vdd); + + ctx->prepared = false; + + return 0; +} + +static int panel_nv3051d_prepare(struct drm_panel *panel) +{ + struct panel_nv3051d *ctx = panel_to_panelnv3051d(panel); + struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); + int ret; + + if (ctx->prepared) + return 0; + + dev_dbg(ctx->dev, "Resetting the panel\n"); + ret = regulator_enable(ctx->vdd); + if (ret < 0) { + dev_err(ctx->dev, "Failed to enable vdd supply: %d\n", ret); + return ret; + } + + usleep_range(2000, 3000); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + msleep(150); + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + msleep(20); + + ret = panel_nv3051d_init_sequence(ctx); + if (ret < 0) { + dev_err(ctx->dev, "Panel init sequence failed: %d\n", ret); + goto disable_vdd; + } + + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); + if (ret < 0) { + dev_err(ctx->dev, "Failed to exit sleep mode: %d\n", ret); + goto disable_vdd; + } + + msleep(200); + + ret = mipi_dsi_dcs_set_display_on(dsi); + if (ret < 0) { + dev_err(ctx->dev, "Failed to set display on: %d\n", ret); + goto disable_vdd; + } + + usleep_range(10000, 15000); + + ctx->prepared = true; + + return 0; + +disable_vdd: + regulator_disable(ctx->vdd); + return ret; +} + +static const struct drm_display_mode default_mode = { + .hdisplay = 640, + .hsync_start = 640 + 40, + .hsync_end = 640 + 40 + 2, + .htotal = 640 + 40 + 2 + 80, + .vdisplay = 480, + .vsync_start = 480 + 18, + .vsync_end = 480 + 18 + 2, + .vtotal = 480 + 18 + 2 + 28, + .clock = 25000, + .width_mm = 70, + .height_mm = 57, + .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, +}; + +static int panel_nv3051d_get_modes(struct drm_panel *panel, + struct drm_connector *connector) +{ + struct panel_nv3051d *ctx = panel_to_panelnv3051d(panel); + struct drm_display_mode *mode; + + mode = drm_mode_duplicate(connector->dev, &default_mode); + if (!mode) { + dev_err(ctx->dev, "Failed to add mode %ux%u@%u\n", + default_mode.hdisplay, default_mode.vdisplay, + drm_mode_vrefresh(&default_mode)); + return -ENOMEM; + } + + drm_mode_set_name(mode); + + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; + connector->display_info.width_mm = mode->width_mm; + connector->display_info.height_mm = mode->height_mm; + connector->display_info.bus_flags = + DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE | + DRM_BUS_FLAG_DE_LOW; + drm_mode_probed_add(connector, mode); + + return 1; +} + +static const struct drm_panel_funcs panel_nv3051d_funcs = { + .unprepare = panel_nv3051d_unprepare, + .prepare = panel_nv3051d_prepare, + .get_modes = panel_nv3051d_get_modes, +}; + +static int panel_nv3051d_probe(struct mipi_dsi_device *dsi) +{ + struct device *dev = &dsi->dev; + struct panel_nv3051d *ctx; + int ret; + + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(ctx->reset_gpio)) { + dev_err(dev, "cannot get reset gpio\n"); + return PTR_ERR(ctx->reset_gpio); + } + + ctx->vdd = devm_regulator_get(dev, "vdd"); + if (IS_ERR(ctx->vdd)) { + ret = PTR_ERR(ctx->vdd); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to request vdd regulator: %d\n", ret); + return ret; + } + + mipi_dsi_set_drvdata(dsi, ctx); + + ctx->dev = dev; + + dsi->lanes = 4; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET; + + drm_panel_init(&ctx->panel, &dsi->dev, &panel_nv3051d_funcs, + DRM_MODE_CONNECTOR_DSI); + + ret = drm_panel_of_backlight(&ctx->panel); + if (ret) + return ret; + + drm_panel_add(&ctx->panel); + + ret = mipi_dsi_attach(dsi); + if (ret < 0) { + dev_err(dev, "mipi_dsi_attach failed: %d\n", ret); + drm_panel_remove(&ctx->panel); + return ret; + } + + return 0; +} + +static void panel_nv3051d_shutdown(struct mipi_dsi_device *dsi) +{ + struct panel_nv3051d *ctx = mipi_dsi_get_drvdata(dsi); + int ret; + + ret = drm_panel_unprepare(&ctx->panel); + if (ret < 0) + dev_err(&dsi->dev, "Failed to unprepare panel: %d\n", ret); + + ret = drm_panel_disable(&ctx->panel); + if (ret < 0) + dev_err(&dsi->dev, "Failed to disable panel: %d\n", ret); +} + +static int panel_nv3051d_remove(struct mipi_dsi_device *dsi) +{ + struct panel_nv3051d *ctx = mipi_dsi_get_drvdata(dsi); + int ret; + + panel_nv3051d_shutdown(dsi); + + ret = mipi_dsi_detach(dsi); + if (ret < 0) + dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); + + drm_panel_remove(&ctx->panel); + + return 0; +} + +static const struct of_device_id newvision_nv3051d_of_match[] = { + { .compatible = "anbernic,rg353p-panel" }, + { .compatible = "anbernic,rg353v-panel" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, newvision_nv3051d_of_match); + +static struct mipi_dsi_driver newvision_nv3051d_driver = { + .driver = { + .name = "panel-newvision-nv3051d", + .of_match_table = newvision_nv3051d_of_match, + }, + .probe = panel_nv3051d_probe, + .remove = panel_nv3051d_remove, + .shutdown = panel_nv3051d_shutdown, +}; +module_mipi_dsi_driver(newvision_nv3051d_driver); + +MODULE_AUTHOR("Chris Morgan <macromorgan@hotmail.com>"); +MODULE_DESCRIPTION("DRM driver for Newvision NV3051D based MIPI DSI panels"); +MODULE_LICENSE("GPL"); -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2022-09-12 21:40 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-09-06 18:52 [PATCH 0/2] drm/panel: Add NewVision NV3051D Panels Chris Morgan 2022-09-06 18:52 ` [PATCH 1/2] dt-bindings: display: panel: Add NewVision NV3051D panel bindings Chris Morgan 2022-09-07 12:53 ` Krzysztof Kozlowski 2022-09-07 13:35 ` Chris Morgan 2022-09-08 15:18 ` Krzysztof Kozlowski 2022-09-09 1:42 ` Rob Herring 2022-09-12 21:40 ` Chris Morgan 2022-09-06 18:52 ` [PATCH 2/2] drm/panel: Add NewVision NV3051D MIPI-DSI LCD panel Chris Morgan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).