Hi Mike, kernel test robot noticed the following build errors:
[auto build test ERROR on 53e760d8949895390e256e723e7ee46618310361] url: https://github.com/intel-lab-lkp/linux/commits/Mike-Looijmans/dt-bindings-drm-bridge-ti-tmds181-Add-TI-TMDS181-and-SN65DP159-bindings/20250819-133458 base: 53e760d8949895390e256e723e7ee46618310361 patch link: https://lore.kernel.org/r/20250819053205.9976-3-mike.looijmans%40topic.nl patch subject: [PATCH v2 2/2] drm: bridge: Add TI tmds181 and sn65dp159 driver config: parisc-allmodconfig (https://download.01.org/0day-ci/archive/20250820/202508200712.fuhg7vmw-...@intel.com/config) compiler: hppa-linux-gcc (GCC) 15.1.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250820/202508200712.fuhg7vmw-...@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <l...@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202508200712.fuhg7vmw-...@intel.com/ All errors (new ones prefixed by >>): drivers/gpu/drm/bridge/ti-tmds181.c: In function 'tmds181_enable': >> drivers/gpu/drm/bridge/ti-tmds181.c:165:28: error: implicit declaration of >> function 'FIELD_PREP' [-Wimplicit-function-declaration] 165 | FIELD_PREP(TMDS181_CTRLB_TX_TERM_CTL, val)); | ^~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:137:40: warning: unused variable 'bridge_state' [-Wunused-variable] 137 | const struct drm_bridge_state *bridge_state; | ^~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c: At top level: drivers/gpu/drm/bridge/ti-tmds181.c:181:27: error: initialization of 'int (*)(struct drm_bridge *, struct drm_encoder *, enum drm_bridge_attach_flags)' from incompatible pointer type 'int (*)(struct drm_bridge *, enum drm_bridge_attach_flags)' [-Wincompatible-pointer-types] 181 | .attach = tmds181_attach, | ^~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:181:27: note: (near initialization for 'tmds181_bridge_funcs.attach') drivers/gpu/drm/bridge/ti-tmds181.c:102:12: note: 'tmds181_attach' declared here 102 | static int tmds181_attach(struct drm_bridge *bridge, | ^~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:183:27: error: initialization of 'void (*)(struct drm_bridge *, struct drm_atomic_state *)' from incompatible pointer type 'void (*)(struct drm_bridge *, struct drm_bridge_state *)' [-Wincompatible-pointer-types] 183 | .atomic_enable = tmds181_enable, | ^~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:183:27: note: (near initialization for 'tmds181_bridge_funcs.atomic_enable') drivers/gpu/drm/bridge/ti-tmds181.c:133:13: note: 'tmds181_enable' declared here 133 | static void tmds181_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) | ^~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:184:27: error: initialization of 'void (*)(struct drm_bridge *, struct drm_atomic_state *)' from incompatible pointer type 'void (*)(struct drm_bridge *, struct drm_bridge_state *)' [-Wincompatible-pointer-types] 184 | .atomic_disable = tmds181_disable, | ^~~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c:184:27: note: (near initialization for 'tmds181_bridge_funcs.atomic_disable') drivers/gpu/drm/bridge/ti-tmds181.c:171:13: note: 'tmds181_disable' declared here 171 | static void tmds181_disable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) | ^~~~~~~~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c: In function 'termination_show': >> drivers/gpu/drm/bridge/ti-tmds181.c:297:26: error: implicit declaration of >> function 'FIELD_GET' [-Wimplicit-function-declaration] 297 | FIELD_GET(TMDS181_CTRLB_TX_TERM_CTL, val)); | ^~~~~~~~~ drivers/gpu/drm/bridge/ti-tmds181.c: At top level: drivers/gpu/drm/bridge/ti-tmds181.c:96:12: warning: 'tmds181_apply_changes' defined but not used [-Wunused-function] 96 | static int tmds181_apply_changes(struct tmds181_data *data) | ^~~~~~~~~~~~~~~~~~~~~ vim +/FIELD_PREP +165 drivers/gpu/drm/bridge/ti-tmds181.c 132 133 static void tmds181_enable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) 134 { 135 struct tmds181_data *data = drm_bridge_to_tmds181_data(bridge); 136 struct drm_atomic_state *state = old_bridge_state->base.state; 137 const struct drm_bridge_state *bridge_state; 138 const struct drm_crtc_state *crtc_state; 139 const struct drm_display_mode *mode; 140 struct drm_connector *connector; 141 struct drm_crtc *crtc; 142 unsigned int val; 143 144 /* 145 * Retrieve the CRTC adjusted mode. This requires a little dance to go 146 * from the bridge to the encoder, to the connector and to the CRTC. 147 */ 148 connector = drm_atomic_get_new_connector_for_encoder(state, 149 bridge->encoder); 150 crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; 151 crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 152 mode = &crtc_state->adjusted_mode; 153 154 /* Set retimer/redriver mode based on pixel clock */ 155 val = mode->clock > data->retimer_threshold_khz ? TMDS181_CTRLA_DEV_FUNC_MODE : 0; 156 regmap_update_bits(data->regmap, TMDS181_REG_CTRLA, 157 TMDS181_CTRLA_DEV_FUNC_MODE, val); 158 159 /* Configure TX termination based on pixel clock */ 160 val = mode->clock > HDMI2_PIXEL_RATE_KHZ ? 161 TMDS181_CTRLB_TX_TERM_75_150_OHMS : 162 TMDS181_CTRLB_TX_TERM_150_300_OHMS; 163 regmap_update_bits(data->regmap, TMDS181_REG_CTRLB, 164 TMDS181_CTRLB_TX_TERM_CTL, > 165 FIELD_PREP(TMDS181_CTRLB_TX_TERM_CTL, val)); 166 167 regmap_update_bits(data->regmap, TMDS181_REG_CTRL9, 168 TMDS181_CTRL9_PD_EN, 0); 169 } 170 171 static void tmds181_disable(struct drm_bridge *bridge, struct drm_bridge_state *old_bridge_state) 172 { 173 struct tmds181_data *data = drm_bridge_to_tmds181_data(bridge); 174 175 /* Set the PD_EN bit */ 176 regmap_update_bits(data->regmap, TMDS181_REG_CTRL9, 177 TMDS181_CTRL9_PD_EN, TMDS181_CTRL9_PD_EN); 178 } 179 180 static const struct drm_bridge_funcs tmds181_bridge_funcs = { 181 .attach = tmds181_attach, 182 .mode_valid = tmds181_mode_valid, 183 .atomic_enable = tmds181_enable, 184 .atomic_disable = tmds181_disable, 185 186 .atomic_reset = drm_atomic_helper_bridge_reset, 187 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 188 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 189 }; 190 191 static const char * const tmds181_modes[] = { 192 "redriver", 193 "auto1", 194 "auto2", 195 "retimer", 196 }; 197 198 static ssize_t mode_show(struct device *dev, struct device_attribute *attr, 199 char *buf) 200 { 201 struct tmds181_data *data = dev_get_drvdata(dev); 202 const char *equalizer; 203 u32 val; 204 int ret; 205 206 ret = regmap_read(data->regmap, TMDS181_REG_CTRLA, &val); 207 if (ret < 0) 208 return ret; 209 210 if (val & BIT(4)) { 211 if (val & BIT(5)) 212 equalizer = "eq-adaptive"; 213 else 214 equalizer = "eq-fixed"; 215 } else { 216 equalizer = "eq-disabled"; 217 } 218 219 return scnprintf(buf, PAGE_SIZE, "%6s %s %s\n", 220 (val & BIT(7)) ? "sink" : "source", 221 tmds181_modes[val & 0x03], 222 equalizer); 223 } 224 225 static ssize_t mode_store(struct device *dev, struct device_attribute *attr, 226 const char *buf, size_t len) 227 { 228 struct tmds181_data *data = dev_get_drvdata(dev); 229 u32 val; 230 int ret; 231 int i; 232 233 /* Strip trailing newline(s) for being user friendly */ 234 while (len && buf[len] == '\n') 235 --len; 236 237 /* Need at least 4 actual characters */ 238 if (len < 4) 239 return -EINVAL; 240 241 ret = regmap_read(data->regmap, TMDS181_REG_CTRLA, &val); 242 if (ret < 0) 243 return ret; 244 245 for (i = 0; i < ARRAY_SIZE(tmds181_modes); ++i) { 246 if (strncmp(tmds181_modes[i], buf, len) == 0) { 247 val &= ~TMDS181_CTRLA_DEV_FUNC_MODE; 248 val |= FIELD_PREP(TMDS181_CTRLA_DEV_FUNC_MODE, i); 249 break; 250 } 251 } 252 253 if (strncmp("sink", buf, len) == 0) 254 val |= TMDS181_CTRLA_MODE_SINK; 255 256 if (strncmp("source", buf, len) == 0) 257 val &= ~TMDS181_CTRLA_MODE_SINK; 258 259 if (strncmp("eq-", buf, 3) == 0) { 260 switch (buf[3]) { 261 case 'a': /* adaptive */ 262 val |= TMDS181_CTRLA_EQ_ADA_EN | TMDS181_CTRLA_EQ_EN; 263 break; 264 case 'f': /* fixed */ 265 val |= TMDS181_CTRLA_EQ_EN; 266 val &= ~TMDS181_CTRLA_EQ_ADA_EN; 267 break; 268 case 'd': /* disable */ 269 val &= ~(TMDS181_CTRLA_EQ_ADA_EN | TMDS181_CTRLA_EQ_EN); 270 break; 271 } 272 } 273 274 /* Always set the "apply changes" bit */ 275 val |= TMDS181_CTRLA_APPLY; 276 277 ret = regmap_write(data->regmap, TMDS181_REG_CTRLA, val); 278 if (ret < 0) 279 return ret; 280 281 return len; 282 } 283 284 /* termination for HDMI TX: 0=off, 1=150..300, 3=75..150 ohms */ 285 static ssize_t termination_show(struct device *dev, 286 struct device_attribute *attr, char *buf) 287 { 288 struct tmds181_data *data = dev_get_drvdata(dev); 289 u32 val; 290 int ret; 291 292 ret = regmap_read(data->regmap, TMDS181_REG_CTRLB, &val); 293 if (ret < 0) 294 return ret; 295 296 return scnprintf(buf, PAGE_SIZE, "%u\n", > 297 FIELD_GET(TMDS181_CTRLB_TX_TERM_CTL, val)); 298 } 299 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki