/* * wm8510.h -- WM8510 Soc Audio driver * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef _WM8510_H #define _WM8510_H /* WM8510 register space */ #define WM8510_RESET 0x0 #define WM8510_POWER1 0x1 #define WM8510_POWER2 0x2 #define WM8510_POWER3 0x3 #define WM8510_IFACE 0x4 #define WM8510_COMP 0x5 #define WM8510_CLOCK 0x6 #define WM8510_ADD 0x7 #define WM8510_GPIO 0x8 #define WM8510_DAC 0xa #define WM8510_DACVOL 0xb #define WM8510_ADC 0xe #define WM8510_ADCVOL 0xf #define WM8510_EQ1 0x12 #define WM8510_EQ2 0x13 #define WM8510_EQ3 0x14 #define WM8510_EQ4 0x15 #define WM8510_EQ5 0x16 #define WM8510_DACLIM1 0x18 #define WM8510_DACLIM2 0x19 #define WM8510_NOTCH1 0x1b #define WM8510_NOTCH2 0x1c #define WM8510_NOTCH3 0x1d #define WM8510_NOTCH4 0x1e #define WM8510_ALC1 0x20 #define WM8510_ALC2 0x21 #define WM8510_ALC3 0x22 #define WM8510_NGATE 0x23 #define WM8510_PLLN 0x24 #define WM8510_PLLK1 0x25 #define WM8510_PLLK2 0x26 #define WM8510_PLLK3 0x27 #define WM8510_ATTEN 0x28 #define WM8510_INPUT 0x2c #define WM8510_INPPGA 0x2d #define WM8510_ADCBOOST 0x2f #define WM8510_OUTPUT 0x31 #define WM8510_SPKMIX 0x32 #define WM8510_SPKVOL 0x36 #define WM8510_MONOMIX 0x38 #define WM8510_CACHEREGNUM 57 /* Clock divider Id's */ #define WM8510_OPCLKDIV 0 #define WM8510_MCLKDIV 1 #define WM8510_ADCCLK 2 #define WM8510_DACCLK 3 #define WM8510_BCLKDIV 4 /* DAC clock dividers */ #define WM8510_DACCLK_F2 (1 << 3) #define WM8510_DACCLK_F4 (0 << 3) /* ADC clock dividers */ #define WM8510_ADCCLK_F2 (1 << 3) #define WM8510_ADCCLK_F4 (0 << 3) /* PLL Out dividers */ #define WM8510_OPCLKDIV_1 (0 << 4) #define WM8510_OPCLKDIV_2 (1 << 4) #define WM8510_OPCLKDIV_3 (2 << 4) #define WM8510_OPCLKDIV_4 (3 << 4) /* BCLK clock dividers */ #define WM8510_BCLKDIV_1 (0 << 2) #define WM8510_BCLKDIV_2 (1 << 2) #define WM8510_BCLKDIV_4 (2 << 2) #define WM8510_BCLKDIV_8 (3 << 2) #define WM8510_BCLKDIV_16 (4 << 2) #define WM8510_BCLKDIV_32 (5 << 2) /* MCLK clock dividers */ #define WM8510_MCLKDIV_1 (0 << 5) #define WM8510_MCLKDIV_1_5 (1 << 5) #define WM8510_MCLKDIV_2 (2 << 5) #define WM8510_MCLKDIV_3 (3 << 5) #define WM8510_MCLKDIV_4 (4 << 5) #define WM8510_MCLKDIV_6 (5 << 5) #define WM8510_MCLKDIV_8 (6 << 5) #define WM8510_MCLKDIV_12 (7 << 5) struct wm8510_setup_data { int spi; int i2c_bus; unsigned short i2c_address; }; #endif 0319aaebfec09e0144dc3341'/>
path: root/drivers/usb/misc/ucsi.c
diff options
context:
space:
mode:
authorDouglas Miller <dougmill@linux.vnet.ibm.com>2017-01-28 06:42:20 -0600
committerTejun Heo <tj@kernel.org>2017-01-28 07:49:42 -0500
commit966d2b04e070bc040319aaebfec09e0144dc3341 (patch)
tree4b96156e3d1dd4dfd6039b7c219c9dc4616da52d /drivers/usb/misc/ucsi.c
parent1b1bc42c1692e9b62756323c675a44cb1a1f9dbd (diff)
percpu-refcount: fix reference leak during percpu-atomic transition
percpu_ref_tryget() and percpu_ref_tryget_live() should return "true" IFF they acquire a reference. But the return value from atomic_long_inc_not_zero() is a long and may have high bits set, e.g. PERCPU_COUNT_BIAS, and the return value of the tryget routines is bool so the reference may actually be acquired but the routines return "false" which results in a reference leak since the caller assumes it does not need to do a corresponding percpu_ref_put(). This was seen when performing CPU hotplug during I/O, as hangs in blk_mq_freeze_queue_wait where percpu_ref_kill (blk_mq_freeze_queue_start) raced with percpu_ref_tryget (blk_mq_timeout_work). Sample stack trace: __switch_to+0x2c0/0x450 __schedule+0x2f8/0x970 schedule+0x48/0xc0 blk_mq_freeze_queue_wait+0x94/0x120 blk_mq_queue_reinit_work+0xb8/0x180 blk_mq_queue_reinit_prepare+0x84/0xa0 cpuhp_invoke_callback+0x17c/0x600 cpuhp_up_callbacks+0x58/0x150 _cpu_up+0xf0/0x1c0 do_cpu_up+0x120/0x150 cpu_subsys_online+0x64/0xe0 device_online+0xb4/0x120 online_store+0xb4/0xc0 dev_attr_store+0x68/0xa0 sysfs_kf_write+0x80/0xb0 kernfs_fop_write+0x17c/0x250 __vfs_write+0x6c/0x1e0 vfs_write+0xd0/0x270 SyS_write+0x6c/0x110 system_call+0x38/0xe0 Examination of the queue showed a single reference (no PERCPU_COUNT_BIAS, and __PERCPU_REF_DEAD, __PERCPU_REF_ATOMIC set) and no requests. However, conditions at the time of the race are count of PERCPU_COUNT_BIAS + 0 and __PERCPU_REF_DEAD and __PERCPU_REF_ATOMIC set. The fix is to make the tryget routines use an actual boolean internally instead of the atomic long result truncated to a int. Fixes: e625305b3907 percpu-refcount: make percpu_ref based on longs instead of ints Link: https://bugzilla.kernel.org/show_bug.cgi?id=190751 Signed-off-by: Douglas Miller <dougmill@linux.vnet.ibm.com> Reviewed-by: Jens Axboe <axboe@fb.com> Signed-off-by: Tejun Heo <tj@kernel.org> Fixes: e625305b3907 ("percpu-refcount: make percpu_ref based on longs instead of ints") Cc: stable@vger.kernel.org # v3.18+
Diffstat (limited to 'drivers/usb/misc/ucsi.c')