@@ -215,6 +215,72 @@ static int apple_isp_init_presets(struct apple_isp *isp)
215215 return 0 ;
216216}
217217
218+ static const char * isp_fw2str (enum isp_firmware_version version )
219+ {
220+ switch (version ) {
221+ case ISP_FIRMWARE_V_12_3 :
222+ return "12.3" ;
223+ case ISP_FIRMWARE_V_12_4 :
224+ return "12.4" ;
225+ case ISP_FIRMWARE_V_13_5 :
226+ return "13.5" ;
227+ default :
228+ return "unknown" ;
229+ }
230+ }
231+
232+ #define ISP_FW_VERSION_MIN_LEN 3
233+ #define ISP_FW_VERSION_MAX_LEN 5
234+
235+ static enum isp_firmware_version isp_read_fw_version (struct device * dev ,
236+ const char * name )
237+ {
238+ u32 ver [ISP_FW_VERSION_MAX_LEN ];
239+ int len = of_property_read_variable_u32_array (dev -> of_node , name , ver ,
240+ ISP_FW_VERSION_MIN_LEN ,
241+ ISP_FW_VERSION_MAX_LEN );
242+
243+ switch (len ) {
244+ case 3 :
245+ if (ver [0 ] == 12 && ver [1 ] == 3 && ver [2 ] <= 1 )
246+ return ISP_FIRMWARE_V_12_3 ;
247+ else if (ver [0 ] == 12 && ver [1 ] == 4 && ver [2 ] == 0 )
248+ return ISP_FIRMWARE_V_12_4 ;
249+ else if (ver [0 ] == 13 && ver [1 ] == 5 && ver [2 ] == 0 )
250+ return ISP_FIRMWARE_V_13_5 ;
251+
252+ dev_warn (dev , "unknown %s: %d.%d.%d\n" , name , ver [0 ], ver [1 ], ver [2 ]);
253+ break ;
254+ case 4 :
255+ dev_warn (dev , "unknown %s: %d.%d.%d.%d\n" , name , ver [0 ], ver [1 ],
256+ ver [2 ], ver [3 ]);
257+ break ;
258+ case 5 :
259+ dev_warn (dev , "unknown %s: %d.%d.%d.%d.%d\n" , name , ver [0 ],
260+ ver [1 ], ver [2 ], ver [3 ], ver [4 ]);
261+ break ;
262+ default :
263+ dev_warn (dev , "could not parse %s: %d\n" , name , len );
264+ break ;
265+ }
266+
267+ return ISP_FIRMWARE_V_UNKNOWN ;
268+ }
269+
270+ static enum isp_firmware_version isp_check_firmware_version (struct device * dev )
271+ {
272+ enum isp_firmware_version version , compat ;
273+
274+ /* firmware version is just informative */
275+ version = isp_read_fw_version (dev , "apple,firmware-version" );
276+ compat = isp_read_fw_version (dev , "apple,firmware-compat" );
277+
278+ dev_info (dev , "ISP firmware-compat: %s (FW: %s)\n" , isp_fw2str (compat ),
279+ isp_fw2str (version ));
280+
281+ return compat ;
282+ }
283+
218284static int apple_isp_probe (struct platform_device * pdev )
219285{
220286 struct device * dev = & pdev -> dev ;
@@ -234,6 +300,11 @@ static int apple_isp_probe(struct platform_device *pdev)
234300 platform_set_drvdata (pdev , isp );
235301 dev_set_drvdata (dev , isp );
236302
303+ /* Differences between firmware versions are rather minor so try to work
304+ * with unknown firmware.
305+ */
306+ isp -> fw_compat = isp_check_firmware_version (dev );
307+
237308 err = of_property_read_u32 (dev -> of_node , "apple,platform-id" ,
238309 & isp -> platform_id );
239310 if (err ) {
0 commit comments