From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tomi Valkeinen Subject: Re: [PATCH v2 10/28] drm: omapdrm: dsi: Handle pin muxing internally Date: Tue, 9 May 2017 12:37:36 +0300 Message-ID: <25b15163-b0ee-a096-074a-3ae05f828796@ti.com> References: <20170508113303.27521-1-laurent.pinchart@ideasonboard.com> <20170508113303.27521-11-laurent.pinchart@ideasonboard.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0002053621==" Return-path: Received: from lelnx193.ext.ti.com (lelnx193.ext.ti.com [198.47.27.77]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6827A6E05C for ; Tue, 9 May 2017 09:37:41 +0000 (UTC) In-Reply-To: <20170508113303.27521-11-laurent.pinchart@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org --===============0002053621== Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="pTK33LAoPvaTbqlKkqsMJeUMdVc902oXe" --pTK33LAoPvaTbqlKkqsMJeUMdVc902oXe Content-Type: multipart/mixed; boundary="o1vMBwq4CPkS7Mot9U8FUedUiUK26XbDi"; protected-headers="v1" From: Tomi Valkeinen To: Laurent Pinchart , dri-devel@lists.freedesktop.org Message-ID: <25b15163-b0ee-a096-074a-3ae05f828796@ti.com> Subject: Re: [PATCH v2 10/28] drm: omapdrm: dsi: Handle pin muxing internally References: <20170508113303.27521-1-laurent.pinchart@ideasonboard.com> <20170508113303.27521-11-laurent.pinchart@ideasonboard.com> In-Reply-To: <20170508113303.27521-11-laurent.pinchart@ideasonboard.com> --o1vMBwq4CPkS7Mot9U8FUedUiUK26XbDi Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 08/05/17 14:32, Laurent Pinchart wrote: > Don't rely on callback functions provided by the platform, but access > the syscon internally to mux the DSI pins. >=20 > Signed-off-by: Laurent Pinchart > --- > drivers/gpu/drm/omapdrm/dss/core.c | 20 ---------- > drivers/gpu/drm/omapdrm/dss/dsi.c | 82 ++++++++++++++++++++++++++++++= ++++++-- > drivers/gpu/drm/omapdrm/dss/dss.h | 2 - > 3 files changed, 79 insertions(+), 25 deletions(-) >=20 > diff --git a/drivers/gpu/drm/omapdrm/dss/core.c b/drivers/gpu/drm/omapd= rm/dss/core.c > index 35def6fd6acd..524ecdd138f4 100644 > --- a/drivers/gpu/drm/omapdrm/dss/core.c > +++ b/drivers/gpu/drm/omapdrm/dss/core.c > @@ -50,26 +50,6 @@ enum omapdss_version omapdss_get_version(void) > } > EXPORT_SYMBOL(omapdss_get_version); > =20 > -int dss_dsi_enable_pads(int dsi_id, unsigned lane_mask) > -{ > - struct omap_dss_board_info *board_data =3D core.pdev->dev.platform_da= ta; > - > - if (!board_data->dsi_enable_pads) > - return -ENOENT; > - > - return board_data->dsi_enable_pads(dsi_id, lane_mask); > -} > - > -void dss_dsi_disable_pads(int dsi_id, unsigned lane_mask) > -{ > - struct omap_dss_board_info *board_data =3D core.pdev->dev.platform_da= ta; > - > - if (!board_data->dsi_disable_pads) > - return; > - > - return board_data->dsi_disable_pads(dsi_id, lane_mask); > -} > - > int dss_set_min_bus_tput(struct device *dev, unsigned long tput) > { > struct omap_dss_board_info *pdata =3D core.pdev->dev.platform_data; > diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdr= m/dss/dsi.c > index 400f903d8197..d86a1ca6da00 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dsi.c > +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c > @@ -20,6 +20,8 @@ > #define DSS_SUBSYS_NAME "DSI" > =20 > #include > +#include > +#include > #include > #include > #include > @@ -329,6 +331,7 @@ struct dsi_data { > bool is_enabled; > =20 > struct clk *dss_clk; > + struct regmap *syscon; > =20 > struct dispc_clock_info user_dispc_cinfo; > struct dss_pll_clock_info user_dsi_cinfo; > @@ -2073,6 +2076,64 @@ static unsigned dsi_get_lane_mask(struct platfor= m_device *dsidev) > return mask; > } > =20 > +/* OMAP4 CONTROL_DSIPHY */ > +#define OMAP4_DSIPHY_SYSCON_OFFSET 0x78 > + > +#define OMAP4_DSI2_LANEENABLE_SHIFT 29 > +#define OMAP4_DSI2_LANEENABLE_MASK (0x7 << 29) > +#define OMAP4_DSI1_LANEENABLE_SHIFT 24 > +#define OMAP4_DSI1_LANEENABLE_MASK (0x1f << 24) > +#define OMAP4_DSI1_PIPD_SHIFT 19 > +#define OMAP4_DSI1_PIPD_MASK (0x1f << 19) > +#define OMAP4_DSI2_PIPD_SHIFT 14 > +#define OMAP4_DSI2_PIPD_MASK (0x1f << 14) > + > +static int dsi_omap4_mux_pads(struct dsi_data *dsi, unsigned int lanes= ) > +{ > + u32 enable_mask, enable_shift; > + u32 pipd_mask, pipd_shift; > + u32 reg; > + > + if (!dsi->syscon) > + return 0; > + > + if (dsi->module_id =3D=3D 0) { > + enable_mask =3D OMAP4_DSI1_LANEENABLE_MASK; > + enable_shift =3D OMAP4_DSI1_LANEENABLE_SHIFT; > + pipd_mask =3D OMAP4_DSI1_PIPD_MASK; > + pipd_shift =3D OMAP4_DSI1_PIPD_SHIFT; > + } else if (dsi->module_id =3D=3D 1) { > + enable_mask =3D OMAP4_DSI2_LANEENABLE_MASK; > + enable_shift =3D OMAP4_DSI2_LANEENABLE_SHIFT; > + pipd_mask =3D OMAP4_DSI2_PIPD_MASK; > + pipd_shift =3D OMAP4_DSI2_PIPD_SHIFT; > + } else { > + return -ENODEV; > + } > + > + regmap_read(dsi->syscon, OMAP4_DSIPHY_SYSCON_OFFSET, ®); > + > + reg &=3D ~enable_mask; > + reg &=3D ~pipd_mask; > + > + reg |=3D (lanes << enable_shift) & enable_mask; > + reg |=3D (lanes << pipd_shift) & pipd_mask; > + > + regmap_write(dsi->syscon, OMAP4_DSIPHY_SYSCON_OFFSET, reg); > + > + return 0; > +} > + > +static int dsi_enable_pads(struct dsi_data *dsi, unsigned int lane_mas= k) > +{ > + return dsi_omap4_mux_pads(dsi, lane_mask); > +} > + > +static void dsi_disable_pads(struct dsi_data *dsi) > +{ > + dsi_omap4_mux_pads(dsi, 0); > +} > + > static int dsi_cio_init(struct platform_device *dsidev) > { > struct dsi_data *dsi =3D dsi_get_dsidrv_data(dsidev); > @@ -2081,7 +2142,7 @@ static int dsi_cio_init(struct platform_device *d= sidev) > =20 > DSSDBG("DSI CIO init starts"); > =20 > - r =3D dss_dsi_enable_pads(dsi->module_id, dsi_get_lane_mask(dsidev));= > + r =3D dsi_enable_pads(dsi, dsi_get_lane_mask(dsidev)); > if (r) > return r; > =20 > @@ -2191,7 +2252,7 @@ static int dsi_cio_init(struct platform_device *d= sidev) > dsi_cio_disable_lane_override(dsidev); > err_scp_clk_dom: > dsi_disable_scp_clk(dsidev); > - dss_dsi_disable_pads(dsi->module_id, dsi_get_lane_mask(dsidev)); > + dsi_disable_pads(dsi); > return r; > } > =20 > @@ -2204,7 +2265,7 @@ static void dsi_cio_uninit(struct platform_device= *dsidev) > =20 > dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); > dsi_disable_scp_clk(dsidev); > - dss_dsi_disable_pads(dsi->module_id, dsi_get_lane_mask(dsidev)); > + dsi_disable_pads(dsi); > } > =20 > static void dsi_config_tx_fifo(struct platform_device *dsidev, > @@ -5332,6 +5393,21 @@ static int dsi_bind(struct device *dev, struct d= evice *master, void *data) > =20 > dsi->module_id =3D d->id; > =20 > + if (dsi->data->type =3D=3D DSI_TYPE_OMAP4) { > + struct device_node *np; > + > + /* > + * The OMAP4 display DT bindings don't reference the padconf > + * syscon. Our only option to retrieve it is to find it by name. > + */ We could also do DT modifications at early boot phase (we do that already for a few things for tilcdc and omapdss), and then have the driver require the reference to padconf. But I think this is fine too. Reviewed-by: Tomi Valkeinen Tomi --o1vMBwq4CPkS7Mot9U8FUedUiUK26XbDi-- --pTK33LAoPvaTbqlKkqsMJeUMdVc902oXe Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJZEY3gAAoJEPo9qoy8lh71iRkP/3om09VKiPpKROt+3e3+6gcm AqXGg3n+t/iYg5C0ov1ym8MZ97FGZUhMcz6Ihd75WpKdzT+4D5pjHTM/CEj3VMdi HwZDE3Y1t/9Nkk7wGgD8jGFZusYqynhCr+yghvi0Uh9yo0R94IV70ZNZGB0WQ91b kAB2G2jOsS3SG6LSLpTXKVyq+VDNnPLwiIHXHbohcQCK6OE2xYxWVa5TYeJegsVq oA/pIjK3UF3nTlUjaRqLT6SkfH1e9kCL3GViS9RcZyqDQDkdLdWNW3hxu3PJrWi6 psDntxxTN0aR/4YQt/e8PD2gD9IQ1bfTX2RTkCskeB8uoXJu5dgDcoxueEOq3VYF 6eQQ7JJ5pZqKc2HU5SS1nkxbK/umqs+1kQdaXFVMeV5Pn4s4E4AtMlsSTbPaaDJa V/Gi8EUquLxXRGZ965+y4LVjx2qmSrvRfWmzXBuiJXI51X4TpPGrslMlnRKCC/q7 fPBdtzIAgbX58LvQmidizdYac0hxRuh6+rKkJQkz6hey2qMtvqFw7VDd5AKMuNso +OQUBIYIegcb5g3sySw+xGJzUJW+QYKA97MFRx7U6NEeebPX5cGk3Hi2+S/lUK10 ZWTX0lFnoUzEBlcBCiTsR4Dd4IAjCmN6vXEt6T0b0viJqdbU3V0xcvivOTG9eHzm WVW1T102yKxmsdIEa+8l =vqkp -----END PGP SIGNATURE----- --pTK33LAoPvaTbqlKkqsMJeUMdVc902oXe-- --===============0002053621== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== --===============0002053621==--