Message ID | 20240516062455.106266-4-alexander.stein@ew.tq-group.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve tc358767 debugging | expand |
On Thu, May 16, 2024 at 8:25 AM Alexander Stein <alexander.stein@ew.tq-group.com> wrote: > > Most registers are read-writable, but some are only RO or even WO. > regmap does not support using readable_reg and wr_table when outputting > in debugfs, so switch to writeable_reg. > First check for RO or WO registers and fallback tc_readable_reg() for the > leftover RW registers. > > Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> > --- > drivers/gpu/drm/bridge/tc358767.c | 40 ++++++++++++++++++++----------- > 1 file changed, 26 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c > index 8874713bdd4a4..04c98ab1991bd 100644 > --- a/drivers/gpu/drm/bridge/tc358767.c > +++ b/drivers/gpu/drm/bridge/tc358767.c > @@ -2086,19 +2086,31 @@ static const struct regmap_access_table tc_precious_table = { > .n_yes_ranges = ARRAY_SIZE(tc_precious_ranges), > }; > > -static const struct regmap_range tc_non_writeable_ranges[] = { > - regmap_reg_range(PPI_BUSYPPI, PPI_BUSYPPI), > - regmap_reg_range(DSI_BUSYDSI, DSI_BUSYDSI), > - regmap_reg_range(DSI_LANESTATUS0, DSI_INTSTATUS), > - regmap_reg_range(TC_IDREG, SYSSTAT), > - regmap_reg_range(GPIOI, GPIOI), > - regmap_reg_range(DP0_LTSTAT, DP0_SNKLTCHGREQ), > -}; > - > -static const struct regmap_access_table tc_writeable_table = { > - .no_ranges = tc_non_writeable_ranges, > - .n_no_ranges = ARRAY_SIZE(tc_non_writeable_ranges), > -}; > +static bool tc_writeable_reg(struct device *dev, unsigned int reg) > +{ > + /* RO reg */ > + switch (reg) { > + case PPI_BUSYPPI: > + case DSI_BUSYDSI: > + case DSI_LANESTATUS0: > + case DSI_LANESTATUS1: > + case DSI_INTSTATUS: > + case TC_IDREG: > + case SYSBOOT: > + case SYSSTAT: > + case GPIOI: > + case DP0_LTSTAT: > + case DP0_SNKLTCHGREQ: > + return false; > + } > + /* WO reg */ > + switch (reg) { > + case DSI_STARTDSI: > + case DSI_INTCLR: > + return true; > + } > + return tc_readable_reg(dev, reg); > +} > > static const struct regmap_config tc_regmap_config = { > .name = "tc358767", > @@ -2108,9 +2120,9 @@ static const struct regmap_config tc_regmap_config = { > .max_register = PLL_DBG, > .cache_type = REGCACHE_MAPLE, > .readable_reg = tc_readable_reg, > + .writeable_reg = tc_writeable_reg, > .volatile_table = &tc_volatile_table, > .precious_table = &tc_precious_table, > - .wr_table = &tc_writeable_table, > .reg_format_endian = REGMAP_ENDIAN_BIG, > .val_format_endian = REGMAP_ENDIAN_LITTLE, > }; > -- > 2.34.1 > Reviewed-by: Robert Foss <rfoss@kernel.org>
diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c index 8874713bdd4a4..04c98ab1991bd 100644 --- a/drivers/gpu/drm/bridge/tc358767.c +++ b/drivers/gpu/drm/bridge/tc358767.c @@ -2086,19 +2086,31 @@ static const struct regmap_access_table tc_precious_table = { .n_yes_ranges = ARRAY_SIZE(tc_precious_ranges), }; -static const struct regmap_range tc_non_writeable_ranges[] = { - regmap_reg_range(PPI_BUSYPPI, PPI_BUSYPPI), - regmap_reg_range(DSI_BUSYDSI, DSI_BUSYDSI), - regmap_reg_range(DSI_LANESTATUS0, DSI_INTSTATUS), - regmap_reg_range(TC_IDREG, SYSSTAT), - regmap_reg_range(GPIOI, GPIOI), - regmap_reg_range(DP0_LTSTAT, DP0_SNKLTCHGREQ), -}; - -static const struct regmap_access_table tc_writeable_table = { - .no_ranges = tc_non_writeable_ranges, - .n_no_ranges = ARRAY_SIZE(tc_non_writeable_ranges), -}; +static bool tc_writeable_reg(struct device *dev, unsigned int reg) +{ + /* RO reg */ + switch (reg) { + case PPI_BUSYPPI: + case DSI_BUSYDSI: + case DSI_LANESTATUS0: + case DSI_LANESTATUS1: + case DSI_INTSTATUS: + case TC_IDREG: + case SYSBOOT: + case SYSSTAT: + case GPIOI: + case DP0_LTSTAT: + case DP0_SNKLTCHGREQ: + return false; + } + /* WO reg */ + switch (reg) { + case DSI_STARTDSI: + case DSI_INTCLR: + return true; + } + return tc_readable_reg(dev, reg); +} static const struct regmap_config tc_regmap_config = { .name = "tc358767", @@ -2108,9 +2120,9 @@ static const struct regmap_config tc_regmap_config = { .max_register = PLL_DBG, .cache_type = REGCACHE_MAPLE, .readable_reg = tc_readable_reg, + .writeable_reg = tc_writeable_reg, .volatile_table = &tc_volatile_table, .precious_table = &tc_precious_table, - .wr_table = &tc_writeable_table, .reg_format_endian = REGMAP_ENDIAN_BIG, .val_format_endian = REGMAP_ENDIAN_LITTLE, };
Most registers are read-writable, but some are only RO or even WO. regmap does not support using readable_reg and wr_table when outputting in debugfs, so switch to writeable_reg. First check for RO or WO registers and fallback tc_readable_reg() for the leftover RW registers. Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com> --- drivers/gpu/drm/bridge/tc358767.c | 40 ++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 14 deletions(-)