]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
greybus: control: Add TimeSync control commands
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Wed, 2 Mar 2016 16:51:10 +0000 (16:51 +0000)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 3 Mar 2016 23:22:52 +0000 (15:22 -0800)
Simple addition of the TimeSync commands defined in the specification.
Note for the case of timesync_authoritative we're passing the request
structure directly so as not to have to pass eight parameters into the
function.

Adds:
- control.c::timesync_enable(u8 count, u64 frame_time,
                             u32 strobe_delay, u32 refclk)
  Informs an Interface to expect count TimeSync strobe pulses with
  strobe_delay milliseconds delay between each strobe. Once enabled
  an Interface may not enter a low-power mode which will result in the
  reference timer used to track time switching off.

- control.c::timesync_disable(void)
  Commands an Interface to immediately halt TimeSync logic. This will allow
  an Interface to transition into low-power modes where the reference time
  being used for TimeSync may switch off.

- control.c::timesync_authoritative(u64 *frame_time, u8 count)
  Used by the AP Module to inform an Interface of the authoritative
  TimeSync clock-master time at each strobe pulse. Down-stream clock slaves
  shall adjust their local frame-time appropriately based on the
  diseminated authoritative frame-time.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/control.c
drivers/staging/greybus/control.h

index ba2754aa513c8f2d96edd935dabcec9c67953547..bac412ef72ab3e40937ee586bef3feca576240e6 100644 (file)
@@ -241,3 +241,39 @@ void gb_control_destroy(struct gb_control *control)
        gb_connection_destroy(control->connection);
        kfree(control);
 }
+
+int gb_control_timesync_enable(struct gb_control *control, u8 count,
+                              u64 frame_time, u32 strobe_delay, u32 refclk)
+{
+       struct gb_control_timesync_enable_request request;
+
+       request.count = count;
+       request.frame_time = cpu_to_le64(frame_time);
+       request.strobe_delay = cpu_to_le32(strobe_delay);
+       request.refclk = cpu_to_le32(refclk);
+       return gb_operation_sync(control->connection,
+                                GB_CONTROL_TYPE_TIMESYNC_ENABLE, &request,
+                                sizeof(request), NULL, 0);
+}
+
+int gb_control_timesync_disable(struct gb_control *control)
+{
+       return gb_operation_sync(control->connection,
+                                GB_CONTROL_TYPE_TIMESYNC_DISABLE, NULL, 0,
+                                NULL, 0);
+}
+
+int gb_control_timesync_authoritative(struct gb_control *control,
+                                     u64 *frame_time, u8 count)
+{
+       struct gb_control_timesync_authoritative_request request;
+       int i;
+
+       for (i = 0; i < GB_TIMESYNC_MAX_STROBES; i++)
+               request.frame_time[i] = frame_time[i];
+
+       return gb_operation_sync(control->connection,
+                                GB_CONTROL_TYPE_TIMESYNC_AUTHORITATIVE,
+                                &request, sizeof(request),
+                                NULL, 0);
+}
index d31e7c6d866a653b501f18f353084c10baa5d5fb..949f1a3c433b04ef00b8f24f9b72eda842c33c53 100644 (file)
@@ -31,5 +31,10 @@ int gb_control_get_manifest_size_operation(struct gb_interface *intf);
 int gb_control_get_manifest_operation(struct gb_interface *intf, void *manifest,
                                      size_t size);
 int gb_control_get_interface_version_operation(struct gb_interface *intf);
+int gb_control_timesync_enable(struct gb_control *control, u8 count,
+                              u64 frame_time, u32 strobe_delay, u32 refclk);
+int gb_control_timesync_disable(struct gb_control *control);
+int gb_control_timesync_authoritative(struct gb_control *control,
+                                     u64 *frame_time, u8 count);
 
 #endif /* __CONTROL_H */