This is the 4.9.128 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAluitdUACgkQONu9yGCS
aT6k7g//fxvMjnxYwVZ6LQjFkBakhP4gU/unxKppIFb0Iti+LBpx3Fg5JbtpRM8y
oCAAMb9F5Dxl38691BqBpCdihmrGurh9EDn9ZZDsoUtipQ7UQozmGDbbc4fV0cQW
/2Fs7GjFp1XopOAvFp7z/Xn5Xi8fSxgWg6l6aQ5VzsUtK69FM4TmNPJ2x1adow+N
UsewbUkLkD9dMIrrgIajeCsErRYnJHy6FuY/pWSXVuY1gyTlCW/lsxKU2OoS5l5Z
u/ZxprWl7z6FjSfzHc4AYrBR6t2zCAV2DNZhX5lDU/EHzTAttq0sSaeEfWzqYrJM
q/bStS8eEWj+MkqfrppWRc1I/ZwUrjMB1P8OJEW8UUFTjAcRvlBz/Z1poOCRkBRp
flsohLfao2/dbPxT0oLQMidBRX9t90TQLxwGY2SJ2/dL6uU/sapQDo8/iwyCZvC6
u57DLf82P9tUvZgnUOoNuCPSqiZQG/tGPGFRGU0EgHVtoE7S285FvRJZoNlRH+oT
EyAHtavzbgsoJb0oP12eOBfq0dwvmXt6i7ypzPoy/Fh+zQTb5Fk1fH+4GF+gFqWY
//CpKO+zIdeFzWZ/r8eAkS+uLgvgywNbZV6N8EJYqviajKfU5A/RX5GsQ4oaFfk6
++Anyn58UYYSkw7ov5ynLNmNr+tlMjKUuRXw0u9rtAhcTQcnHYc=
=YQcR
-----END PGP SIGNATURE-----
Merge 4.9.128 into android-4.9
Changes in 4.9.128
i2c: xiic: Make the start and the byte count write atomic
i2c: i801: fix DNV's SMBCTRL register offset
KVM: s390: vsie: copy wrapping keys to right place
ALSA: hda - Fix cancel_work_sync() stall from jackpoll work
cfq: Give a chance for arming slice idle timer in case of group_idle
kthread: Fix use-after-free if kthread fork fails
kthread: fix boot hang (regression) on MIPS/OpenRISC
staging: rt5208: Fix a sleep-in-atomic bug in xd_copy_page
staging/rts5208: Fix read overflow in memcpy
IB/rxe: do not copy extra stack memory to skb
block,blkcg: use __GFP_NOWARN for best-effort allocations in blkcg
nl80211: fix null-ptr dereference on invalid mesh configuration
locking/rwsem-xadd: Fix missed wakeup due to reordering of load
selinux: use GFP_NOWAIT in the AVC kmem_caches
locking/osq_lock: Fix osq_lock queue corruption
mm, vmscan: clear PGDAT_WRITEBACK when zone is balanced
mm: remove seemingly spurious reclaimability check from laptop_mode gating
ARC: [plat-axs*]: Enable SWAP
misc: mic: SCIF Fix scif_get_new_port() error handling
ethtool: Remove trailing semicolon for static inline
Bluetooth: h5: Fix missing dependency on BT_HCIUART_SERDEV
gpio: tegra: Move driver registration to subsys_init level
net: phy: Fix the register offsets in Broadcom iProc mdio mux driver
scsi: target: fix __transport_register_session locking
md/raid5: fix data corruption of replacements after originals dropped
timers: Clear timer_base::must_forward_clk with timer_base::lock held
misc: ti-st: Fix memory leak in the error path of probe()
uio: potential double frees if __uio_register_device() fails
tty: rocket: Fix possible buffer overwrite on register_PCI
f2fs: do not set free of current section
perf tools: Allow overriding MAX_NR_CPUS at compile time
NFSv4.0 fix client reference leak in callback
macintosh/via-pmu: Add missing mmio accessors
ath9k: report tx status on EOSP
ath9k_hw: fix channel maximum power level test
ath10k: prevent active scans on potential unusable channels
wlcore: Set rx_status boottime_ns field on rx
MIPS: Fix ISA virt/bus conversion for non-zero PHYS_OFFSET
ata: libahci: Correct setting of DEVSLP register
scsi: 3ware: fix return 0 on the error path of probe
ath10k: disable bundle mgmt tx completion event support
Bluetooth: hidp: Fix handling of strncpy for hid->name information
x86/mm: Remove in_nmi() warning from vmalloc_fault()
gpio: ml-ioh: Fix buffer underwrite on probe error path
net: mvneta: fix mtu change on port without link
f2fs: try grabbing node page lock aggressively in sync scenario
f2fs: fix to skip GC if type in SSA and SIT is inconsistent
tpm_tis_spi: Pass the SPI IRQ down to the driver
tpm/tpm_i2c_infineon: switch to i2c_lock_bus(..., I2C_LOCK_SEGMENT)
f2fs: fix to do sanity check with reserved blkaddr of inline inode
MIPS: Octeon: add missing of_node_put()
MIPS: generic: fix missing of_node_put()
net: dcb: For wild-card lookups, use priority -1, not 0
Input: atmel_mxt_ts - only use first T9 instance
media: s5p-mfc: Fix buffer look up in s5p_mfc_handle_frame_{new, copy_time} functions
partitions/aix: append null character to print data from disk
partitions/aix: fix usage of uninitialized lv_info and lvname structures
media: helene: fix xtal frequency setting at power on
f2fs: Fix uninitialized return in f2fs_ioc_shutdown()
iommu/ipmmu-vmsa: Fix allocation in atomic context
mfd: ti_am335x_tscadc: Fix struct clk memory leak
f2fs: fix to do sanity check with {sit,nat}_ver_bitmap_bytesize
NFSv4.1: Fix a potential layoutget/layoutrecall deadlock
MIPS: WARN_ON invalid DMA cache maintenance, not BUG_ON
RDMA/cma: Do not ignore net namespace for unbound cm_id
xhci: Fix use-after-free in xhci_free_virt_device
netfilter: x_tables: avoid stack-out-of-bounds read in xt_copy_counters_from_user
mtd: ubi: wl: Fix error return code in ubi_wl_init()
autofs: fix autofs_sbi() does not check super block type
mm: get rid of vmacache_flush_all() entirely
Linux 4.9.128
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
ba01a4255d
81 changed files with 357 additions and 195 deletions
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 127
|
SUBLEVEL = 128
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Roaring Lionus
|
NAME = Roaring Lionus
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
|
|
||||||
|
|
@ -366,6 +366,7 @@ static int __init octeon_ehci_device_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pd = of_find_device_by_node(ehci_node);
|
pd = of_find_device_by_node(ehci_node);
|
||||||
|
of_node_put(ehci_node);
|
||||||
if (!pd)
|
if (!pd)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -428,6 +429,7 @@ static int __init octeon_ohci_device_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pd = of_find_device_by_node(ohci_node);
|
pd = of_find_device_by_node(ohci_node);
|
||||||
|
of_node_put(ohci_node);
|
||||||
if (!pd)
|
if (!pd)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -159,6 +159,7 @@ void __init arch_init_irq(void)
|
||||||
"mti,cpu-interrupt-controller");
|
"mti,cpu-interrupt-controller");
|
||||||
if (!cpu_has_veic && !intc_node)
|
if (!cpu_has_veic && !intc_node)
|
||||||
mips_cpu_irq_init();
|
mips_cpu_irq_init();
|
||||||
|
of_node_put(intc_node);
|
||||||
|
|
||||||
irqchip_init();
|
irqchip_init();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -141,14 +141,14 @@ static inline void * phys_to_virt(unsigned long address)
|
||||||
/*
|
/*
|
||||||
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
||||||
*/
|
*/
|
||||||
static inline unsigned long isa_virt_to_bus(volatile void * address)
|
static inline unsigned long isa_virt_to_bus(volatile void *address)
|
||||||
{
|
{
|
||||||
return (unsigned long)address - PAGE_OFFSET;
|
return virt_to_phys(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void * isa_bus_to_virt(unsigned long address)
|
static inline void *isa_bus_to_virt(unsigned long address)
|
||||||
{
|
{
|
||||||
return (void *)(address + PAGE_OFFSET);
|
return phys_to_virt(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define isa_page_to_bus page_to_phys
|
#define isa_page_to_bus page_to_phys
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||||
struct thread_info *ti = task_thread_info(p);
|
struct thread_info *ti = task_thread_info(p);
|
||||||
struct pt_regs *childregs, *regs = current_pt_regs();
|
struct pt_regs *childregs, *regs = current_pt_regs();
|
||||||
unsigned long childksp;
|
unsigned long childksp;
|
||||||
p->set_child_tid = p->clear_child_tid = NULL;
|
|
||||||
|
|
||||||
childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32;
|
childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -835,7 +835,8 @@ static void r4k_flush_icache_user_range(unsigned long start, unsigned long end)
|
||||||
static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
|
static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
|
||||||
{
|
{
|
||||||
/* Catch bad driver code */
|
/* Catch bad driver code */
|
||||||
BUG_ON(size == 0);
|
if (WARN_ON(size == 0))
|
||||||
|
return;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
if (cpu_has_inclusive_pcaches) {
|
if (cpu_has_inclusive_pcaches) {
|
||||||
|
|
@ -871,7 +872,8 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
|
||||||
static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
|
static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
|
||||||
{
|
{
|
||||||
/* Catch bad driver code */
|
/* Catch bad driver code */
|
||||||
BUG_ON(size == 0);
|
if (WARN_ON(size == 0))
|
||||||
|
return;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
if (cpu_has_inclusive_pcaches) {
|
if (cpu_has_inclusive_pcaches) {
|
||||||
|
|
|
||||||
|
|
@ -152,8 +152,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||||
|
|
||||||
top_of_kernel_stack = sp;
|
top_of_kernel_stack = sp;
|
||||||
|
|
||||||
p->set_child_tid = p->clear_child_tid = NULL;
|
|
||||||
|
|
||||||
/* Locate userspace context on stack... */
|
/* Locate userspace context on stack... */
|
||||||
sp -= STACK_FRAME_OVERHEAD; /* redzone */
|
sp -= STACK_FRAME_OVERHEAD; /* redzone */
|
||||||
sp -= sizeof(struct pt_regs);
|
sp -= sizeof(struct pt_regs);
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,8 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
||||||
return set_validity_icpt(scb_s, 0x0039U);
|
return set_validity_icpt(scb_s, 0x0039U);
|
||||||
|
|
||||||
/* copy only the wrapping keys */
|
/* copy only the wrapping keys */
|
||||||
if (read_guest_real(vcpu, crycb_addr + 72, &vsie_page->crycb, 56))
|
if (read_guest_real(vcpu, crycb_addr + 72,
|
||||||
|
vsie_page->crycb.dea_wrapping_key_mask, 56))
|
||||||
return set_validity_icpt(scb_s, 0x0035U);
|
return set_validity_icpt(scb_s, 0x0035U);
|
||||||
|
|
||||||
scb_s->ecb3 |= ecb3_flags;
|
scb_s->ecb3 |= ecb3_flags;
|
||||||
|
|
|
||||||
|
|
@ -330,8 +330,6 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||||
if (!(address >= VMALLOC_START && address < VMALLOC_END))
|
if (!(address >= VMALLOC_START && address < VMALLOC_END))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
WARN_ON_ONCE(in_nmi());
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Synchronize this task's top level page-table
|
* Synchronize this task's top level page-table
|
||||||
* with the 'reference' page table.
|
* with the 'reference' page table.
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,8 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg,
|
||||||
}
|
}
|
||||||
|
|
||||||
wb_congested = wb_congested_get_create(&q->backing_dev_info,
|
wb_congested = wb_congested_get_create(&q->backing_dev_info,
|
||||||
blkcg->css.id, GFP_NOWAIT);
|
blkcg->css.id,
|
||||||
|
GFP_NOWAIT | __GFP_NOWARN);
|
||||||
if (!wb_congested) {
|
if (!wb_congested) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_put_css;
|
goto err_put_css;
|
||||||
|
|
@ -193,7 +194,7 @@ static struct blkcg_gq *blkg_create(struct blkcg *blkcg,
|
||||||
|
|
||||||
/* allocate */
|
/* allocate */
|
||||||
if (!new_blkg) {
|
if (!new_blkg) {
|
||||||
new_blkg = blkg_alloc(blkcg, q, GFP_NOWAIT);
|
new_blkg = blkg_alloc(blkcg, q, GFP_NOWAIT | __GFP_NOWARN);
|
||||||
if (unlikely(!new_blkg)) {
|
if (unlikely(!new_blkg)) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_put_congested;
|
goto err_put_congested;
|
||||||
|
|
@ -1022,7 +1023,7 @@ blkcg_css_alloc(struct cgroup_subsys_state *parent_css)
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_init(&blkcg->lock);
|
spin_lock_init(&blkcg->lock);
|
||||||
INIT_RADIX_TREE(&blkcg->blkg_tree, GFP_NOWAIT);
|
INIT_RADIX_TREE(&blkcg->blkg_tree, GFP_NOWAIT | __GFP_NOWARN);
|
||||||
INIT_HLIST_HEAD(&blkcg->blkg_list);
|
INIT_HLIST_HEAD(&blkcg->blkg_list);
|
||||||
#ifdef CONFIG_CGROUP_WRITEBACK
|
#ifdef CONFIG_CGROUP_WRITEBACK
|
||||||
INIT_LIST_HEAD(&blkcg->cgwb_list);
|
INIT_LIST_HEAD(&blkcg->cgwb_list);
|
||||||
|
|
@ -1238,7 +1239,7 @@ pd_prealloc:
|
||||||
if (blkg->pd[pol->plid])
|
if (blkg->pd[pol->plid])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pd = pol->pd_alloc_fn(GFP_NOWAIT, q->node);
|
pd = pol->pd_alloc_fn(GFP_NOWAIT | __GFP_NOWARN, q->node);
|
||||||
if (!pd)
|
if (!pd)
|
||||||
swap(pd, pd_prealloc);
|
swap(pd, pd_prealloc);
|
||||||
if (!pd) {
|
if (!pd) {
|
||||||
|
|
|
||||||
|
|
@ -2951,7 +2951,8 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
|
||||||
* for devices that support queuing, otherwise we still have a problem
|
* for devices that support queuing, otherwise we still have a problem
|
||||||
* with sync vs async workloads.
|
* with sync vs async workloads.
|
||||||
*/
|
*/
|
||||||
if (blk_queue_nonrot(cfqd->queue) && cfqd->hw_tag)
|
if (blk_queue_nonrot(cfqd->queue) && cfqd->hw_tag &&
|
||||||
|
!cfqd->cfq_group_idle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
WARN_ON(!RB_EMPTY_ROOT(&cfqq->sort_list));
|
WARN_ON(!RB_EMPTY_ROOT(&cfqq->sort_list));
|
||||||
|
|
@ -3867,7 +3868,8 @@ cfq_get_queue(struct cfq_data *cfqd, bool is_sync, struct cfq_io_cq *cic,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
cfqq = kmem_cache_alloc_node(cfq_pool, GFP_NOWAIT | __GFP_ZERO,
|
cfqq = kmem_cache_alloc_node(cfq_pool,
|
||||||
|
GFP_NOWAIT | __GFP_ZERO | __GFP_NOWARN,
|
||||||
cfqd->queue->node);
|
cfqd->queue->node);
|
||||||
if (!cfqq) {
|
if (!cfqq) {
|
||||||
cfqq = &cfqd->oom_cfqq;
|
cfqq = &cfqd->oom_cfqq;
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ int aix_partition(struct parsed_partitions *state)
|
||||||
u32 vgda_sector = 0;
|
u32 vgda_sector = 0;
|
||||||
u32 vgda_len = 0;
|
u32 vgda_len = 0;
|
||||||
int numlvs = 0;
|
int numlvs = 0;
|
||||||
struct pvd *pvd;
|
struct pvd *pvd = NULL;
|
||||||
struct lv_info {
|
struct lv_info {
|
||||||
unsigned short pps_per_lv;
|
unsigned short pps_per_lv;
|
||||||
unsigned short pps_found;
|
unsigned short pps_found;
|
||||||
|
|
@ -231,10 +231,11 @@ int aix_partition(struct parsed_partitions *state)
|
||||||
if (lvip[i].pps_per_lv)
|
if (lvip[i].pps_per_lv)
|
||||||
foundlvs += 1;
|
foundlvs += 1;
|
||||||
}
|
}
|
||||||
|
/* pvd loops depend on n[].name and lvip[].pps_per_lv */
|
||||||
|
pvd = alloc_pvd(state, vgda_sector + 17);
|
||||||
}
|
}
|
||||||
put_dev_sector(sect);
|
put_dev_sector(sect);
|
||||||
}
|
}
|
||||||
pvd = alloc_pvd(state, vgda_sector + 17);
|
|
||||||
if (pvd) {
|
if (pvd) {
|
||||||
int numpps = be16_to_cpu(pvd->pp_count);
|
int numpps = be16_to_cpu(pvd->pp_count);
|
||||||
int psn_part1 = be32_to_cpu(pvd->psn_part1);
|
int psn_part1 = be32_to_cpu(pvd->psn_part1);
|
||||||
|
|
@ -281,10 +282,14 @@ int aix_partition(struct parsed_partitions *state)
|
||||||
next_lp_ix += 1;
|
next_lp_ix += 1;
|
||||||
}
|
}
|
||||||
for (i = 0; i < state->limit; i += 1)
|
for (i = 0; i < state->limit; i += 1)
|
||||||
if (lvip[i].pps_found && !lvip[i].lv_is_contiguous)
|
if (lvip[i].pps_found && !lvip[i].lv_is_contiguous) {
|
||||||
|
char tmp[sizeof(n[i].name) + 1]; // null char
|
||||||
|
|
||||||
|
snprintf(tmp, sizeof(tmp), "%s", n[i].name);
|
||||||
pr_warn("partition %s (%u pp's found) is "
|
pr_warn("partition %s (%u pp's found) is "
|
||||||
"not contiguous\n",
|
"not contiguous\n",
|
||||||
n[i].name, lvip[i].pps_found);
|
tmp, lvip[i].pps_found);
|
||||||
|
}
|
||||||
kfree(pvd);
|
kfree(pvd);
|
||||||
}
|
}
|
||||||
kfree(n);
|
kfree(n);
|
||||||
|
|
|
||||||
|
|
@ -2132,6 +2132,8 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
|
||||||
deto = 20;
|
deto = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make dito, mdat, deto bits to 0s */
|
||||||
|
devslp &= ~GENMASK_ULL(24, 2);
|
||||||
devslp |= ((dito << PORT_DEVSLP_DITO_OFFSET) |
|
devslp |= ((dito << PORT_DEVSLP_DITO_OFFSET) |
|
||||||
(mdat << PORT_DEVSLP_MDAT_OFFSET) |
|
(mdat << PORT_DEVSLP_MDAT_OFFSET) |
|
||||||
(deto << PORT_DEVSLP_DETO_OFFSET) |
|
(deto << PORT_DEVSLP_DETO_OFFSET) |
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,7 @@ config BT_HCIUART_LL
|
||||||
config BT_HCIUART_3WIRE
|
config BT_HCIUART_3WIRE
|
||||||
bool "Three-wire UART (H5) protocol support"
|
bool "Three-wire UART (H5) protocol support"
|
||||||
depends on BT_HCIUART
|
depends on BT_HCIUART
|
||||||
|
depends on BT_HCIUART_SERDEV
|
||||||
help
|
help
|
||||||
The HCI Three-wire UART Transport Layer makes it possible to
|
The HCI Three-wire UART Transport Layer makes it possible to
|
||||||
user the Bluetooth HCI over a serial port interface. The HCI
|
user the Bluetooth HCI over a serial port interface. The HCI
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
|
||||||
/* Lock the adapter for the duration of the whole sequence. */
|
/* Lock the adapter for the duration of the whole sequence. */
|
||||||
if (!tpm_dev.client->adapter->algo->master_xfer)
|
if (!tpm_dev.client->adapter->algo->master_xfer)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
i2c_lock_adapter(tpm_dev.client->adapter);
|
i2c_lock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT);
|
||||||
|
|
||||||
if (tpm_dev.chip_type == SLB9645) {
|
if (tpm_dev.chip_type == SLB9645) {
|
||||||
/* use a combined read for newer chips
|
/* use a combined read for newer chips
|
||||||
|
|
@ -156,7 +156,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
i2c_unlock_adapter(tpm_dev.client->adapter);
|
i2c_unlock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT);
|
||||||
/* take care of 'guard time' */
|
/* take care of 'guard time' */
|
||||||
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
|
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
|
||||||
|
|
||||||
|
|
@ -188,7 +188,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
|
||||||
|
|
||||||
if (!tpm_dev.client->adapter->algo->master_xfer)
|
if (!tpm_dev.client->adapter->algo->master_xfer)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
i2c_lock_adapter(tpm_dev.client->adapter);
|
i2c_lock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT);
|
||||||
|
|
||||||
/* prepend the 'register address' to the buffer */
|
/* prepend the 'register address' to the buffer */
|
||||||
tpm_dev.buf[0] = addr;
|
tpm_dev.buf[0] = addr;
|
||||||
|
|
@ -207,7 +207,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
|
||||||
usleep_range(sleep_low, sleep_hi);
|
usleep_range(sleep_low, sleep_hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_unlock_adapter(tpm_dev.client->adapter);
|
i2c_unlock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT);
|
||||||
/* take care of 'guard time' */
|
/* take care of 'guard time' */
|
||||||
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
|
usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,7 @@ static const struct tpm_tis_phy_ops tpm_spi_phy_ops = {
|
||||||
static int tpm_tis_spi_probe(struct spi_device *dev)
|
static int tpm_tis_spi_probe(struct spi_device *dev)
|
||||||
{
|
{
|
||||||
struct tpm_tis_spi_phy *phy;
|
struct tpm_tis_spi_phy *phy;
|
||||||
|
int irq;
|
||||||
|
|
||||||
phy = devm_kzalloc(&dev->dev, sizeof(struct tpm_tis_spi_phy),
|
phy = devm_kzalloc(&dev->dev, sizeof(struct tpm_tis_spi_phy),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
@ -201,7 +202,13 @@ static int tpm_tis_spi_probe(struct spi_device *dev)
|
||||||
if (!phy->iobuf)
|
if (!phy->iobuf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
return tpm_tis_core_init(&dev->dev, &phy->priv, -1, &tpm_spi_phy_ops,
|
/* If the SPI device has an IRQ then use that */
|
||||||
|
if (dev->irq > 0)
|
||||||
|
irq = dev->irq;
|
||||||
|
else
|
||||||
|
irq = -1;
|
||||||
|
|
||||||
|
return tpm_tis_core_init(&dev->dev, &phy->priv, irq, &tpm_spi_phy_ops,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -495,9 +495,10 @@ err_irq_alloc_descs:
|
||||||
|
|
||||||
chip = chip_save;
|
chip = chip_save;
|
||||||
err_gpiochip_add:
|
err_gpiochip_add:
|
||||||
|
chip = chip_save;
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
chip--;
|
|
||||||
gpiochip_remove(&chip->gpio);
|
gpiochip_remove(&chip->gpio);
|
||||||
|
chip++;
|
||||||
}
|
}
|
||||||
kfree(chip_save);
|
kfree(chip_save);
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue