summaryrefslogtreecommitdiffstats
path: root/drivers/leds (follow)
Commit message (Collapse)AuthorAgeFilesLines
* leds: leds-ns2: use devm_gpio_request_oneSachin Kamat2012-11-271-12/+5
| | | | | | | | | devm_gpio_request_one is device managed and makes error handling and cleanup simpler. Cc: Simon Guinot <sguinot@lacie.com> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-lt3593: use devm_gpio_request_oneSachin Kamat2012-11-271-8/+3
| | | | | | | | | devm_gpio_request_one is device managed and makes error handling and cleanup simpler. Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Acked-by: Daniel Mack <daniel@caiaq.de> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-gpio: use devm_gpio_request_oneSachin Kamat2012-11-271-6/+2
| | | | | | | | | | devm_gpio_request_one is device managed and makes error handling and cleanup simpler. Cc: Raphael Assenat <raph@8d.com> Cc: Trent Piepho <tpiepho@freescale.com> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lp3944: Fix return valueSachin Kamat2012-11-261-1/+1
| | | | | | | | | | Return the value obtained from i2c_smbus_read_byte_data() instead of -EINVAL. Silences the following smatch warning: drivers/leds/leds-lp3944.c:89 lp3944_reg_read() info: why not propagate 'tmp' from i2c_smbus_read_byte_data() instead of -22? Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lp5523: Fix return valueSachin Kamat2012-11-261-1/+1
| | | | | | | | | | Return the value obtained from i2c_smbus_read_byte_data() instead of -EIO. Silences the following smatch warning: drivers/leds/leds-lp5523.c:174 lp5523_read() info: why not propagate 'ret' from i2c_smbus_read_byte_data() instead of -5? Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lp5521: Fix return valueSachin Kamat2012-11-261-1/+1
| | | | | | | | | | Return the value obtained from i2c_smbus_read_byte_data() instead of -EIO. Silences the following smatch warning: drivers/leds/leds-lp5521.c:155 lp5521_read() info: why not propagate 'ret' from i2c_smbus_read_byte_data() instead of -5? Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-lp5523: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-lp5521: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: add led_trigger_rename functionFabio Baltieri2012-11-261-0/+13
| | | | | | | | | | | | Implements a "led_trigger_rename" function to rename a trigger with proper locking. This assumes that led name was originally allocated in non-constant storage. Signed-off-by: Fabio Baltieri <fabio.baltieri@gmail.com> Cc: Kurt Van Dijck <kurt.van.dijck@eia.be> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lm3642: Fix up world writable sysfs filesAxel Lin2012-11-261-2/+2
| | | | | | | | | We don't need these sysfs files to be world writable or group writable. These files are write-only, change them to S_IWUSR (0200). Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lm355x: Fix up world writable sysfs fileAxel Lin2012-11-261-1/+1
| | | | | | | | | We don't need the sysfs file to be world writable or group writable. This file is write-only, change it to S_IWUSR (0200). Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-88pm860x: drop devm_kfree of devm_kzalloc'd dataJingoo Han2012-11-261-7/+2
| | | | | | | | | The devm_kfree function allocates memory that is released when a driver detaches. Thus, there is no reason to explicitly call devm_kfree in probe or remove functions. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-lp5523: fix build warningsJingoo Han2012-11-261-3/+17
| | | | | | | | | | | | | | | | | This patch fixes build warnings as below: drivers/leds/leds-lp5523.c: In function 'lp5523_selftest': drivers/leds/leds-lp5523.c:496:18: warning: 'adc' may be used uninitialized in this function [-Wuninitialized] drivers/leds/leds-lp5523.c:471:5: warning: 'vdd' may be used uninitialized in this function [-Wuninitialized] drivers/leds/leds-lp5523.c: In function 'lp5523_probe': drivers/leds/leds-lp5523.c:252:9: warning: 'status' may be used uninitialized in this function [-Wuninitialized] drivers/leds/leds-lp5523.c:201:5: note: 'status' was declared here If lp5523_read() returns an error, problems will happen. Thus, when lp5523_read() returns an error, it should be handled. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-gpio: Defer probing in case of deferred gpio probingRoland Stigge2012-11-261-6/+11
| | | | | | | | | | This patch makes leds-gpio's probe() return -EPROBE_DEFER if any of the gpios to register are deferred themselves. This makes a change of gpio_leds_create_of()'s return value necessary: Instead of returning NULL on error, we now use ERR_PTR() error coding. Signed-off-by: Roland Stigge <stigge@antcom.de> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: ledtrig-gpio: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: ledtrig-backlight: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-ss4200: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-ns2: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-netxbig: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-1/+1
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-bd2802: replace strict_strtoul() with kstrtoul()Jingoo Han2012-11-261-2/+2
| | | | | | | | | The usage of strict_strtoul() is not preferred, because strict_strtoul() is obsolete. Thus, kstrtoul() should be used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: renesas: use devm_ functionsJingoo Han2012-11-261-11/+6
| | | | | | | | The devm_ functions allocate memory that is released when a driver detaches. This makes the code smaller and a bit simpler. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-cobalt-qube: use devm_ioremapJingoo Han2012-11-261-7/+4
| | | | | | | | The devm_ functions allocate memory that is released when a driver detaches. This patch uses devm_ioremap() for these functions. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-cobalt-raq: use devm_ioremapJingoo Han2012-11-261-7/+4
| | | | | | | | The devm_ functions allocate memory that is released when a driver detaches. This patch uses devm_ioremap() for these functions. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-fsg: use devm_ioremapJingoo Han2012-11-261-10/+5
| | | | | | | | The devm_ functions allocate memory that is released when a driver detaches. This patch uses devm_ioremap() for these functions. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: renesas: use gpio_request_oneJingoo Han2012-11-261-4/+4
| | | | | | | | Using gpio_request_one can make the code simpler because it can set the direction and initial value in one shot. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-ns2: use gpio_request_oneJingoo Han2012-11-261-14/+7
| | | | | | | | Using gpio_request_one can make the code simpler because it can set the direction and initial value in one shot. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-lt3593: use gpio_request_oneJingoo Han2012-11-261-6/+3
| | | | | | | | Using gpio_request_one can make the code simpler because it can set the direction and initial value in one shot. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: leds-gpio: use gpio_request_oneJingoo Han2012-11-261-7/+5
| | | | | | | | Using gpio_request_one can make the code simpler because it can set the direction and initial value in one shot. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lm355x: Return proper error for lm3556_indicator_pattern_store error pathAxel Lin2012-11-261-1/+1
| | | | | | Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* leds: lm3642: Return proper error in lm3642_[torch|strobe]_pin_store error pathsAxel Lin2012-11-261-4/+4
| | | | | | Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
* ledtrig-cpu: kill useless mutex to fix sleep in atomic contextNathan Lynch2012-11-111-21/+0
| | | | | | | | | | | | | | | | | | | | | | | Seeing the following every time the CPU enters or leaves idle on a Beagleboard: BUG: sleeping function called from invalid context at kernel/mutex.c:269 in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper/0 no locks held by swapper/0/0. [<c001659c>] (unwind_backtrace+0x0/0xf8) from [<c05aaa7c>] (mutex_lock_nested+0x24/0x380) [<c05aaa7c>] (mutex_lock_nested+0x24/0x380) from [<c043bd1c>] (ledtrig_cpu+0x38/0x88) [<c043bd1c>] (ledtrig_cpu+0x38/0x88) from [<c000f4b0>] (cpu_idle+0xf4/0x120) [<c000f4b0>] (cpu_idle+0xf4/0x120) from [<c07e47c8>] (start_kernel+0x2bc/0x30c) Miles Lane has reported seeing similar splats during system suspend. The mutex in struct led_trigger_cpu appears to have no function: it resides in a per-cpu data structure which never changes after the trigger is registered. So just remove it. Reported-by: Miles Lane <miles.lane@gmail.com> Signed-off-by: Nathan Lynch <ntl@pobox.com> Signed-off-by: Bryan Wu <roc@roc-samos.(none)>
* Merge branch 'for-next' of ↵Linus Torvalds2012-10-1015-605/+1188
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds Pull LED subsystem update from Bryan Wu. * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds: (24 commits) leds: add output driver configuration for pca9633 led driver leds: lm3642: Use regmap_update_bits() in lm3642_chip_init() leds: Add new LED driver for lm3642 chips leds-lp5523: Fix riskiness of the page fault leds-lp5523: turn off the LED engines on unloading the driver leds-lm3530: Fix smatch warnings leds-lm3530: Use devm_regulator_get function leds: leds-gpio: adopt pinctrl support leds: Add new LED driver for lm355x chips leds-lp5523: use the i2c device id rather than fixed name leds-lp5523: add new device id for LP55231 leds-lp5523: support new LP55231 device leds: triggers: send uevent when changing triggers leds-lp5523: minor code style fixes leds-lp5523: change the return type of lp5523_set_mode() leds-lp5523: set the brightness to 0 forcely on removing the driver leds-lp5523: add channel name in the platform data leds: leds-gpio: Use of_get_child_count() helper leds: leds-gpio: Use platform_{get,set}_drvdata leds: leds-gpio: use of_match_ptr() ...
| * leds: add output driver configuration for pca9633 led driverPeter Meerwald2012-09-241-7/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | the pca9633 leds driver can be used in open-drain or totem pole (a.k.a. push/pull) output driver mode; default is the later the patch allows to set the output driver mode using platform data (similar to configuration inferface provided by the tca6507 led driver) v2: move leds-pca9633.h to include/linux/platform_data/ (Bryan Wu) Signed-off-by: Peter Meerwald <p.meerwald@bct-electronic.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: lm3642: Use regmap_update_bits() in lm3642_chip_init()Axel Lin2012-09-241-12/+3
| | | | | | | | | | | | | | | | | | | | Use regmap_update_bits() to replace regmap_read() + regmap_write(). With this patch, we only show the error message when regmap_update_bits() fails. Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: G.Shark Jeong<gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: Add new LED driver for lm3642 chipsG.Shark Jeong2012-09-133-0/+483
| | | | | | | | | | | | | | | | | | | | | | | | | | This driver is a general version for LM642 led chip of TI. LM3642 : The LM3642 is a 4MHz fixed-frequency synchronous boost converter plus 1.5A constant current driver for a high-current white LED. The LM3642 is controlled via an I2C-compatible interface. Signed-off-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: Fix riskiness of the page faultKim, Milo2012-09-131-0/+1
| | | | | | | | | | | | | | | | | | The last attribute should be terminated as NULL because any member of attribute structure is accessed while adding the sysfs file. If not, invalid address may cause the page fault problem. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: turn off the LED engines on unloading the driverKim, Milo2012-09-131-0/+3
| | | | | | | | | | | | | | | | | | | | | | The LP5523 has 3 engines which are used for running LED patterns. These engines should be off while unloading the driver. Obviously, LP5523 platform data are used for releasing the resource such like enable()/release_resource(), but these are not mandatory. Therefore this patch is required without the platform data dependency. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lm3530: Fix smatch warningsSachin Kamat2012-09-121-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes the following smatch warnings: drivers/leds/leds-lm3530.c:361 lm3530_mode_set() info: why not propagate 'mode' from lm3530_get_mode_from_str() instead of -22? drivers/leds/leds-lm3530.c:432 lm3530_probe() info: why not propagate 'err' from lm3530_init_registers() instead of -19? drivers/leds/leds-lm3530.c:438 lm3530_probe() info: why not propagate 'err' from led_classdev_register() instead of -19? Reported-by: Fengguang Wu <fengguang.wu@intel.com> Cc: Shreshtha Kumar SAHU <shreshthakumar.sahu@stericsson.com> Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lm3530: Use devm_regulator_get functionSachin Kamat2012-09-121-9/+3
| | | | | | | | | | | | | | | | Device managed functions are already used in this file. Hence convert regulator_get() too to use it. Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: leds-gpio: adopt pinctrl supportAnilKumar Ch2012-09-111-0/+7
| | | | | | | | | | | | | | | | | | | | | | Adopt pinctrl support to leds-gpio driver based on leds-gpio device pointer, pinctrl driver configure SoC pins to GPIO mode according to definitions provided in .dts file. Signed-off-by: AnilKumar Ch <anilkumar@ti.com> Acked-by: Marek Vasut <marex@denx.de> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: Add new LED driver for lm355x chipsG.Shark Jeong2012-09-114-517/+577
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This driver is a general version for LM355x,lm3554 and lm3556,led chips of TI. LM3554 : The LM3554 is a 2 MHz fixed-frequency synchronous boost converter with 1.2A dual high side led drivers. Datasheet: www.ti.com/lit/ds/symlink/lm3554.pdf LM3556 : The LM3556 is a 4 MHz fixed-frequency synchronous boost converter plus 1.5A constant current driver for a high-current white LED. Datasheet: www.national.com/ds/LM/LM3556.pdf (bryan.wu@canonical.com: use flush_work() to replace flush_work_sync() which is deprecated) Signed-off-by: G.Shark Jeong <gshark.jeong@gmail.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: use the i2c device id rather than fixed nameKim, Milo2012-09-111-4/+6
| | | | | | | | | | | | | | | | | | | | LP5523 driver supports both LP5523 and LP55231. The i2c device id is one of the two - lp5523 or lp55231. So it's better to use matching i2c device id while enumerating the device and naming LED channels. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: add new device id for LP55231Kim, Milo2012-09-111-2/+8
| | | | | | | | | | | | | | | | To support LP55231 device, the device id is added. Additionally, the i2c driver name is changed from lp5523 to lp5523x. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: support new LP55231 deviceKim, Milo2012-09-111-3/+4
| | | | | | | | | | | | | | | | | | | | | | New TI LP55231 device has same I2C register layout as LP5523. Therefore, all of LED operations can be shared with the LP5523 driver. To support new LP55231 device explicitly, the device description is added in the configuration file. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: triggers: send uevent when changing triggersColin Cross2012-09-111-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some triggers create sysfs files when they are enabled. Send a uevent "change" notification whenever the trigger is changed to allow userspace processes such as udev to modify permissions on the new files. A change notification will also be sent during registration of led class devices or led triggers if the default trigger of an led class device is found. (bryan.wu@canonical.com: rename trigger to trig to fix the build error) Signed-off-by: Colin Cross <ccross@android.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: minor code style fixesKim, Milo2012-09-111-8/+7
| | | | | | | | | | | | | | | | | | (a) use LP5523_ENABLE rather than magic number 0x40 (b) use min_t() in lp5523_mux_parse() (c) skip while loop and just return if invalid command Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: change the return type of lp5523_set_mode()Kim, Milo2012-09-111-11/+13
| | | | | | | | | | | | | | | | | | | | The return value of this function is not handled any place, so make it as void type. And three if-statements are replaced with switch-statements. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: set the brightness to 0 forcely on removing the driverKim, Milo2012-09-111-2/+2
| | | | | | | | | | | | | | | | | | | | | | Turning off the brightness of each channel is required when removing the driver. So use flush_work() rather than cancel_work_sync() to execute remaining brightness works. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds-lp5523: add channel name in the platform dataKim, Milo2012-09-111-3/+7
| | | | | | | | | | | | | | | | The name of each led channel is configurable. If the name is NULL, just use the channel id for making the channel name Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>
| * leds: leds-gpio: Use of_get_child_count() helperTobias Klauser2012-09-111-3/+2
| | | | | | | | | | | | | | Use of_get_child_count() instead of custom implementation. Signed-off-by: Tobias Klauser <klto@zhaw.ch> Signed-off-by: Bryan Wu <bryan.wu@canonical.com>