Skip to content

Commit 1a99efa

Browse files
Nicolas FrattaroliYuryNorov
authored andcommitted
drm/rockchip: dsi: switch to FIELD_PREP_WM16* macros
The era of hand-rolled HIWORD_UPDATE macros is over, at least for those drivers that use constant masks. Remove this driver's HIWORD_UPDATE macro, and replace instances of it with either FIELD_PREP_WM16 or FIELD_PREP_WM16_CONST, depending on whether they're in an initializer. This gives us better error checking, which already saved me some trouble during this refactor. The driver's HIWORD_UPDATE macro doesn't shift up the value, but expects a pre-shifted value. Meanwhile, FIELD_PREP_WM16 and FIELD_PREP_WM16_CONST will shift the value for us, based on the given mask. So a few things that used to be a HIWORD_UPDATE(VERY_LONG_FOO, VERY_LONG_FOO) are now a somewhat more pleasant FIELD_PREP_WM16(VERY_LONG_FOO, 1). There are some non-trivial refactors here. A few literals needed a UL suffix added to stop them from unintentionally overflowing as a signed long. To make sure all of these cases are caught, and not just the ones where the FIELD_PREP_WM16* macros use such a value as a mask, just mark every literal that's used as a mask as unsigned. Non-contiguous masks also have to be split into multiple FIELD_PREP_WM16* instances, as the macro's checks and shifting logic rely on contiguous masks. This is compile-tested only. Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com> Reviewed-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>
1 parent 48d4773 commit 1a99efa

1 file changed

Lines changed: 68 additions & 74 deletions

File tree

drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c

Lines changed: 68 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88

99
#include <linux/clk.h>
10+
#include <linux/hw_bitfield.h>
1011
#include <linux/iopoll.h>
1112
#include <linux/math64.h>
1213
#include <linux/mfd/syscon.h>
@@ -148,7 +149,7 @@
148149
#define DW_MIPI_NEEDS_GRF_CLK BIT(1)
149150

150151
#define PX30_GRF_PD_VO_CON1 0x0438
151-
#define PX30_DSI_FORCETXSTOPMODE (0xf << 7)
152+
#define PX30_DSI_FORCETXSTOPMODE (0xfUL << 7)
152153
#define PX30_DSI_FORCERXMODE BIT(6)
153154
#define PX30_DSI_TURNDISABLE BIT(5)
154155
#define PX30_DSI_LCDC_SEL BIT(0)
@@ -167,16 +168,16 @@
167168
#define RK3399_DSI1_LCDC_SEL BIT(4)
168169

169170
#define RK3399_GRF_SOC_CON22 0x6258
170-
#define RK3399_DSI0_TURNREQUEST (0xf << 12)
171-
#define RK3399_DSI0_TURNDISABLE (0xf << 8)
172-
#define RK3399_DSI0_FORCETXSTOPMODE (0xf << 4)
173-
#define RK3399_DSI0_FORCERXMODE (0xf << 0)
171+
#define RK3399_DSI0_TURNREQUEST (0xfUL << 12)
172+
#define RK3399_DSI0_TURNDISABLE (0xfUL << 8)
173+
#define RK3399_DSI0_FORCETXSTOPMODE (0xfUL << 4)
174+
#define RK3399_DSI0_FORCERXMODE (0xfUL << 0)
174175

175176
#define RK3399_GRF_SOC_CON23 0x625c
176-
#define RK3399_DSI1_TURNDISABLE (0xf << 12)
177-
#define RK3399_DSI1_FORCETXSTOPMODE (0xf << 8)
178-
#define RK3399_DSI1_FORCERXMODE (0xf << 4)
179-
#define RK3399_DSI1_ENABLE (0xf << 0)
177+
#define RK3399_DSI1_TURNDISABLE (0xfUL << 12)
178+
#define RK3399_DSI1_FORCETXSTOPMODE (0xfUL << 8)
179+
#define RK3399_DSI1_FORCERXMODE (0xfUL << 4)
180+
#define RK3399_DSI1_ENABLE (0xfUL << 0)
180181

181182
#define RK3399_GRF_SOC_CON24 0x6260
182183
#define RK3399_TXRX_MASTERSLAVEZ BIT(7)
@@ -186,8 +187,8 @@
186187
#define RK3399_TXRX_TURNREQUEST GENMASK(3, 0)
187188

188189
#define RK3568_GRF_VO_CON2 0x0368
189-
#define RK3568_DSI0_SKEWCALHS (0x1f << 11)
190-
#define RK3568_DSI0_FORCETXSTOPMODE (0xf << 4)
190+
#define RK3568_DSI0_SKEWCALHS (0x1fUL << 11)
191+
#define RK3568_DSI0_FORCETXSTOPMODE (0xfUL << 4)
191192
#define RK3568_DSI0_TURNDISABLE BIT(2)
192193
#define RK3568_DSI0_FORCERXMODE BIT(0)
193194

@@ -197,18 +198,16 @@
197198
* come from. Name GRF_VO_CON3 is assumed.
198199
*/
199200
#define RK3568_GRF_VO_CON3 0x36c
200-
#define RK3568_DSI1_SKEWCALHS (0x1f << 11)
201-
#define RK3568_DSI1_FORCETXSTOPMODE (0xf << 4)
201+
#define RK3568_DSI1_SKEWCALHS (0x1fUL << 11)
202+
#define RK3568_DSI1_FORCETXSTOPMODE (0xfUL << 4)
202203
#define RK3568_DSI1_TURNDISABLE BIT(2)
203204
#define RK3568_DSI1_FORCERXMODE BIT(0)
204205

205206
#define RV1126_GRF_DSIPHY_CON 0x10220
206-
#define RV1126_DSI_FORCETXSTOPMODE (0xf << 4)
207+
#define RV1126_DSI_FORCETXSTOPMODE (0xfUL << 4)
207208
#define RV1126_DSI_TURNDISABLE BIT(2)
208209
#define RV1126_DSI_FORCERXMODE BIT(0)
209210

210-
#define HIWORD_UPDATE(val, mask) (val | (mask) << 16)
211-
212211
enum {
213212
DW_DSI_USAGE_IDLE,
214213
DW_DSI_USAGE_DSI,
@@ -1484,14 +1483,13 @@ static const struct rockchip_dw_dsi_chip_data px30_chip_data[] = {
14841483
{
14851484
.reg = 0xff450000,
14861485
.lcdsel_grf_reg = PX30_GRF_PD_VO_CON1,
1487-
.lcdsel_big = HIWORD_UPDATE(0, PX30_DSI_LCDC_SEL),
1488-
.lcdsel_lit = HIWORD_UPDATE(PX30_DSI_LCDC_SEL,
1489-
PX30_DSI_LCDC_SEL),
1486+
.lcdsel_big = FIELD_PREP_WM16_CONST(PX30_DSI_LCDC_SEL, 0),
1487+
.lcdsel_lit = FIELD_PREP_WM16_CONST(PX30_DSI_LCDC_SEL, 1),
14901488

14911489
.lanecfg1_grf_reg = PX30_GRF_PD_VO_CON1,
1492-
.lanecfg1 = HIWORD_UPDATE(0, PX30_DSI_TURNDISABLE |
1493-
PX30_DSI_FORCERXMODE |
1494-
PX30_DSI_FORCETXSTOPMODE),
1490+
.lanecfg1 = FIELD_PREP_WM16_CONST((PX30_DSI_TURNDISABLE |
1491+
PX30_DSI_FORCERXMODE |
1492+
PX30_DSI_FORCETXSTOPMODE), 0),
14951493

14961494
.max_data_lanes = 4,
14971495
},
@@ -1502,9 +1500,9 @@ static const struct rockchip_dw_dsi_chip_data rk3128_chip_data[] = {
15021500
{
15031501
.reg = 0x10110000,
15041502
.lanecfg1_grf_reg = RK3128_GRF_LVDS_CON0,
1505-
.lanecfg1 = HIWORD_UPDATE(0, RK3128_DSI_TURNDISABLE |
1506-
RK3128_DSI_FORCERXMODE |
1507-
RK3128_DSI_FORCETXSTOPMODE),
1503+
.lanecfg1 = FIELD_PREP_WM16_CONST((RK3128_DSI_TURNDISABLE |
1504+
RK3128_DSI_FORCERXMODE |
1505+
RK3128_DSI_FORCETXSTOPMODE), 0),
15081506
.max_data_lanes = 4,
15091507
},
15101508
{ /* sentinel */ }
@@ -1514,16 +1512,16 @@ static const struct rockchip_dw_dsi_chip_data rk3288_chip_data[] = {
15141512
{
15151513
.reg = 0xff960000,
15161514
.lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1517-
.lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI0_LCDC_SEL),
1518-
.lcdsel_lit = HIWORD_UPDATE(RK3288_DSI0_LCDC_SEL, RK3288_DSI0_LCDC_SEL),
1515+
.lcdsel_big = FIELD_PREP_WM16_CONST(RK3288_DSI0_LCDC_SEL, 0),
1516+
.lcdsel_lit = FIELD_PREP_WM16_CONST(RK3288_DSI0_LCDC_SEL, 1),
15191517

15201518
.max_data_lanes = 4,
15211519
},
15221520
{
15231521
.reg = 0xff964000,
15241522
.lcdsel_grf_reg = RK3288_GRF_SOC_CON6,
1525-
.lcdsel_big = HIWORD_UPDATE(0, RK3288_DSI1_LCDC_SEL),
1526-
.lcdsel_lit = HIWORD_UPDATE(RK3288_DSI1_LCDC_SEL, RK3288_DSI1_LCDC_SEL),
1523+
.lcdsel_big = FIELD_PREP_WM16_CONST(RK3288_DSI1_LCDC_SEL, 0),
1524+
.lcdsel_lit = FIELD_PREP_WM16_CONST(RK3288_DSI1_LCDC_SEL, 1),
15271525

15281526
.max_data_lanes = 4,
15291527
},
@@ -1539,13 +1537,13 @@ static int rk3399_dphy_tx1rx1_init(struct phy *phy)
15391537
* Assume ISP0 is supplied by the RX0 dphy.
15401538
*/
15411539
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1542-
HIWORD_UPDATE(0, RK3399_TXRX_SRC_SEL_ISP0));
1540+
FIELD_PREP_WM16(RK3399_TXRX_SRC_SEL_ISP0, 0));
15431541
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1544-
HIWORD_UPDATE(0, RK3399_TXRX_MASTERSLAVEZ));
1542+
FIELD_PREP_WM16(RK3399_TXRX_MASTERSLAVEZ, 0));
15451543
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1546-
HIWORD_UPDATE(0, RK3399_TXRX_BASEDIR));
1544+
FIELD_PREP_WM16(RK3399_TXRX_BASEDIR, 0));
15471545
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1548-
HIWORD_UPDATE(0, RK3399_DSI1_ENABLE));
1546+
FIELD_PREP_WM16(RK3399_DSI1_ENABLE, 0));
15491547

15501548
return 0;
15511549
}
@@ -1559,30 +1557,29 @@ static int rk3399_dphy_tx1rx1_power_on(struct phy *phy)
15591557
usleep_range(100, 150);
15601558

15611559
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1562-
HIWORD_UPDATE(0, RK3399_TXRX_MASTERSLAVEZ));
1560+
FIELD_PREP_WM16(RK3399_TXRX_MASTERSLAVEZ, 0));
15631561
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1564-
HIWORD_UPDATE(RK3399_TXRX_BASEDIR, RK3399_TXRX_BASEDIR));
1562+
FIELD_PREP_WM16(RK3399_TXRX_BASEDIR, 1));
15651563

15661564
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1567-
HIWORD_UPDATE(0, RK3399_DSI1_FORCERXMODE));
1565+
FIELD_PREP_WM16(RK3399_DSI1_FORCERXMODE, 0));
15681566
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1569-
HIWORD_UPDATE(0, RK3399_DSI1_FORCETXSTOPMODE));
1567+
FIELD_PREP_WM16(RK3399_DSI1_FORCETXSTOPMODE, 0));
15701568

15711569
/* Disable lane turn around, which is ignored in receive mode */
15721570
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON24,
1573-
HIWORD_UPDATE(0, RK3399_TXRX_TURNREQUEST));
1571+
FIELD_PREP_WM16(RK3399_TXRX_TURNREQUEST, 0));
15741572
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1575-
HIWORD_UPDATE(RK3399_DSI1_TURNDISABLE,
1576-
RK3399_DSI1_TURNDISABLE));
1573+
FIELD_PREP_WM16(RK3399_DSI1_TURNDISABLE, 0xf));
15771574
usleep_range(100, 150);
15781575

15791576
dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR);
15801577
usleep_range(100, 150);
15811578

15821579
/* Enable dphy lanes */
15831580
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1584-
HIWORD_UPDATE(GENMASK(dsi->dphy_config.lanes - 1, 0),
1585-
RK3399_DSI1_ENABLE));
1581+
FIELD_PREP_WM16(RK3399_DSI1_ENABLE,
1582+
GENMASK(dsi->dphy_config.lanes - 1, 0)));
15861583

15871584
usleep_range(100, 150);
15881585

@@ -1594,7 +1591,7 @@ static int rk3399_dphy_tx1rx1_power_off(struct phy *phy)
15941591
struct dw_mipi_dsi_rockchip *dsi = phy_get_drvdata(phy);
15951592

15961593
regmap_write(dsi->grf_regmap, RK3399_GRF_SOC_CON23,
1597-
HIWORD_UPDATE(0, RK3399_DSI1_ENABLE));
1594+
FIELD_PREP_WM16(RK3399_DSI1_ENABLE, 0));
15981595

15991596
return 0;
16001597
}
@@ -1603,41 +1600,38 @@ static const struct rockchip_dw_dsi_chip_data rk3399_chip_data[] = {
16031600
{
16041601
.reg = 0xff960000,
16051602
.lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1606-
.lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI0_LCDC_SEL),
1607-
.lcdsel_lit = HIWORD_UPDATE(RK3399_DSI0_LCDC_SEL,
1608-
RK3399_DSI0_LCDC_SEL),
1603+
.lcdsel_big = FIELD_PREP_WM16_CONST(RK3399_DSI0_LCDC_SEL, 0),
1604+
.lcdsel_lit = FIELD_PREP_WM16_CONST(RK3399_DSI0_LCDC_SEL, 1),
16091605

16101606
.lanecfg1_grf_reg = RK3399_GRF_SOC_CON22,
1611-
.lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI0_TURNREQUEST |
1612-
RK3399_DSI0_TURNDISABLE |
1613-
RK3399_DSI0_FORCETXSTOPMODE |
1614-
RK3399_DSI0_FORCERXMODE),
1607+
.lanecfg1 = FIELD_PREP_WM16_CONST((RK3399_DSI0_TURNREQUEST |
1608+
RK3399_DSI0_TURNDISABLE |
1609+
RK3399_DSI0_FORCETXSTOPMODE |
1610+
RK3399_DSI0_FORCERXMODE), 0),
16151611

16161612
.flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
16171613
.max_data_lanes = 4,
16181614
},
16191615
{
16201616
.reg = 0xff968000,
16211617
.lcdsel_grf_reg = RK3399_GRF_SOC_CON20,
1622-
.lcdsel_big = HIWORD_UPDATE(0, RK3399_DSI1_LCDC_SEL),
1623-
.lcdsel_lit = HIWORD_UPDATE(RK3399_DSI1_LCDC_SEL,
1624-
RK3399_DSI1_LCDC_SEL),
1618+
.lcdsel_big = FIELD_PREP_WM16_CONST(RK3399_DSI1_LCDC_SEL, 0),
1619+
.lcdsel_lit = FIELD_PREP_WM16_CONST(RK3399_DSI1_LCDC_SEL, 1),
1620+
16251621

16261622
.lanecfg1_grf_reg = RK3399_GRF_SOC_CON23,
1627-
.lanecfg1 = HIWORD_UPDATE(0, RK3399_DSI1_TURNDISABLE |
1628-
RK3399_DSI1_FORCETXSTOPMODE |
1629-
RK3399_DSI1_FORCERXMODE |
1630-
RK3399_DSI1_ENABLE),
1623+
.lanecfg1 = FIELD_PREP_WM16_CONST((RK3399_DSI1_TURNDISABLE |
1624+
RK3399_DSI1_FORCETXSTOPMODE |
1625+
RK3399_DSI1_FORCERXMODE |
1626+
RK3399_DSI1_ENABLE), 0),
16311627

16321628
.lanecfg2_grf_reg = RK3399_GRF_SOC_CON24,
1633-
.lanecfg2 = HIWORD_UPDATE(RK3399_TXRX_MASTERSLAVEZ |
1634-
RK3399_TXRX_ENABLECLK,
1635-
RK3399_TXRX_MASTERSLAVEZ |
1636-
RK3399_TXRX_ENABLECLK |
1637-
RK3399_TXRX_BASEDIR),
1629+
.lanecfg2 = (FIELD_PREP_WM16_CONST(RK3399_TXRX_MASTERSLAVEZ, 1) |
1630+
FIELD_PREP_WM16_CONST(RK3399_TXRX_ENABLECLK, 1) |
1631+
FIELD_PREP_WM16_CONST(RK3399_TXRX_BASEDIR, 0)),
16381632

16391633
.enable_grf_reg = RK3399_GRF_SOC_CON23,
1640-
.enable = HIWORD_UPDATE(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
1634+
.enable = FIELD_PREP_WM16_CONST(RK3399_DSI1_ENABLE, RK3399_DSI1_ENABLE),
16411635

16421636
.flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
16431637
.max_data_lanes = 4,
@@ -1653,19 +1647,19 @@ static const struct rockchip_dw_dsi_chip_data rk3568_chip_data[] = {
16531647
{
16541648
.reg = 0xfe060000,
16551649
.lanecfg1_grf_reg = RK3568_GRF_VO_CON2,
1656-
.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI0_SKEWCALHS |
1657-
RK3568_DSI0_FORCETXSTOPMODE |
1658-
RK3568_DSI0_TURNDISABLE |
1659-
RK3568_DSI0_FORCERXMODE),
1650+
.lanecfg1 = (FIELD_PREP_WM16_CONST(RK3568_DSI0_SKEWCALHS, 0) |
1651+
FIELD_PREP_WM16_CONST(RK3568_DSI0_FORCETXSTOPMODE, 0) |
1652+
FIELD_PREP_WM16_CONST(RK3568_DSI0_TURNDISABLE, 0) |
1653+
FIELD_PREP_WM16_CONST(RK3568_DSI0_FORCERXMODE, 0)),
16601654
.max_data_lanes = 4,
16611655
},
16621656
{
16631657
.reg = 0xfe070000,
16641658
.lanecfg1_grf_reg = RK3568_GRF_VO_CON3,
1665-
.lanecfg1 = HIWORD_UPDATE(0, RK3568_DSI1_SKEWCALHS |
1666-
RK3568_DSI1_FORCETXSTOPMODE |
1667-
RK3568_DSI1_TURNDISABLE |
1668-
RK3568_DSI1_FORCERXMODE),
1659+
.lanecfg1 = (FIELD_PREP_WM16_CONST(RK3568_DSI1_SKEWCALHS, 0) |
1660+
FIELD_PREP_WM16_CONST(RK3568_DSI1_FORCETXSTOPMODE, 0) |
1661+
FIELD_PREP_WM16_CONST(RK3568_DSI1_TURNDISABLE, 0) |
1662+
FIELD_PREP_WM16_CONST(RK3568_DSI1_FORCERXMODE, 0)),
16691663
.max_data_lanes = 4,
16701664
},
16711665
{ /* sentinel */ }
@@ -1675,9 +1669,9 @@ static const struct rockchip_dw_dsi_chip_data rv1126_chip_data[] = {
16751669
{
16761670
.reg = 0xffb30000,
16771671
.lanecfg1_grf_reg = RV1126_GRF_DSIPHY_CON,
1678-
.lanecfg1 = HIWORD_UPDATE(0, RV1126_DSI_TURNDISABLE |
1679-
RV1126_DSI_FORCERXMODE |
1680-
RV1126_DSI_FORCETXSTOPMODE),
1672+
.lanecfg1 = (FIELD_PREP_WM16_CONST(RV1126_DSI_TURNDISABLE, 0) |
1673+
FIELD_PREP_WM16_CONST(RV1126_DSI_FORCERXMODE, 0) |
1674+
FIELD_PREP_WM16_CONST(RV1126_DSI_FORCETXSTOPMODE, 0)),
16811675
.max_data_lanes = 4,
16821676
},
16831677
{ /* sentinel */ }

0 commit comments

Comments
 (0)