Re: [PATCH v2 3/3] drm/bridge: tc358767: Support write-only registers

From: Robert Foss
Date: Wed May 29 2024 - 10:06:58 EST


On Thu, May 16, 2024 at 8:25 AM Alexander Stein
<alexander.stein@xxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxx>
> ---
> 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@xxxxxxxxxx>