Viresh Kumar [Mon, 11 Jan 2016 05:59:05 +0000 (11:29 +0530)]
greybus: arche-platform: Put APB in reset if of_platform_populate() fails
The current implementation around of_platform_populate() is not so
great. On error, we first print an error message, followed by a success
message and finally we return an error.
And over that we don't undo what we did initially.
This patch puts the APB back into reset and create a separate error
path to make things clear.
Viresh Kumar [Mon, 11 Jan 2016 05:59:04 +0000 (11:29 +0530)]
greybus: arche-platform: Export GPIOs after populating APBs
Populating APBs operation can potentially fail and it would be better if
we export the GPIOs towards then end of the routine, so that we don't
need to unexport them on error cases.
Eli Sennesh [Fri, 8 Jan 2016 19:11:29 +0000 (14:11 -0500)]
greybus: firmware/bootrom: debug output from bootrom protocol
The bootrom protocol issues no dynamic debugging messages when it functions
successfully. Use dev_dbg() to fix that by issuing kernel logs when firmware
download works.
Signed-off-by: Eli Sennesh <esennesh@leaflabs.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Jacopo Mondi [Fri, 8 Jan 2016 16:13:20 +0000 (18:13 +0200)]
greybus: camera: Add support for flags to stream_configure
Add support for the flags field of the stream configure request that was
recently added to the camera protocol and update the debugfs arguments
parsing accordingly. The stream configure response layout is also
updated to the latest protocol specification.
greybus: svc: Replace link config hack with standard operation
The link config operation was a hack only designed to fulfill the camera
driver's needs. Now that a standard operation is defined for the same
purpose, implement it and remove the hack.
greybus: arche-apb-ctrl: Do not bring APB out of reset in probe
With addition of handshaking between AP <=> SVC, driver
brings out APB out of reset only on reception of WAKE_MOD
signal from SVC. So remove the deassertion from probe.
greybus: arche-apb-ctrl: Set wake_detect gpio to low initially
This patch enables handshaking of AP and SVC using wake_detect
gpio (WD_8A and WD_8B).
Note that WAKE_DETECT polarity is active-high, so in order to
enable handshaking between AP <=> SVC, we need to set wake_detect
gpio to low initially, so that driver can send WAKE_DET signal
(active-high) to SVC and then SVC can send back WAKE_MOD signal
(active-low).
And on reception of WAKE_MOD signal, driver would bring respective
APB out of reset.
Vaibhav Hiremath [Mon, 28 Dec 2015 14:36:32 +0000 (20:06 +0530)]
greybus: arche_platform: Remove child's platform device as part of _remove() fn
It seems we need to delete platform_dev of all childs explicitly,
in _remove() fn callback of parent driver.
There were some discussions about having of_platform_unpopulate(),
but it never made it to mainline.
https://lkml.org/lkml/2013/7/19/615
There are some drivers which are removing platform_dev explicitly,
as done in this patch.
Note that, without this, multiple insmod-rmmod won't work, as I see
driver probe gets invoked twice and leads to failure of probe.
Johan Hovold [Wed, 30 Dec 2015 10:23:51 +0000 (11:23 +0100)]
greybus: camera: destroy data connection on link-config errors
Make sure to tear down the data connection also on failure to configure
the link by setting the data_connected flag immediately after creating
the connection.
Viresh Kumar [Mon, 28 Dec 2015 06:29:01 +0000 (11:59 +0530)]
greybus: interface: Fetch and expose version of interface's firmware
The version of the currently running firmware on the module is useful
for userspace as it can be used to find if an update is available or
not. This patch fetches interface's version with a new control operation
and exposes the same in userspace.
Viresh Kumar [Mon, 28 Dec 2015 06:29:00 +0000 (11:59 +0530)]
greybus: interface: Receive serial-number on hotplug event
Two exactly same modules can be uniquely identified using module's
serial-number. This patch updates the interface hotplug event to also
receive the serial-number of the module.
Viresh Kumar [Wed, 23 Dec 2015 03:37:42 +0000 (09:07 +0530)]
greybus: svc: Set interface's hotplug attributes before using them
gb_svc_read_and_clear_module_boot_status() relies on the values of
ddbl1_manufacturer_id and ddbl1_product_id to distinguish between ES2
and ES3 chips, but those values are set for the interface structure only
after gb_svc_read_and_clear_module_boot_status() is called.
This makes ES2 module to fail with following errors:
greybus 1-2: Module not ready yet
greybus 1-svc: failed to clear boot status of interface 2: -19
Fix this by setting these values before calling
gb_svc_read_and_clear_module_boot_status().
Fixes: 51f1dc421b1f ("firmware and svc: detect the difference between ES2 and ES3 chips") Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Bryan O'Donoghue [Wed, 23 Dec 2015 16:48:59 +0000 (16:48 +0000)]
greybus: svc: Change GB_SVC_TYPE_LINK_CONFIG to 0x10
The greybus specification reserves SVC type 0x0d-0x0f for timesync. 53124d73 ('svc: Add support for the link config operation') allocated the
next available type 0x0d which conflicts with the specification. Change the
type to 0x10 to ensure kernel and specification agree.
Vaibhav Hiremath [Wed, 16 Dec 2015 10:59:20 +0000 (16:29 +0530)]
greybus: arche-apb-ctrl: Assert reset to APB at the end of probe
Until we have proper handshake mechanism implemented with SVC
assert reset to APB at the end of probe.
We are safe here to do that, as SVC always enables clock to APB's
currently.
And also from EVT1 perspective, we should be good, as clock control
signals are now moved to AP.
Vaibhav Hiremath [Wed, 16 Dec 2015 10:59:19 +0000 (16:29 +0530)]
greybus: arche-apb-ctrl: Add APB control driver
It was messy to integrate both SVC, APB (and any other arche
platform specific control) into one single driver. Especially
due to cross-dependency.
AP first needs to bringup SVC, as SVC should enable clock to APB.
APB should come up before HUB, as due to some reason HUB wouldn't
enumerate APB's is APB comes up later.
And on top of that we should have clean picture of hardware description
in DT file.
So this patch introduces APB control driver. Mostly copied from original
arche-platform driver + fixed boot sequence.
Vaibhav Hiremath [Wed, 16 Dec 2015 10:59:18 +0000 (16:29 +0530)]
greybus: arche-platform: Rename db3-platform to arche-platform
With multiple platforms getting rolled into ara,
db3 name is confusing. And this driver is applicable
to all arche platforms, so make sense to rename it to
arche-platform.c. Also rename all internal functions
accordingly.
Vaibhav Hiremath [Wed, 16 Dec 2015 10:59:17 +0000 (16:29 +0530)]
greybus: db3(arche)-platform: Remove all APB control code
Current db3(arche)-platform driver was only handling APB control signals,
which is where it all started. But now with completion of DB3/EVT1 bringup
we know that platform driver is more than APB control.
We have to bring SVC up before APB, as SVC supposed to enable
clock to APB's. Note that, in EVT1, AP will have direct control over
APB's clock.
Then we have dependency between APB and USB HUB, where, APB should be
brought up before USB HUB (note that this needs to rootcaused).
This patch cleanup the db3(arche)-platform driver to remove all APB control
code. The idea here is create another driver for APB control
(arche-apb-ctrl.c), which will deal with APB.
And this driver will have generic/common platform specific support,
currently manages SVC resources.
This patch also takes in all the changes from factory branch, discovered
during bringup.
Eli Sennesh [Tue, 22 Dec 2015 22:26:57 +0000 (17:26 -0500)]
greybus: firmware and svc: detect the difference between ES2 and ES3 chips
The Greybus SVC code needs to read and clear the module boot status upon
hotplug; this requires reading two different attributes depending on whether
we're running on ES2 or ES3. On Marti Bolivar's (mbolivar@leaflabs.com)
advice, we detect ES2 using the unique ES2_DDBL1_MFR_ID and ES2_DDBL1_PROD_ID
for ES2 hardware, and treat all other chips as ES3 appropriately. This patch
detects the difference and adds the appropriate definitions for ES3 hardware.
Signed-off-by: Eli Sennesh <esennesh@leaflabs.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Viresh Kumar [Tue, 22 Dec 2015 16:34:34 +0000 (22:04 +0530)]
greybus: interface: Expose DDBL1 manufacturing and production id in sysfs
These ids are already fetched from the SVC, but were never exposed to
sysfs. Userspace may be interested in using these values and hence these
must be exposed to it.
Viresh Kumar [Tue, 22 Dec 2015 16:34:33 +0000 (22:04 +0530)]
greybus: interface: Prefix DDBL1 attributes with ddbl1_ instead of unipro_
The Device descriptor block Level 1 (DDBL1) attributes are specified by
the MIPI standard and prefixing them with 'unipro_' isn't the best thing
to do. They should be prefixed with DDBL1 instead.
To make it more readable/clear:
- rename macros and variable by prefixing them with ddbl1_.
- write full names for mfg and prod ids as manufacturer and product ids.
- replace mfg (manufacturing) with mfr (manufacturer)
Viresh Kumar [Fri, 18 Dec 2015 09:34:27 +0000 (15:04 +0530)]
greybus: interface: Prefix hexadecimal values with '0x'
In order to clearly specify the base of values printed using sysfs
files, prefix hexadecimal values with '0x'. Also force the minimum width
(to be printed) for hexadecimal values to their sizes.
To make it more readable make the second argument to gb_interface_attr()
a proper string.
Laurent Pinchart [Fri, 18 Dec 2015 19:23:25 +0000 (21:23 +0200)]
greybus: camera: Configure the bridge CSI transmitter
Start or stop the CSI transmitter when configuring and unconfiguring the
streams respectively. The CSI configuration parameters are currently
hardcoded.
This breaks the kernel-only build as it can't find any userspace headers
with the cross-compiler, so don't build the tools by "default" unless
you ask for them.
greybus: loopback_test: null terminate the dict structure
This lets us test for any number of entries, no need to do an
ARRAY_SIZE-type comparison. This fixes a build warning of comparing
signed/unsigned values.)
Rui Miguel Silva [Thu, 17 Dec 2015 19:56:23 +0000 (19:56 +0000)]
greybus: camera: fix data types of operations
In some operations definitions it was introduce some new fields with
the wrong data types, u8, instead of __u8. And because of this gbsim
build was broken.
Fixes: 3a1d7aa15bf6 ("greybus: Add camera protocol definition") Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Set an interface disconnected flag when the interface has been
hot-unplugged (e.g. forcibly removed or after a reboot), and use it to
disable the control connection early when deregistering the interface
and its bundles.
This avoids a one-second (default) timeout for every enabled connection
(e.g. one per bundle) at hot-unplug, something which for the default
gpbridge manifest currently amounts to five seconds.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Johan Hovold [Tue, 15 Dec 2015 14:28:56 +0000 (15:28 +0100)]
greybus: interface: clean up control-connection handling
Clean up control-connection handling by managing it through the control
structure and a higher-level control interface. Also make both the
control structure and connection lifetimes coincide with that of the
interface.
The control connection is now only enabled and disabled when the
interface is initialised and removed.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Johan Hovold [Tue, 15 Dec 2015 14:51:48 +0000 (15:51 +0100)]
greybus: es2: demote dynamic-urb error message
Demote error message when needing to dynamically allocate an URB to
debug level.
This isn't really an error as much as a reminder of how the current es2
implementation works: It uses a fixed number of pre-allocated URBs, but
allocates URBs dynamically when enough messages are sent in rapid
succession to exhaust the URB pool.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Laurent Pinchart [Tue, 15 Dec 2015 01:18:06 +0000 (03:18 +0200)]
greybus: Add driver for the camera class protocol
Integration with the V4L2 camera drivers isn't available yet, a debugfs
interface is exposed instead to call the camera Greybus operations.
The debugfs interface will be kept for module testing purpose in order
to exercise all the protocol operations with various valid and invalid
parameters.
Bryan O'Donoghue [Fri, 11 Dec 2015 13:46:53 +0000 (13:46 +0000)]
greybus: loopback: Add asynchronous backoff
A specific request from the firmware people is the ability to back-off from
sending more asynchronous operations once a specific number of operations
are in-flight.
This patch adds that ability - with a new sysfs parameter
'outstanding_operations_max' which controls the maximum number of
operations that can be outstanding/in-flight at any time.
When outstanding_operations_max contains a non-zero value and asynchronous
operations are being used - we will back-off until the completion counter
is < outstanding_operations_max. Tested in both synchronous and
asynchronous mode and with gb_loopback_connection_exit() interrupting
in-flight operations.
Suggested-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Bryan O'Donoghue [Fri, 11 Dec 2015 13:46:52 +0000 (13:46 +0000)]
greybus: loopback: Wait for all async operations to complete on exit
On gb_loopback_connection_exit() we should ensure every issued asynchronous
operation completes before exiting connection_exit(). This patch introduces
a waitqueue with a counter which represents the number of incomplete
asynchronous operations. When the counter reaches zero connection_exit()
will complete. At the point which we wait for outstanding operations to
complete the connection-specific loopback thread will have ceased to issue
new operations. Tested with both synchronous and asynchronous operations.
Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Suggested-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Bryan O'Donoghue [Fri, 11 Dec 2015 13:46:51 +0000 (13:46 +0000)]
greybus: loopback: Retrun -ENOMEM if operation allocation fails
If operation allocation fails we should return -ENOMEM in the asynchronous
operation send routine. If we don't return here then the
gb_loopback_async_operation_put() later can dereference a NULL pointer if
the previous gb_operation_create() failed.
Reported-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Bryan O'Donoghue [Fri, 11 Dec 2015 13:46:50 +0000 (13:46 +0000)]
greybus: loopback: Drop NULL check on container_of pointer
container_of cannot return NULL and the pointer passed to this context uses
reference counter bumped inside a spinlock, so the base pointer will be
valid at this point.
Suggested-by: Johan Hovold <johan@hovoldconstulting.com> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Axel Haslam [Fri, 11 Dec 2015 10:49:45 +0000 (11:49 +0100)]
greybus: loopback: register a struct device.
Instead of having the loopback attributes in the bundle device,
Add a struct device to the gb_loopback struct and register it on
connection_init, deregister it at connection_exit, and move the
loopback attribute group over to the new device.
Use device_create_with_groups to create sysfs attributes
together with device.
Suggested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Suggested-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Axel Haslam <ahaslam@baylibre.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Rui Miguel Silva [Thu, 10 Dec 2015 14:24:58 +0000 (14:24 +0000)]
greybus: spi: move chipselect to one byte size
Fixed in the specification, some values for chipselect count and index
were different in size, just fix that for all reference to chipselect
and move all to one byte size and remove byte order operations.
Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Fix race with user space when registering the interface.
The interface was registered before having been fully initialised,
something which could lead to user space accessing not-yet-initialised
attribute values (e.g. zero vendor and product ids or empty vendor and
product strings).
Note that this is also needed to be able to let attribute visibility
depend on manifest data (e.g. interface unlock).
Johan Hovold [Mon, 7 Dec 2015 14:05:40 +0000 (15:05 +0100)]
greybus: bundle: kill the bundle lock
Kill the bundle lock, which looked like it protected the interface
bundle lists but really did not as lock-less manipulations were still
made.
No locking for the interface bundle list is in fact needed as bundles
are created along with the interface, and the list is only used to check
for duplicate bundle ids when parsing the manifest and to destroy the
bundles when removing the interface itself.
Johan Hovold [Mon, 7 Dec 2015 14:05:37 +0000 (15:05 +0100)]
greybus: svc: create svc along with host device
Create svc device along with host-device and move the svc-connection to
the svc structure.
The svc connection is enabled when registering the host device, but as
the SVC protocol is currently driven by the SVC, we need to defer
registration of the svc device to the connection request handler.
Johan Hovold [Mon, 7 Dec 2015 14:05:35 +0000 (15:05 +0100)]
greybus: hd: initialise device last
Initialise the struct device last when creating the host device.
After device_initialize(), or rather dev_set_name(), we must use
put_device to release the host device. Initialising last will allow for
a simpler release callback.
Johan Hovold [Mon, 7 Dec 2015 14:05:30 +0000 (15:05 +0100)]
greybus: bundle: kill gb_bundle_bind_protocols
Remove gb_bundle_bind_protocols() that was used to iterate over all
registered bundles and bind protocols to them should a protocol become
available post bundle creation.
The protocol abstraction as a generic construct is going away in favour
of class drivers. Connections will be setup when a class driver is
probed, and driver modules can be loaded on-demand by user space based
on uevents and modalias.
greybus: loopback: Ensure we reset stats once and once only
9445c54c ('greybus/loopback: drop bus aggregate calculation') removed the
aggregation of data in-kernel but instead of dropping the reset of
aggregate stastics, converted that reset into a second reset of the
connection-level stats. While this doesn't result in anything bad it's
also definitely a dumb thing to be doing, so, drop it now.
Also ensure we reset the bridge-specific tracking variables at least once.
greybus: loopback: Convert thread delay to microseconds
Currently the loopback code allows a delay between operations specified in
milliseconds. Having added asynchronous bi-directional support to loopback
its obvious that the delay value would be far more useful specified in
microseconds than milliseconds. So, this patch makes the necessary
conversion.
greybus: loopback: Add asynchronous bi-directional support
A particular ask from the firmware people for some time now has been the
ability to drive multiple outstanding bi-directional operations from
loopback to loopback Interfaces. This patch implments that change.
The approach taken is to make a call to gb_operation_send() and have
loopback capture the completion callback itself, with a parallel timer to
timeout completion callbacks that take too long. The calling thread will
issue each gb_operation_send() as fast as it can within the constraints of
thread-safety.
In order to support this addition the following new sysfs entries are
created on a per-connection basis.
- async
Zero indicates loopback should use the traditional synchronous model
i.e. gb_operation_request_send_sync().
Non-zero indicates loopback should use the new asynchronous model i.e.
gb_operation_send()
- requests_completed
This value indicates the number of requests successfully completed.
- requests_timedout
This value indicates the number of requests which timed out.
- timeout
The number of microseconds to give an individual asynchronous request
before timing that request out.
- timeout_min
Read-only attribute informs user-space of the minimum allowed timeout.
- timeout_max
Read-only attribute informs user-space of the maximum allowed timeout.
Note requests_completed + requests_timedout should always equal
iteration_max, once iteration_count == iteration_max. Also, at this time we
support either synchronous or asynchronous operations in one set of
transactions.
greybus: loopback: Convert cross-thread mutex to spinlock while relaxing connect locks
This patch converts the cross-thread mutex used to synchronize threads with
respect to each other to a spinlock. This is done to enable taking of locks
in the following patches while in atomic context. A small re-order of
locking in connection setup/tear-down is done to minimize the amount of
time spent in spinlock_irqsave().
Viresh Kumar [Fri, 4 Dec 2015 16:00:09 +0000 (21:30 +0530)]
greybus: don't use %h and %hh for printing short and char variables
Because the width of our fields is already known, we can use %0Nx (for
hex) to print N bytes and %u (for unsigned decimal), instead of using %h
and %hh, which isn't that readable.
This patch makes following changes:
- s/%hx/%04x
- s/%04hx/%04x
- s/%hhx/%02x
- s/%02hhx/%02x
- s/%hhu/%u
- s/%hu/%u
- s/%x/%02x for u8 value (only at a single place)
Suggested-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Viresh Kumar [Fri, 4 Dec 2015 16:00:07 +0000 (21:30 +0530)]
greybus: Documentation: Arrange entries in alphabetical order
The order of entries in sysfs-bus-greybus file doesn't match the order
files/directories in sysfs on a real board. More specifically, N-svc
comes at last and ap_interface_id comes before endo_id within the svc.
At some point we had a statement in a Jira work item to pull out 'bus
level' data from greybus and to have messages to different interfaces be
synchronized with respect to each other. Synchronizing threads with respect
to each other is slow and it turns out we can get the same 'bus level'
stastics by making the user-space test application smarter.
That's great news for the in-kernel code since it means we can cut out a
whole lot of code to-do with calculating 'bus level' aggregate data and we
can stop forcing threads to hit a rendezvous before sending out another
loopback operation.
So this patch drops bus level aggregates in favour of doing that in
user-space. It subtracts a lot of code and cycles that in practice nobody
cares about anyway.