@@ -224,6 +224,72 @@ static int apple_isp_init_presets(struct apple_isp *isp)
224
224
return err ;
225
225
}
226
226
227
+ static const char * isp_fw2str (enum isp_firmware_version version )
228
+ {
229
+ switch (version ) {
230
+ case ISP_FIRMWARE_V_12_3 :
231
+ return "12.3" ;
232
+ case ISP_FIRMWARE_V_12_4 :
233
+ return "12.4" ;
234
+ case ISP_FIRMWARE_V_13_5 :
235
+ return "13.5" ;
236
+ default :
237
+ return "unknown" ;
238
+ }
239
+ }
240
+
241
+ #define ISP_FW_VERSION_MIN_LEN 3
242
+ #define ISP_FW_VERSION_MAX_LEN 5
243
+
244
+ static enum isp_firmware_version isp_read_fw_version (struct device * dev ,
245
+ const char * name )
246
+ {
247
+ u32 ver [ISP_FW_VERSION_MAX_LEN ];
248
+ int len = of_property_read_variable_u32_array (dev -> of_node , name , ver ,
249
+ ISP_FW_VERSION_MIN_LEN ,
250
+ ISP_FW_VERSION_MAX_LEN );
251
+
252
+ switch (len ) {
253
+ case 3 :
254
+ if (ver [0 ] == 12 && ver [1 ] == 3 && ver [2 ] <= 1 )
255
+ return ISP_FIRMWARE_V_12_3 ;
256
+ else if (ver [0 ] == 12 && ver [1 ] == 4 && ver [2 ] == 0 )
257
+ return ISP_FIRMWARE_V_12_4 ;
258
+ else if (ver [0 ] == 13 && ver [1 ] == 5 && ver [2 ] == 0 )
259
+ return ISP_FIRMWARE_V_13_5 ;
260
+
261
+ dev_warn (dev , "unknown %s: %d.%d.%d\n" , name , ver [0 ], ver [1 ], ver [2 ]);
262
+ break ;
263
+ case 4 :
264
+ dev_warn (dev , "unknown %s: %d.%d.%d.%d\n" , name , ver [0 ], ver [1 ],
265
+ ver [2 ], ver [3 ]);
266
+ break ;
267
+ case 5 :
268
+ dev_warn (dev , "unknown %s: %d.%d.%d.%d.%d\n" , name , ver [0 ],
269
+ ver [1 ], ver [2 ], ver [3 ], ver [4 ]);
270
+ break ;
271
+ default :
272
+ dev_warn (dev , "could not parse %s: %d\n" , name , len );
273
+ break ;
274
+ }
275
+
276
+ return ISP_FIRMWARE_V_UNKNOWN ;
277
+ }
278
+
279
+ static enum isp_firmware_version isp_check_firmware_version (struct device * dev )
280
+ {
281
+ enum isp_firmware_version version , compat ;
282
+
283
+ /* firmware version is just informative */
284
+ version = isp_read_fw_version (dev , "apple,firmware-version" );
285
+ compat = isp_read_fw_version (dev , "apple,firmware-compat" );
286
+
287
+ dev_info (dev , "ISP firmware-compat: %s (FW: %s)\n" , isp_fw2str (compat ),
288
+ isp_fw2str (version ));
289
+
290
+ return compat ;
291
+ }
292
+
227
293
static int apple_isp_probe (struct platform_device * pdev )
228
294
{
229
295
struct device * dev = & pdev -> dev ;
@@ -243,6 +309,11 @@ static int apple_isp_probe(struct platform_device *pdev)
243
309
platform_set_drvdata (pdev , isp );
244
310
dev_set_drvdata (dev , isp );
245
311
312
+ /* Differences between firmware versions are rather minor so try to work
313
+ * with unknown firmware.
314
+ */
315
+ isp -> fw_compat = isp_check_firmware_version (dev );
316
+
246
317
err = of_property_read_u32 (dev -> of_node , "apple,platform-id" ,
247
318
& isp -> platform_id );
248
319
if (err ) {
0 commit comments