summaryrefslogtreecommitdiffstats
path: root/drivers/input/serio/serio.c
Commit message (Collapse)AuthorAgeFilesLines
* Input: serio - fix sysfs layoutDmitry Torokhov2013-12-091-7/+17
| | | | | | | | | | | | | Restore previous layout of sysfs attributes that was broken by commit 3778a2129bcce84f684cc0017ed20d2524afd289 (input: serio: remove bus usage of dev_attrs) which moved all serio device attributes into 'id' group, when only 'type', 'proto', 'id', and 'extra' should be in 'id' group and the rest of attributes should be attached directly to the device. Reported-by: Thomas Hellstrom <thellstrom@vmware.com> Tested-by: Thomas Hellstrom <thellstrom@vmware.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
* input: serio: remove bus usage of dev_attrsGreg Kroah-Hartman2013-10-191-32/+30
| | | | | | | | | | The dev_attrs field of struct bus_type is going away soon, so move the remaining sysfs files that are being described with this field to use dev_groups instead. Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: <linux-input@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* input: serio: use DEVICE_ATTR_RO()Greg Kroah-Hartman2013-10-191-8/+8
| | | | | | | | | Convert the serio sysfs fiels to use the DEVICE_ATTR_RO() macros to make it easier to audit the correct sysfs file permission usage. Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: <linux-input@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* Input: serio: convert bus code to use drv_groupsGreg Kroah-Hartman2013-08-251-10/+11
| | | | | | | | | The drv_attrs field of struct bus_type is going away soon, drv_groups should be used instead. This converts the serio bus code to use the correct field. Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* Input: serio - remove CONFIG_HOTPLUG ifdefsBill Pemberton2012-11-241-11/+0
| | | | | | | | Remove conditional code based on CONFIG_HOTPLUG being false. It's always on now in preparation of it going away as an option. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
* Driver core: driver_find() drops reference before returningAlan Stern2012-01-241-1/+0
| | | | | | | | | | | | | | | | | | | | | | As part of the removal of get_driver()/put_driver(), this patch (as1510) changes driver_find(); it now drops the reference it acquires before returning. The patch also adjusts all the callers of driver_find() to remove the now unnecessary calls to put_driver(). In addition, the patch adds a warning to driver_find(): Callers must make sure the driver they are searching for does not get unloaded while they are using it. This has always been the case; driver_find() has never prevented a driver from being unregistered or unloaded. Hence the patch will not introduce any new bugs. The existing callers all seem to be okay in this respect, however I don't understand the video drivers well enough to be certain about them. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> CC: Dmitry Torokhov <dmitry.torokhov@gmail.com> CC: Kyungmin Park <kyungmin.park@samsung.com> CC: Andy Walls <awalls@md.metrocast.net> CC: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* Input: serio/gameport - use 'long' system workqueueDmitry Torokhov2011-02-231-1/+1
| | | | | | | | | | | | | | | | | Commit 8ee294cd9def0004887da7f44b80563493b0a097 converted serio subsystem event handling from using a dedicated thread to using common workqueue. Unfortunately, this regressed our boot times, due to the fact that serio jobs take long time to execute. While the new concurrency managed workqueue code manages long-playing works just fine and schedules additional workers as needed, such works wreck havoc among remaining users of flush_scheduled_work(). To solve this problem let's move serio/gameport works from system_wq to system_long_wq which nobody tries to flush. Reported-and-tested-by: Hernando Torque <pantherchen@versanet.de> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - clear pending rescans after sysfs driver rebindDuncan Laurie2011-02-021-4/+7
| | | | | | | | | | | | | | | | | | | | When rebinding a serio driver via sysfs drvctl interface it is possible for an interrupt to trigger after the disconnect of the existing driver and before the binding of the new driver. This will cause the serio interrupt handler to queue a rescan event which will disconnect the new driver immediately after it is attached. This change removes pending rescans from the serio event queue after processing the drvctl request but before releasing the serio mutex. Reproduction involves issuing a rebind of device port from psmouse driver to serio_raw driver while generating input to trigger interrupts. Then checking to see if the corresponding i8042/serio4/driver is correctly attached to the serio_raw driver instead of psmouse. Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - convert to common workqueue instead of a threadDmitry Torokhov2010-11-181-86/+69
| | | | | | | | | | Instead of creating an exclusive thread to handle serio events (which happen rarely), let's switch to using common workqueue. With the arrival of concurrency-managed workqueue infrastructure we are not concerned that our callers or callees also using workqueue (no deadlocks anymore) and it should reduce total number of threads in the system. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - support multiple child devices per single parentDmitry Eremin-Solenikov2010-10-131-43/+81
| | | | | | | | | Some (rare) serio devices need to have multiple serio children. One of the examples is PS/2 multiplexer present on several TQC STKxxx boards, which connect PS/2 keyboard and mouse to single tty port. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - do not include linux/freezer.hDmitry Torokhov2010-09-141-1/+0
| | | | | | | Commit ea486e681188d64c6a101d8d06414aef0f9f0cd3 changed kseriod thread to become not freezable so we do not need this include anymore. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Merge commit 'v2.6.33-rc5' into nextDmitry Torokhov2010-01-211-9/+2
|\
| * Input: serio - do not mark kseriod freezable anymoreDmitry Torokhov2009-12-241-9/+2
| | | | | | | | | | | | | | | | | | | | | | | | We used to make kseriod freezable to prevent unnecessary attempts at resuming keyboard and mouse before taking hibernation image when suspend and hibernation were sharing PM operations. Now that they are separated and we don't risk resuming during 'thaw' we don't need to freeze kseriod anymore. This will allow us to start resetting mouse and keyboard a bit earlier, before rest of the userspace comes back up. Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - use pr_xxx() and dev_xxx() helpersDmitry Torokhov2010-01-061-42/+35
| | | | | | | | | | | | | | | | pr_xxx() and dev_xxx() helpers ensure that all messages emitted by the module have consistent prefixes, so let's use them. Also fix some formatting issues. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - use list_first_entry() helperDmitry Torokhov2010-01-061-20/+11
| | | | | | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - let device core tell us if device was registeredDmitry Torokhov2010-01-061-6/+2
| | | | | | | | | | | | No need to keep track of it by ourselves. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - use device core to create 'id' attribute groupDmitry Torokhov2010-01-061-8/+9
|/ | | | | | | Instead of creating 'id' sysfs attribute group by ourselves rely on device core to do that for us. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - switch to using dev_pm_opsDmitry Torokhov2009-07-261-12/+11
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: mark serio and i8042 as suspended when hibernating tooThadeu Lima de Souza Cascardo2009-07-071-3/+4
| | | | | | | | | | | | | Serio ports are not being restarted any longer because resume operations after hibernate do nothing, since the device has not been marked as suspended. This happens because suspend is only considering the SUSPEND event but not the FREEZE event. Note that this driver has still to migrate to dev_pm_ops, but this fixes this particular bug now. Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - do not use deprecated dev.power.power_stateDmitry Torokhov2009-05-091-18/+19
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - rearrange EXPORT_SYMBOL() markingsDmitry Torokhov2009-04-171-11/+10
| | | | | | | Current style calls for placing EXPORT_SYMBOL() markings directly after exported symbol definition; let's follow it. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: struct device - replace bus_id with dev_name(), dev_set_name()Kay Sievers2008-10-301-2/+2
| | | | | | Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - offload resume to kseriodShaohua Li2008-07-231-18/+37
| | | | | | | | | | | When resuming AUX ports psmouse driver calls psmouse_extensions() to determine if the attached mouse is still the same, which may take a while to complete for generic mice. Offload the resume process to kseriod so the rest of the system may continue resuming without waiting for the mouse. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - remove pending events when unregistering driverDmitry Torokhov2008-06-021-3/+6
| | | | | | | | That fixes an opps when driver is repeatedly loaded and unloaded in a tight loop. Tested-by: Roland Kletzing <devzero@web.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* freezer: introduce freezer-friendly waiting macrosRafael J. Wysocki2007-10-181-2/+1
| | | | | | | | | | | | | | | | Introduce freezer-friendly wrappers around wait_event_interruptible() and wait_event_interruptible_timeout(), originally defined in <linux/wait.h>, to be used in freezable kernel threads. Make some of the freezable kernel threads use them. This is necessary for the freezer to stop sending signals to kernel threads, which is implemented in the next patch. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@ucw.cz> Cc: Nigel Cunningham <nigel@nigel.suspend2.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* Driver core: change add_uevent_var to use a structKay Sievers2007-10-121-8/+3
| | | | | | | | | | | | | | | | | | This changes the uevent buffer functions to use a struct instead of a long list of parameters. It does no longer require the caller to do the proper buffer termination and size accounting, which is currently wrong in some places. It fixes a known bug where parts of the uevent environment are overwritten because of wrong index calculations. Many thanks to Mathieu Desnoyers for finding bugs and improving the error handling. Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Cc: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* Freezer: make kernel threads nonfreezable by defaultRafael J. Wysocki2007-07-171-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, the freezer treats all tasks as freezable, except for the kernel threads that explicitly set the PF_NOFREEZE flag for themselves. This approach is problematic, since it requires every kernel thread to either set PF_NOFREEZE explicitly, or call try_to_freeze(), even if it doesn't care for the freezing of tasks at all. It seems better to only require the kernel threads that want to or need to be frozen to use some freezer-related code and to remove any freezer-related code from the other (nonfreezable) kernel threads, which is done in this patch. The patch causes all kernel threads to be nonfreezable by default (ie. to have PF_NOFREEZE set by default) and introduces the set_freezable() function that should be called by the freezable kernel threads in order to unset PF_NOFREEZE. It also makes all of the currently freezable kernel threads call set_freezable(), so it shouldn't cause any (intentional) change of behaviour to appear. Additionally, it updates documentation to describe the freezing of tasks more accurately. [akpm@linux-foundation.org: build fixes] Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Nigel Cunningham <nigel@nigel.suspend2.net> Cc: Pavel Machek <pavel@ucw.cz> Cc: Oleg Nesterov <oleg@tv-sign.ru> Cc: Gautham R Shenoy <ego@in.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* Input: serio - take drv_mutex in serio_cleanup()Dmitry Torokhov2007-06-291-0/+2
| | | | | | | | | | | We need to take serio->drv_mutex in serio_cleanup() to prevent the function from being called while driver is in the middle of attaching to a serio port. Such situation can happen with i8042 and atkbd drivers if user rapidly presses Ctrl-Alt-Del during system startup, and leads to kernel oops. Reported-by: Dave Young <hidave.darkstar@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - do not touch bus's rwsemDmitry Torokhov2007-04-271-26/+15
| | | | | | | | | The subsystem rwsem is not used by the driver core at all, so there is no point in trying to access it. Signed-off-by: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* Input: i8042 - let serio bus suspend portsDmitry Torokhov2007-02-181-1/+35
| | | | | | | Let serio subsystem take care of suspending the ports; concentrate on suspending/resuming the controller itself. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* SERIO: add the sysfs driver name to all modulesGreg Kroah-Hartman2007-02-071-2/+4
| | | | | | | | | This adds the module name to all SERIO drivers, if they are built into the kernel or not. It will show up in /sys/modules/MODULE_NAME/drivers/ Cc: Kay Sievers <kay.sievers@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6Dmitry Torokhov2006-12-081-0/+1
|\ | | | | | | | | | | Conflicts: drivers/usb/input/hid.h
| * [PATCH] Add include/linux/freezer.h and move definitions from sched.hNigel Cunningham2006-12-071-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | Move process freezing functions from include/linux/sched.h to freezer.h, so that modifications to the freezer or the kernel configuration don't require recompiling just about everything. [akpm@osdl.org: fix ueagle driver] Signed-off-by: Nigel Cunningham <nigel@suspend2.net> Cc: "Rafael J. Wysocki" <rjw@sisk.pl> Cc: Pavel Machek <pavel@ucw.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
* | Input: serio - make serio_register_driver() return errorsDmitry Torokhov2006-11-231-33/+74
| | | | | | | | | | | | | | | | | | | | | | | | Perform actual driver registration right in serio_register_driver() instead of offloading it to kseriod and return proper error code to callers if driver registration fails. Note that driver <-> port matching is still done by kseriod to speed up boot process since probing for PS/2 mice and keyboards is pretty slow. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - remove serio_unregister_port_delayed()Dmitry Torokhov2006-11-171-18/+0
| | | | | | | | | | | | | | Now that i8042 reserves IRQs early there are no more users of this function and it should be removed. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* | Input: serio - rearrange serio_bus initializationMarton Nemeth2006-11-021-11/+11
|/ | | | | | | | Initialize serio_bus structure at compile time instead of at runtime in serio_init(). Signed-off-by: Marton Nemeth <nm127@freemail.hu> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio core - handle errors returned by device_bind_driver()Dmitry Torokhov2006-10-121-2/+14
| | | | Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - add lockdep annotationsJiri Kosina2006-10-111-1/+5
| | | | | | Signed-off-by: Jiri Kosina <jikos@jikos.cz> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* IRQ: Maintain regs pointer globally rather than passing to IRQ handlersDavid Howells2006-10-051-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Maintain a per-CPU global "struct pt_regs *" variable which can be used instead of passing regs around manually through all ~1800 interrupt handlers in the Linux kernel. The regs pointer is used in few places, but it potentially costs both stack space and code to pass it around. On the FRV arch, removing the regs parameter from all the genirq function results in a 20% speed up of the IRQ exit path (ie: from leaving timer_interrupt() to leaving do_IRQ()). Where appropriate, an arch may override the generic storage facility and do something different with the variable. On FRV, for instance, the address is maintained in GR28 at all times inside the kernel as part of general exception handling. Having looked over the code, it appears that the parameter may be handed down through up to twenty or so layers of functions. Consider a USB character device attached to a USB hub, attached to a USB controller that posts its interrupts through a cascaded auxiliary interrupt controller. A character device driver may want to pass regs to the sysrq handler through the input layer which adds another few layers of parameter passing. I've build this code with allyesconfig for x86_64 and i386. I've runtested the main part of the code on FRV and i386, though I can't test most of the drivers. I've also done partial conversion for powerpc and MIPS - these at least compile with minimal configurations. This will affect all archs. Mostly the changes should be relatively easy. Take do_IRQ(), store the regs pointer at the beginning, saving the old one: struct pt_regs *old_regs = set_irq_regs(regs); And put the old one back at the end: set_irq_regs(old_regs); Don't pass regs through to generic_handle_irq() or __do_IRQ(). In timer_interrupt(), this sort of change will be necessary: - update_process_times(user_mode(regs)); - profile_tick(CPU_PROFILING, regs); + update_process_times(user_mode(get_irq_regs())); + profile_tick(CPU_PROFILING); I'd like to move update_process_times()'s use of get_irq_regs() into itself, except that i386, alone of the archs, uses something other than user_mode(). Some notes on the interrupt handling in the drivers: (*) input_dev() is now gone entirely. The regs pointer is no longer stored in the input_dev struct. (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does something different depending on whether it's been supplied with a regs pointer or not. (*) Various IRQ handler function pointers have been moved to type irq_handler_t. Signed-Off-By: David Howells <dhowells@redhat.com> (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
* Input: serio/gameport - check whether driver core calls succeededRandy Dunlap2006-07-191-14/+51
| | | | | Signed-off-by: Randy Dunlap <rdunlap@xenotime.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - fix memory leakAdrian Bunk2006-03-141-0/+1
| | | | | Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: initialize serio and gameport at subsystem levelDmitry Torokhov2006-02-191-1/+1
| | | | | | | | | Serio and gameport cores do not depend on other drivers and are used by code living outside of drivers/input/{gameport|serio}. Registering them at subsystem level guarantees that they are fully initialized before anyone tries to use them. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - semaphore to mutex conversionArjan van de Ven2006-02-191-22/+23
| | | | | | | | | | The conversion was generated via scripts, and the result was validated automatically via a script as well. Signed-off-by: Arjan van de Ven <arjan@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* [PATCH] Add serio bus_type probe and remove methodsRussell King2006-01-131-5/+7
| | | | | Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* [PATCH] driver core: replace "hotplug" by "uevent"Kay Sievers2006-01-041-11/+11
| | | | | | | | | Leave the overloaded "hotplug" word to susbsystems which are handling real devices. The driver core does not "plug" anything, it just exports the state to userspace and generates events. Signed-off-by: Kay Sievers <kay.sievers@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
* Input: make serio and gameport more swsusp friendlyDmitry Torokhov2005-11-201-3/+9
| | | | | | | | | kseriod and kgameportd used to process all pending events before checking for freeze condition. This may cause swsusp to time out while stopping tasks when resuming. Switch to process events one by one to check freeze status more often. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Input: serio - add modalias attribute and environment variable toDmitry Torokhov2005-06-301-16/+26
| | | | | | simplify hotplug scripts. Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
* Commit the manual part of the input layer merge.Linus Torvalds2005-06-271-27/+62
| | | | | | | git did actually warn me about the fact that I hadn't actually done an "update-cache" on these two files, but the warning was at the bottom of a list of all the files that _did_ change in the merge, so I never noticed. My bad.
* [PATCH] Cleanup patch for process freezingChristoph Lameter2005-06-251-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. Establish a simple API for process freezing defined in linux/include/sched.h: frozen(process) Check for frozen process freezing(process) Check if a process is being frozen freeze(process) Tell a process to freeze (go to refrigerator) thaw_process(process) Restart process frozen_process(process) Process is frozen now 2. Remove all references to PF_FREEZE and PF_FROZEN from all kernel sources except sched.h 3. Fix numerous locations where try_to_freeze is manually done by a driver 4. Remove the argument that is no longer necessary from two function calls. 5. Some whitespace cleanup 6. Clear potential race in refrigerator (provides an open window of PF_FREEZE cleared before setting PF_FROZEN, recalc_sigpending does not check PF_FROZEN). This patch does not address the problem of freeze_processes() violating the rule that a task may only modify its own flags by setting PF_FREEZE. This is not clean in an SMP environment. freeze(process) is therefore not SMP safe! Signed-off-by: Christoph Lameter <christoph@lameter.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
* [PATCH] Driver Core: drivers/i2c/chips/w83781d.c - ↵Yani Ioannou2005-06-201-8/+8
| | | | | | | drivers/s390/block/dcssblk.c: update device attribute callbacks Signed-off-by: Yani Ioannou <yani.ioannou@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
OpenPOWER on IntegriCloud