@@ -1445,6 +1445,9 @@ struct ov8856 {
1445
1445
1446
1446
const struct ov8856_lane_cfg * priv_lane ;
1447
1447
u8 modes_size ;
1448
+
1449
+ /* True if the device has been identified */
1450
+ bool identified ;
1448
1451
};
1449
1452
1450
1453
struct ov8856_lane_cfg {
@@ -1685,6 +1688,71 @@ static int ov8856_write_reg_list(struct ov8856 *ov8856,
1685
1688
return 0 ;
1686
1689
}
1687
1690
1691
+ static int ov8856_identify_module (struct ov8856 * ov8856 )
1692
+ {
1693
+ struct i2c_client * client = v4l2_get_subdevdata (& ov8856 -> sd );
1694
+ int ret ;
1695
+ u32 val ;
1696
+
1697
+ if (ov8856 -> identified )
1698
+ return 0 ;
1699
+
1700
+ ret = ov8856_read_reg (ov8856 , OV8856_REG_CHIP_ID ,
1701
+ OV8856_REG_VALUE_24BIT , & val );
1702
+ if (ret )
1703
+ return ret ;
1704
+
1705
+ if (val != OV8856_CHIP_ID ) {
1706
+ dev_err (& client -> dev , "chip id mismatch: %x!=%x" ,
1707
+ OV8856_CHIP_ID , val );
1708
+ return - ENXIO ;
1709
+ }
1710
+
1711
+ ret = ov8856_write_reg (ov8856 , OV8856_REG_MODE_SELECT ,
1712
+ OV8856_REG_VALUE_08BIT , OV8856_MODE_STREAMING );
1713
+ if (ret )
1714
+ return ret ;
1715
+
1716
+ ret = ov8856_write_reg (ov8856 , OV8856_OTP_MODE_CTRL ,
1717
+ OV8856_REG_VALUE_08BIT , OV8856_OTP_MODE_AUTO );
1718
+ if (ret ) {
1719
+ dev_err (& client -> dev , "failed to set otp mode" );
1720
+ return ret ;
1721
+ }
1722
+
1723
+ ret = ov8856_write_reg (ov8856 , OV8856_OTP_LOAD_CTRL ,
1724
+ OV8856_REG_VALUE_08BIT ,
1725
+ OV8856_OTP_LOAD_CTRL_ENABLE );
1726
+ if (ret ) {
1727
+ dev_err (& client -> dev , "failed to enable load control" );
1728
+ return ret ;
1729
+ }
1730
+
1731
+ ret = ov8856_read_reg (ov8856 , OV8856_MODULE_REVISION ,
1732
+ OV8856_REG_VALUE_08BIT , & val );
1733
+ if (ret ) {
1734
+ dev_err (& client -> dev , "failed to read module revision" );
1735
+ return ret ;
1736
+ }
1737
+
1738
+ dev_info (& client -> dev , "OV8856 revision %x (%s) at address 0x%02x\n" ,
1739
+ val ,
1740
+ val == OV8856_2A_MODULE ? "2A" :
1741
+ val == OV8856_1B_MODULE ? "1B" : "unknown revision" ,
1742
+ client -> addr );
1743
+
1744
+ ret = ov8856_write_reg (ov8856 , OV8856_REG_MODE_SELECT ,
1745
+ OV8856_REG_VALUE_08BIT , OV8856_MODE_STANDBY );
1746
+ if (ret ) {
1747
+ dev_err (& client -> dev , "failed to exit streaming mode" );
1748
+ return ret ;
1749
+ }
1750
+
1751
+ ov8856 -> identified = true;
1752
+
1753
+ return 0 ;
1754
+ }
1755
+
1688
1756
static int ov8856_update_digital_gain (struct ov8856 * ov8856 , u32 d_gain )
1689
1757
{
1690
1758
int ret ;
@@ -1969,6 +2037,10 @@ static int ov8856_start_streaming(struct ov8856 *ov8856)
1969
2037
const struct ov8856_reg_list * reg_list ;
1970
2038
int link_freq_index , ret ;
1971
2039
2040
+ ret = ov8856_identify_module (ov8856 );
2041
+ if (ret )
2042
+ return ret ;
2043
+
1972
2044
link_freq_index = ov8856 -> cur_mode -> link_freq_index ;
1973
2045
reg_list = & ov8856 -> priv_lane -> link_freq_configs [link_freq_index ].reg_list ;
1974
2046
@@ -2276,65 +2348,6 @@ static const struct v4l2_subdev_internal_ops ov8856_internal_ops = {
2276
2348
.open = ov8856_open ,
2277
2349
};
2278
2350
2279
- static int ov8856_identify_module (struct ov8856 * ov8856 )
2280
- {
2281
- struct i2c_client * client = v4l2_get_subdevdata (& ov8856 -> sd );
2282
- int ret ;
2283
- u32 val ;
2284
-
2285
- ret = ov8856_read_reg (ov8856 , OV8856_REG_CHIP_ID ,
2286
- OV8856_REG_VALUE_24BIT , & val );
2287
- if (ret )
2288
- return ret ;
2289
-
2290
- if (val != OV8856_CHIP_ID ) {
2291
- dev_err (& client -> dev , "chip id mismatch: %x!=%x" ,
2292
- OV8856_CHIP_ID , val );
2293
- return - ENXIO ;
2294
- }
2295
-
2296
- ret = ov8856_write_reg (ov8856 , OV8856_REG_MODE_SELECT ,
2297
- OV8856_REG_VALUE_08BIT , OV8856_MODE_STREAMING );
2298
- if (ret )
2299
- return ret ;
2300
-
2301
- ret = ov8856_write_reg (ov8856 , OV8856_OTP_MODE_CTRL ,
2302
- OV8856_REG_VALUE_08BIT , OV8856_OTP_MODE_AUTO );
2303
- if (ret ) {
2304
- dev_err (& client -> dev , "failed to set otp mode" );
2305
- return ret ;
2306
- }
2307
-
2308
- ret = ov8856_write_reg (ov8856 , OV8856_OTP_LOAD_CTRL ,
2309
- OV8856_REG_VALUE_08BIT ,
2310
- OV8856_OTP_LOAD_CTRL_ENABLE );
2311
- if (ret ) {
2312
- dev_err (& client -> dev , "failed to enable load control" );
2313
- return ret ;
2314
- }
2315
-
2316
- ret = ov8856_read_reg (ov8856 , OV8856_MODULE_REVISION ,
2317
- OV8856_REG_VALUE_08BIT , & val );
2318
- if (ret ) {
2319
- dev_err (& client -> dev , "failed to read module revision" );
2320
- return ret ;
2321
- }
2322
-
2323
- dev_info (& client -> dev , "OV8856 revision %x (%s) at address 0x%02x\n" ,
2324
- val ,
2325
- val == OV8856_2A_MODULE ? "2A" :
2326
- val == OV8856_1B_MODULE ? "1B" : "unknown revision" ,
2327
- client -> addr );
2328
-
2329
- ret = ov8856_write_reg (ov8856 , OV8856_REG_MODE_SELECT ,
2330
- OV8856_REG_VALUE_08BIT , OV8856_MODE_STANDBY );
2331
- if (ret ) {
2332
- dev_err (& client -> dev , "failed to exit streaming mode" );
2333
- return ret ;
2334
- }
2335
-
2336
- return 0 ;
2337
- }
2338
2351
2339
2352
static int ov8856_get_hwcfg (struct ov8856 * ov8856 , struct device * dev )
2340
2353
{
@@ -2458,6 +2471,7 @@ static int ov8856_probe(struct i2c_client *client)
2458
2471
{
2459
2472
struct ov8856 * ov8856 ;
2460
2473
int ret ;
2474
+ bool full_power ;
2461
2475
2462
2476
ov8856 = devm_kzalloc (& client -> dev , sizeof (* ov8856 ), GFP_KERNEL );
2463
2477
if (!ov8856 )
@@ -2472,16 +2486,19 @@ static int ov8856_probe(struct i2c_client *client)
2472
2486
2473
2487
v4l2_i2c_subdev_init (& ov8856 -> sd , client , & ov8856_subdev_ops );
2474
2488
2475
- ret = __ov8856_power_on (ov8856 );
2476
- if (ret ) {
2477
- dev_err (& client -> dev , "failed to power on\n" );
2478
- return ret ;
2479
- }
2489
+ full_power = acpi_dev_state_d0 (& client -> dev );
2490
+ if (full_power ) {
2491
+ ret = __ov8856_power_on (ov8856 );
2492
+ if (ret ) {
2493
+ dev_err (& client -> dev , "failed to power on\n" );
2494
+ return ret ;
2495
+ }
2480
2496
2481
- ret = ov8856_identify_module (ov8856 );
2482
- if (ret ) {
2483
- dev_err (& client -> dev , "failed to find sensor: %d" , ret );
2484
- goto probe_power_off ;
2497
+ ret = ov8856_identify_module (ov8856 );
2498
+ if (ret ) {
2499
+ dev_err (& client -> dev , "failed to find sensor: %d" , ret );
2500
+ goto probe_power_off ;
2501
+ }
2485
2502
}
2486
2503
2487
2504
mutex_init (& ov8856 -> mutex );
@@ -2511,11 +2528,9 @@ static int ov8856_probe(struct i2c_client *client)
2511
2528
goto probe_error_media_entity_cleanup ;
2512
2529
}
2513
2530
2514
- /*
2515
- * Device is already turned on by i2c-core with ACPI domain PM.
2516
- * Enable runtime PM and turn off the device.
2517
- */
2518
- pm_runtime_set_active (& client -> dev );
2531
+ /* Set the device's state to active if it's in D0 state. */
2532
+ if (full_power )
2533
+ pm_runtime_set_active (& client -> dev );
2519
2534
pm_runtime_enable (& client -> dev );
2520
2535
pm_runtime_idle (& client -> dev );
2521
2536
@@ -2562,6 +2577,7 @@ static struct i2c_driver ov8856_i2c_driver = {
2562
2577
},
2563
2578
.probe_new = ov8856_probe ,
2564
2579
.remove = ov8856_remove ,
2580
+ .flags = I2C_DRV_ACPI_WAIVE_D0_PROBE ,
2565
2581
};
2566
2582
2567
2583
module_i2c_driver (ov8856_i2c_driver );
0 commit comments