[imx227][camera] Add return status to Camera APIs

- Need to add status message return for testing
  Camera Sensor APIs

Test: Compiles, tests added in subsequent CLs

Change-Id: Ib4fdee40366b71ad39815d064dfe834bc4fd78e5
diff --git a/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo b/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
index 958c03e..85626f4 100644
--- a/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
+++ b/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
@@ -97,15 +97,15 @@
     // Sets the Camera Sensor Mode to one of the supported modes.
     SetMode(uint8 mode) -> (zx.status s);
     // Start streaming from the camera sensor.
-    StartStreaming() -> ();
+    StartStreaming() -> (zx.status s);
     // Stop steaming.
-    StopStreaming() -> ();
+    StopStreaming() -> (zx.status s);
     // Change Analog Gain.
     SetAnalogGain(int32 gain) -> (int32 gain);
     // Change Digital Gain.
     SetDigitalGain(int32 gain) -> (int32 gain);
     // Set Integration Time.
-    SetIntegrationTime(int32 int_time, int32 int_time_M, int32 int_time_L) -> ();
+    SetIntegrationTime(int32 int_time) -> (zx.status s);
     // Update the sensor with new parameters.
     Update() -> (zx.status s);
     // Gets the Sensor Parameters.
diff --git a/zircon/system/dev/camera/arm-isp/modules/sensor.cpp b/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
index 98236af..c50dce6 100644
--- a/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
+++ b/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
@@ -212,18 +212,16 @@
     return camera_sensor_.SetDigitalGain(gain);
 }
 
-void Sensor::StartStreaming() {
-    camera_sensor_.StartStreaming();
+zx_status_t Sensor::StartStreaming() {
+    return camera_sensor_.StartStreaming();
 }
 
-void Sensor::StopStreaming() {
-    camera_sensor_.StopStreaming();
+zx_status_t Sensor::StopStreaming() {
+    return camera_sensor_.StopStreaming();
 }
 
-void Sensor::SetIntegrationTime(int32_t int_time,
-                                int32_t int_time_M,
-                                int32_t int_time_L) {
-    camera_sensor_.SetIntegrationTime(int_time, int_time_M, int_time_L);
+zx_status_t Sensor::SetIntegrationTime(int32_t int_time) {
+    return camera_sensor_.SetIntegrationTime(int_time);
 }
 
 zx_status_t Sensor::Update() {
diff --git a/zircon/system/dev/camera/arm-isp/modules/sensor.h b/zircon/system/dev/camera/arm-isp/modules/sensor.h
index 2c4443b..06ea025 100644
--- a/zircon/system/dev/camera/arm-isp/modules/sensor.h
+++ b/zircon/system/dev/camera/arm-isp/modules/sensor.h
@@ -37,11 +37,9 @@
                                   size_t modes_count);
     int32_t SetAnalogGain(int32_t gain);
     int32_t SetDigitalGain(int32_t gain);
-    void StartStreaming();
-    void StopStreaming();
-    void SetIntegrationTime(int32_t int_time,
-                            int32_t int_time_M,
-                            int32_t int_time_L);
+    zx_status_t StartStreaming();
+    zx_status_t StopStreaming();
+    zx_status_t SetIntegrationTime(int32_t int_time);
 
 private:
     zx_status_t HwInit();
diff --git a/zircon/system/dev/camera/imx227/imx227.cpp b/zircon/system/dev/camera/imx227/imx227.cpp
index bcf7530..e754331 100644
--- a/zircon/system/dev/camera/imx227/imx227.cpp
+++ b/zircon/system/dev/camera/imx227/imx227.cpp
@@ -182,12 +182,19 @@
     ctx_.param.integration_time_apply_delay = 2;
     ctx_.param.isp_exposure_channel_delay = 0;
 
+    initialized_ = true;
     zxlogf(INFO, "%s IMX227 Camera Sensor Brought out of reset\n", __func__);
     return ZX_OK;
 }
 
 void Imx227Device::CameraSensorDeInit() {
     mipi_.DeInit();
+    // Enable 24M clock for sensor.
+    clk24_.Disable();
+    // Reference code has it, mostly likely needed for the clock to
+    // stabalize. No other way of knowing for sure if sensor is now off.
+    zx_nanosleep(zx_deadline_after(ZX_MSEC(10)));
+    initialized_ = false;
 }
 
 zx_status_t Imx227Device::CameraSensorGetInfo(sensor_info_t* out_info) {
@@ -219,7 +226,7 @@
     zxlogf(INFO, "%s IMX227 Camera Sensor Mode Set request to %d\n", __func__, mode);
 
     // Get Sensor ID to see if sensor is initialized.
-    if (!ValidateSensorID()) {
+    if (!IsSensorInitialized() || !ValidateSensorID()) {
         return ZX_ERR_INTERNAL;
     }
 
@@ -294,15 +301,23 @@
     return mipi_.Init(&mipi_info, &adap_info);
 }
 
-void Imx227Device::CameraSensorStartStreaming() {
+zx_status_t Imx227Device::CameraSensorStartStreaming() {
+    if (!IsSensorInitialized()) {
+        return ZX_ERR_BAD_STATE;
+    }
     zxlogf(INFO, "%s Camera Sensor Start Streaming\n", __func__);
     ctx_.streaming_flag = 1;
     WriteReg(0x0100, 0x01);
+    return ZX_OK;
 }
 
-void Imx227Device::CameraSensorStopStreaming() {
+zx_status_t Imx227Device::CameraSensorStopStreaming() {
+    if (!IsSensorInitialized()) {
+        return ZX_ERR_BAD_STATE;
+    }
     ctx_.streaming_flag = 0;
     WriteReg(0x0100, 0x00);
+    return ZX_OK;
 }
 
 int32_t Imx227Device::CameraSensorSetAnalogGain(int32_t gain) {
@@ -313,9 +328,9 @@
     return ZX_ERR_NOT_SUPPORTED;
 }
 
-void Imx227Device::CameraSensorSetIntegrationTime(int32_t int_time,
-                                                  int32_t int_time_M,
-                                                  int32_t int_time_L) {
+zx_status_t Imx227Device::CameraSensorSetIntegrationTime(int32_t int_time) {
+    // TODO(braval): Add support for this.
+    return ZX_ERR_NOT_SUPPORTED;
 }
 
 zx_status_t Imx227Device::CameraSensorUpdate() {
@@ -357,14 +372,12 @@
         return status;
     }
 
-
     zx_device_prop_t props[] = {
         {BIND_PLATFORM_DEV_VID, 0, PDEV_VID_SONY},
         {BIND_PLATFORM_DEV_PID, 0, PDEV_PID_SONY_IMX227},
         {BIND_PLATFORM_DEV_DID, 0, PDEV_DID_CAMERA_SENSOR},
     };
 
-
     status = sensor_device->DdkAdd("imx227", 0, props, countof(props));
     if (status != ZX_OK) {
         zxlogf(ERROR, "imx227: Could not create imx227 sensor device: %d\n", status);
diff --git a/zircon/system/dev/camera/imx227/imx227.h b/zircon/system/dev/camera/imx227/imx227.h
index d3e94f2..cf80fbd 100644
--- a/zircon/system/dev/camera/imx227/imx227.h
+++ b/zircon/system/dev/camera/imx227/imx227.h
@@ -77,15 +77,19 @@
     void DdkUnbind();
     void DdkRelease();
 
+    // Testing interface will need to use this to check
+    // the status of the sensor.
+    bool IsSensorInitialized() { return initialized_; }
+
     // Methods for ZX_PROTOCOL_CAMERA_SENSOR.
     zx_status_t CameraSensorInit();
     void CameraSensorDeInit();
     zx_status_t CameraSensorSetMode(uint8_t mode);
-    void CameraSensorStartStreaming();
-    void CameraSensorStopStreaming();
+    zx_status_t CameraSensorStartStreaming();
+    zx_status_t CameraSensorStopStreaming();
     int32_t CameraSensorSetAnalogGain(int32_t gain);
     int32_t CameraSensorSetDigitalGain(int32_t gain);
-    void CameraSensorSetIntegrationTime(int32_t int_time, int32_t int_time_M, int32_t int_time_L);
+    zx_status_t CameraSensorSetIntegrationTime(int32_t int_time);
     zx_status_t CameraSensorUpdate();
     zx_status_t CameraSensorGetInfo(sensor_info_t* out_info);
     zx_status_t CameraSensorGetSupportedModes(sensor_mode_t* out_modes_list,
@@ -104,6 +108,9 @@
     ddk::ClockProtocolClient clk24_;
     ddk::MipiCsiProtocolClient mipi_;
 
+    // Sensor Status.
+    bool initialized_ = false;
+
     // I2C Helpers.
     uint8_t ReadReg(uint16_t addr);
     void WriteReg(uint16_t addr, uint8_t val);
@@ -113,5 +120,4 @@
     void ShutDown();
     bool ValidateSensorID();
 };
-
 } // namespace camera