Merge tag 'char-misc-5.2-rc1-part1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 May 2019 20:33:31 +0000 (13:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 7 May 2019 20:33:31 +0000 (13:33 -0700)
Pull char/misc update part 1 from Greg KH:
 "This contains only a small number of bugfixes that would have gone to
  you for 5.1-rc8 if that had happened, but instead I let them sit in
  linux-next for an extra week just "to be sure".

  The "big" patch here is for hyper-v, fixing a bug in their sysfs files
  that could cause big problems. The others are all small fixes,
  resolving reported issues that showed up in 5.1-rcs, plus some odd
  'static' cleanups for the phy drivers that really should have waited
  for -rc1. Most of these are tagged for the stable trees, so 5.1 will
  pick them up.

  All of these have been in linux-next for a while, with no reported
  issues"

* tag 'char-misc-5.2-rc1-part1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  misc: rtsx: Fixed rts5260 power saving parameter and sd glitch
  binder: take read mode of mmap_sem in binder_alloc_free_page()
  intel_th: pci: Add Comet Lake support
  stm class: Fix channel bitmap on 32-bit systems
  stm class: Fix channel free in stm output free path
  phy: sun4i-usb: Make sure to disable PHY0 passby for peripheral mode
  phy: fix platform_no_drv_owner.cocci warnings
  phy: mapphone-mdm6600: add gpiolib dependency
  phy: ti: usb2: fix OMAP_CONTROL_PHY dependency
  phy: allwinner: allow compile testing
  phy: qcom-ufs: Make ufs_qcom_phy_disable_iface_clk static
  phy: rockchip-typec: Make usb3_pll_cfg and dp_pll_cfg static
  phy: phy-twl4030-usb: Fix cable state handling
  Drivers: hv: vmbus: Remove the undesired put_cpu_ptr() in hv_synic_cleanup()
  Drivers: hv: vmbus: Fix race condition with new ring_buffer_info mutex
  Drivers: hv: vmbus: Set ring_info field to 0 and remove memset
  Drivers: hv: vmbus: Refactor chan->state if statement
  Drivers: hv: vmbus: Expose monitor data only when monitor pages are used

19 files changed:
Documentation/ABI/stable/sysfs-bus-vmbus
drivers/android/binder_alloc.c
drivers/hv/channel_mgmt.c
drivers/hv/hv.c
drivers/hv/hyperv_vmbus.h
drivers/hv/ring_buffer.c
drivers/hv/vmbus_drv.c
drivers/hwtracing/intel_th/pci.c
drivers/hwtracing/stm/core.c
drivers/misc/cardreader/rts5260.c
drivers/phy/allwinner/Kconfig
drivers/phy/allwinner/phy-sun4i-usb.c
drivers/phy/marvell/phy-mvebu-a3700-utmi.c
drivers/phy/motorola/Kconfig
drivers/phy/qualcomm/phy-qcom-ufs.c
drivers/phy/rockchip/phy-rockchip-typec.c
drivers/phy/ti/Kconfig
drivers/phy/ti/phy-twl4030-usb.c
include/linux/hyperv.h

index 826689dcc2e67370102d73eae9c359e9547df710..8e8d167eca3145c049e44a9d9b8b0bdbe17c6838 100644 (file)
@@ -81,7 +81,9 @@ What:         /sys/bus/vmbus/devices/<UUID>/channels/<N>/latency
 Date:          September. 2017
 KernelVersion: 4.14
 Contact:       Stephen Hemminger <sthemmin@microsoft.com>
-Description:   Channel signaling latency
+Description:   Channel signaling latency. This file is available only for
+               performance critical channels (storage, network, etc.) that use
+               the monitor page mechanism.
 Users:         Debugging tools
 
 What:          /sys/bus/vmbus/devices/<UUID>/channels/<N>/out_mask
@@ -95,7 +97,9 @@ What:         /sys/bus/vmbus/devices/<UUID>/channels/<N>/pending
 Date:          September. 2017
 KernelVersion: 4.14
 Contact:       Stephen Hemminger <sthemmin@microsoft.com>
-Description:   Channel interrupt pending state
+Description:   Channel interrupt pending state. This file is available only for
+               performance critical channels (storage, network, etc.) that use
+               the monitor page mechanism.
 Users:         Debugging tools
 
 What:          /sys/bus/vmbus/devices/<UUID>/channels/<N>/read_avail
@@ -137,7 +141,9 @@ What:               /sys/bus/vmbus/devices/<UUID>/channels/<N>/monitor_id
 Date:          January. 2018
 KernelVersion: 4.16
 Contact:       Stephen Hemminger <sthemmin@microsoft.com>
-Description:   Monitor bit associated with channel
+Description:   Monitor bit associated with channel. This file is available only
+               for performance critical channels (storage, network, etc.) that
+               use the monitor page mechanism.
 Users:         Debugging tools and userspace drivers
 
 What:          /sys/bus/vmbus/devices/<UUID>/channels/<N>/ring
index 195f120c4e8c9aefa9f6e57e8ce400a8ddde95fb..bb929eb8711659700e9839bafb2690fc464d27dd 100644 (file)
@@ -931,8 +931,8 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
        mm = alloc->vma_vm_mm;
        if (!mmget_not_zero(mm))
                goto err_mmget;
-       if (!down_write_trylock(&mm->mmap_sem))
-               goto err_down_write_mmap_sem_failed;
+       if (!down_read_trylock(&mm->mmap_sem))
+               goto err_down_read_mmap_sem_failed;
        vma = binder_alloc_get_vma(alloc);
 
        list_lru_isolate(lru, item);
@@ -945,7 +945,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
 
                trace_binder_unmap_user_end(alloc, index);
        }
-       up_write(&mm->mmap_sem);
+       up_read(&mm->mmap_sem);
        mmput(mm);
 
        trace_binder_unmap_kernel_start(alloc, index);
@@ -959,7 +959,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
        mutex_unlock(&alloc->mutex);
        return LRU_REMOVED_RETRY;
 
-err_down_write_mmap_sem_failed:
+err_down_read_mmap_sem_failed:
        mmput_async(mm);
 err_mmget:
 err_page_already_freed:
index 62703b354d6dfba9b63f0358c8972bd881397300..3fc0b247a8072ded05dd164a3b4fe1ee551854d7 100644 (file)
@@ -336,6 +336,8 @@ static struct vmbus_channel *alloc_channel(void)
        tasklet_init(&channel->callback_event,
                     vmbus_on_event, (unsigned long)channel);
 
+       hv_ringbuffer_pre_init(channel);
+
        return channel;
 }
 
@@ -345,6 +347,7 @@ static struct vmbus_channel *alloc_channel(void)
 static void free_channel(struct vmbus_channel *channel)
 {
        tasklet_kill(&channel->callback_event);
+       vmbus_remove_channel_attr_group(channel);
 
        kobject_put(&channel->kobj);
 }
index 632d25674e7feef8e8db91820ab22a63d6c80de9..45653029ee18fe8050932c94bb7cff29d75a61c3 100644 (file)
@@ -408,7 +408,6 @@ int hv_synic_cleanup(unsigned int cpu)
 
                clockevents_unbind_device(hv_cpu->clk_evt, cpu);
                hv_ce_shutdown(hv_cpu->clk_evt);
-               put_cpu_ptr(hv_cpu);
        }
 
        hv_get_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
index cb86b133eb4d945d6a1811362afc8923e666f6ef..e5467b821f415bbeb08c68919b393a37f21f5eae 100644 (file)
@@ -193,6 +193,7 @@ extern void hv_synic_clockevents_cleanup(void);
 
 /* Interface */
 
+void hv_ringbuffer_pre_init(struct vmbus_channel *channel);
 
 int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
                       struct page *pages, u32 pagecnt);
@@ -321,6 +322,8 @@ void vmbus_device_unregister(struct hv_device *device_obj);
 int vmbus_add_channel_kobj(struct hv_device *device_obj,
                           struct vmbus_channel *channel);
 
+void vmbus_remove_channel_attr_group(struct vmbus_channel *channel);
+
 struct vmbus_channel *relid2channel(u32 relid);
 
 void vmbus_free_channels(void);
index 9e8b31ccc14262a736f11109d6021c621d9d453e..121a01c43298fcdc8745b69dfcf97ac98790ef09 100644 (file)
@@ -166,14 +166,18 @@ hv_get_ringbuffer_availbytes(const struct hv_ring_buffer_info *rbi,
 }
 
 /* Get various debug metrics for the specified ring buffer. */
-int hv_ringbuffer_get_debuginfo(const struct hv_ring_buffer_info *ring_info,
+int hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info,
                                struct hv_ring_buffer_debug_info *debug_info)
 {
        u32 bytes_avail_towrite;
        u32 bytes_avail_toread;
 
-       if (!ring_info->ring_buffer)
+       mutex_lock(&ring_info->ring_buffer_mutex);
+
+       if (!ring_info->ring_buffer) {
+               mutex_unlock(&ring_info->ring_buffer_mutex);
                return -EINVAL;
+       }
 
        hv_get_ringbuffer_availbytes(ring_info,
                                     &bytes_avail_toread,
@@ -184,10 +188,19 @@ int hv_ringbuffer_get_debuginfo(const struct hv_ring_buffer_info *ring_info,
        debug_info->current_write_index = ring_info->ring_buffer->write_index;
        debug_info->current_interrupt_mask
                = ring_info->ring_buffer->interrupt_mask;
+       mutex_unlock(&ring_info->ring_buffer_mutex);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(hv_ringbuffer_get_debuginfo);
 
+/* Initialize a channel's ring buffer info mutex locks */
+void hv_ringbuffer_pre_init(struct vmbus_channel *channel)
+{
+       mutex_init(&channel->inbound.ring_buffer_mutex);
+       mutex_init(&channel->outbound.ring_buffer_mutex);
+}
+
 /* Initialize the ring buffer. */
 int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
                       struct page *pages, u32 page_cnt)
@@ -197,8 +210,6 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
 
        BUILD_BUG_ON((sizeof(struct hv_ring_buffer) != PAGE_SIZE));
 
-       memset(ring_info, 0, sizeof(struct hv_ring_buffer_info));
-
        /*
         * First page holds struct hv_ring_buffer, do wraparound mapping for
         * the rest.
@@ -232,6 +243,7 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
                reciprocal_value(ring_info->ring_size / 10);
        ring_info->ring_datasize = ring_info->ring_size -
                sizeof(struct hv_ring_buffer);
+       ring_info->priv_read_index = 0;
 
        spin_lock_init(&ring_info->ring_lock);
 
@@ -241,8 +253,10 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
 /* Cleanup the ring buffer. */
 void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info)
 {
+       mutex_lock(&ring_info->ring_buffer_mutex);
        vunmap(ring_info->ring_buffer);
        ring_info->ring_buffer = NULL;
+       mutex_unlock(&ring_info->ring_buffer_mutex);
 }
 
 /* Write to the ring buffer. */
index 000b53e5a17a55c8c20add4d1036cac250f40c80..aa25f3bcbdea4929d96bc54f98c6b7bfafd3f022 100644 (file)
@@ -630,7 +630,36 @@ static struct attribute *vmbus_dev_attrs[] = {
        &dev_attr_driver_override.attr,
        NULL,
 };
-ATTRIBUTE_GROUPS(vmbus_dev);
+
+/*
+ * Device-level attribute_group callback function. Returns the permission for
+ * each attribute, and returns 0 if an attribute is not visible.
+ */
+static umode_t vmbus_dev_attr_is_visible(struct kobject *kobj,
+                                        struct attribute *attr, int idx)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       const struct hv_device *hv_dev = device_to_hv_device(dev);
+
+       /* Hide the monitor attributes if the monitor mechanism is not used. */
+       if (!hv_dev->channel->offermsg.monitor_allocated &&
+           (attr == &dev_attr_monitor_id.attr ||
+            attr == &dev_attr_server_monitor_pending.attr ||
+            attr == &dev_attr_client_monitor_pending.attr ||
+            attr == &dev_attr_server_monitor_latency.attr ||
+            attr == &dev_attr_client_monitor_latency.attr ||
+            attr == &dev_attr_server_monitor_conn_id.attr ||
+            attr == &dev_attr_client_monitor_conn_id.attr))
+               return 0;
+
+       return attr->mode;
+}
+
+static const struct attribute_group vmbus_dev_group = {
+       .attrs = vmbus_dev_attrs,
+       .is_visible = vmbus_dev_attr_is_visible
+};
+__ATTRIBUTE_GROUPS(vmbus_dev);
 
 /*
  * vmbus_uevent - add uevent for our device
@@ -1381,7 +1410,7 @@ static void vmbus_chan_release(struct kobject *kobj)
 
 struct vmbus_chan_attribute {
        struct attribute attr;
-       ssize_t (*show)(const struct vmbus_channel *chan, char *buf);
+       ssize_t (*show)(struct vmbus_channel *chan, char *buf);
        ssize_t (*store)(struct vmbus_channel *chan,
                         const char *buf, size_t count);
 };
@@ -1400,15 +1429,12 @@ static ssize_t vmbus_chan_attr_show(struct kobject *kobj,
 {
        const struct vmbus_chan_attribute *attribute
                = container_of(attr, struct vmbus_chan_attribute, attr);
-       const struct vmbus_channel *chan
+       struct vmbus_channel *chan
                = container_of(kobj, struct vmbus_channel, kobj);
 
        if (!attribute->show)
                return -EIO;
 
-       if (chan->state != CHANNEL_OPENED_STATE)
-               return -EINVAL;
-
        return attribute->show(chan, buf);
 }
 
@@ -1416,45 +1442,81 @@ static const struct sysfs_ops vmbus_chan_sysfs_ops = {
        .show = vmbus_chan_attr_show,
 };
 
-static ssize_t out_mask_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t out_mask_show(struct vmbus_channel *channel, char *buf)
 {
-       const struct hv_ring_buffer_info *rbi = &channel->outbound;
+       struct hv_ring_buffer_info *rbi = &channel->outbound;
+       ssize_t ret;
+
+       mutex_lock(&rbi->ring_buffer_mutex);
+       if (!rbi->ring_buffer) {
+               mutex_unlock(&rbi->ring_buffer_mutex);
+               return -EINVAL;
+       }
 
-       return sprintf(buf, "%u\n", rbi->ring_buffer->interrupt_mask);
+       ret = sprintf(buf, "%u\n", rbi->ring_buffer->interrupt_mask);
+       mutex_unlock(&rbi->ring_buffer_mutex);
+       return ret;
 }
 static VMBUS_CHAN_ATTR_RO(out_mask);
 
-static ssize_t in_mask_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t in_mask_show(struct vmbus_channel *channel, char *buf)
 {
-       const struct hv_ring_buffer_info *rbi = &channel->inbound;
+       struct hv_ring_buffer_info *rbi = &channel->inbound;
+       ssize_t ret;
+
+       mutex_lock(&rbi->ring_buffer_mutex);
+       if (!rbi->ring_buffer) {
+               mutex_unlock(&rbi->ring_buffer_mutex);
+               return -EINVAL;
+       }
 
-       return sprintf(buf, "%u\n", rbi->ring_buffer->interrupt_mask);
+       ret = sprintf(buf, "%u\n", rbi->ring_buffer->interrupt_mask);
+       mutex_unlock(&rbi->ring_buffer_mutex);
+       return ret;
 }
 static VMBUS_CHAN_ATTR_RO(in_mask);
 
-static ssize_t read_avail_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t read_avail_show(struct vmbus_channel *channel, char *buf)
 {
-       const struct hv_ring_buffer_info *rbi = &channel->inbound;
+       struct hv_ring_buffer_info *rbi = &channel->inbound;
+       ssize_t ret;
+
+       mutex_lock(&rbi->ring_buffer_mutex);
+       if (!rbi->ring_buffer) {
+               mutex_unlock(&rbi->ring_buffer_mutex);
+               return -EINVAL;
+       }
 
-       return sprintf(buf, "%u\n", hv_get_bytes_to_read(rbi));
+       ret = sprintf(buf, "%u\n", hv_get_bytes_to_read(rbi));
+       mutex_unlock(&rbi->ring_buffer_mutex);
+       return ret;
 }
 static VMBUS_CHAN_ATTR_RO(read_avail);
 
-static ssize_t write_avail_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t write_avail_show(struct vmbus_channel *channel, char *buf)
 {
-       const struct hv_ring_buffer_info *rbi = &channel->outbound;
+       struct hv_ring_buffer_info *rbi = &channel->outbound;
+       ssize_t ret;
+
+       mutex_lock(&rbi->ring_buffer_mutex);
+       if (!rbi->ring_buffer) {
+               mutex_unlock(&rbi->ring_buffer_mutex);
+               return -EINVAL;
+       }
 
-       return sprintf(buf, "%u\n", hv_get_bytes_to_write(rbi));
+       ret = sprintf(buf, "%u\n", hv_get_bytes_to_write(rbi));
+       mutex_unlock(&rbi->ring_buffer_mutex);
+       return ret;
 }
 static VMBUS_CHAN_ATTR_RO(write_avail);
 
-static ssize_t show_target_cpu(const struct vmbus_channel *channel, char *buf)
+static ssize_t show_target_cpu(struct vmbus_channel *channel, char *buf)
 {
        return sprintf(buf, "%u\n", channel->target_cpu);
 }
 static VMBUS_CHAN_ATTR(cpu, S_IRUGO, show_target_cpu, NULL);
 
-static ssize_t channel_pending_show(const struct vmbus_channel *channel,
+static ssize_t channel_pending_show(struct vmbus_channel *channel,
                                    char *buf)
 {
        return sprintf(buf, "%d\n",
@@ -1463,7 +1525,7 @@ static ssize_t channel_pending_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(pending, S_IRUGO, channel_pending_show, NULL);
 
-static ssize_t channel_latency_show(const struct vmbus_channel *channel,
+static ssize_t channel_latency_show(struct vmbus_channel *channel,
                                    char *buf)
 {
        return sprintf(buf, "%d\n",
@@ -1472,19 +1534,19 @@ static ssize_t channel_latency_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(latency, S_IRUGO, channel_latency_show, NULL);
 
-static ssize_t channel_interrupts_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t channel_interrupts_show(struct vmbus_channel *channel, char *buf)
 {
        return sprintf(buf, "%llu\n", channel->interrupts);
 }
 static VMBUS_CHAN_ATTR(interrupts, S_IRUGO, channel_interrupts_show, NULL);
 
-static ssize_t channel_events_show(const struct vmbus_channel *channel, char *buf)
+static ssize_t channel_events_show(struct vmbus_channel *channel, char *buf)
 {
        return sprintf(buf, "%llu\n", channel->sig_events);
 }
 static VMBUS_CHAN_ATTR(events, S_IRUGO, channel_events_show, NULL);
 
-static ssize_t channel_intr_in_full_show(const struct vmbus_channel *channel,
+static ssize_t channel_intr_in_full_show(struct vmbus_channel *channel,
                                         char *buf)
 {
        return sprintf(buf, "%llu\n",
@@ -1492,7 +1554,7 @@ static ssize_t channel_intr_in_full_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(intr_in_full, 0444, channel_intr_in_full_show, NULL);
 
-static ssize_t channel_intr_out_empty_show(const struct vmbus_channel *channel,
+static ssize_t channel_intr_out_empty_show(struct vmbus_channel *channel,
                                           char *buf)
 {
        return sprintf(buf, "%llu\n",
@@ -1500,7 +1562,7 @@ static ssize_t channel_intr_out_empty_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(intr_out_empty, 0444, channel_intr_out_empty_show, NULL);
 
-static ssize_t channel_out_full_first_show(const struct vmbus_channel *channel,
+static ssize_t channel_out_full_first_show(struct vmbus_channel *channel,
                                           char *buf)
 {
        return sprintf(buf, "%llu\n",
@@ -1508,7 +1570,7 @@ static ssize_t channel_out_full_first_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(out_full_first, 0444, channel_out_full_first_show, NULL);
 
-static ssize_t channel_out_full_total_show(const struct vmbus_channel *channel,
+static ssize_t channel_out_full_total_show(struct vmbus_channel *channel,
                                           char *buf)
 {
        return sprintf(buf, "%llu\n",
@@ -1516,14 +1578,14 @@ static ssize_t channel_out_full_total_show(const struct vmbus_channel *channel,
 }
 static VMBUS_CHAN_ATTR(out_full_total, 0444, channel_out_full_total_show, NULL);
 
-static ssize_t subchannel_monitor_id_show(const struct vmbus_channel *channel,
+static ssize_t subchannel_monitor_id_show(struct vmbus_channel *channel,
                                          char *buf)
 {
        return sprintf(buf, "%u\n", channel->offermsg.monitorid);
 }
 static VMBUS_CHAN_ATTR(monitor_id, S_IRUGO, subchannel_monitor_id_show, NULL);
 
-static ssize_t subchannel_id_show(const struct vmbus_channel *channel,
+static ssize_t subchannel_id_show(struct vmbus_channel *channel,
                                  char *buf)
 {
        return sprintf(buf, "%u\n",
@@ -1550,10 +1612,34 @@ static struct attribute *vmbus_chan_attrs[] = {
        NULL
 };
 
+/*
+ * Channel-level attribute_group callback function. Returns the permission for
+ * each attribute, and returns 0 if an attribute is not visible.
+ */
+static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj,
+                                         struct attribute *attr, int idx)
+{
+       const struct vmbus_channel *channel =
+               container_of(kobj, struct vmbus_channel, kobj);
+
+       /* Hide the monitor attributes if the monitor mechanism is not used. */
+       if (!channel->offermsg.monitor_allocated &&
+           (attr == &chan_attr_pending.attr ||
+            attr == &chan_attr_latency.attr ||
+            attr == &chan_attr_monitor_id.attr))
+               return 0;
+
+       return attr->mode;
+}
+
+static struct attribute_group vmbus_chan_group = {
+       .attrs = vmbus_chan_attrs,
+       .is_visible = vmbus_chan_attr_is_visible
+};
+
 static struct kobj_type vmbus_chan_ktype = {
        .sysfs_ops = &vmbus_chan_sysfs_ops,
        .release = vmbus_chan_release,
-       .default_attrs = vmbus_chan_attrs,
 };
 
 /*
@@ -1561,6 +1647,7 @@ static struct kobj_type vmbus_chan_ktype = {
  */
 int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
 {
+       const struct device *device = &dev->device;
        struct kobject *kobj = &channel->kobj;
        u32 relid = channel->offermsg.child_relid;
        int ret;
@@ -1571,11 +1658,30 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)
        if (ret)
                return ret;
 
+       ret = sysfs_create_group(kobj, &vmbus_chan_group);
+
+       if (ret) {
+               /*
+                * The calling functions' error handling paths will cleanup the
+                * empty channel directory.
+                */
+               dev_err(device, "Unable to set up channel sysfs files\n");
+               return ret;
+       }
+
        kobject_uevent(kobj, KOBJ_ADD);
 
        return 0;
 }
 
+/*
+ * vmbus_remove_channel_attr_group - remove the channel's attribute group
+ */
+void vmbus_remove_channel_attr_group(struct vmbus_channel *channel)
+{
+       sysfs_remove_group(&channel->kobj, &vmbus_chan_group);
+}
+
 /*
  * vmbus_device_create - Creates and registers a new child device
  * on the vmbus.
index 1cf6290d643555d1cd9edfd114f2756b66d1b4bb..70f2cb90adc5eb2e15441dcc7f189f9e5495f5aa 100644 (file)
@@ -165,6 +165,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
                PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x34a6),
                .driver_data = (kernel_ulong_t)&intel_th_2x,
        },
+       {
+               /* Comet Lake */
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6),
+               .driver_data = (kernel_ulong_t)&intel_th_2x,
+       },
        { 0 },
 };
 
index c7ba8acfd4d52215d1fb7f00562da29c84b89bd2..e55b902560dee28f854718b72f40ca48803de249 100644 (file)
@@ -166,11 +166,10 @@ stm_master(struct stm_device *stm, unsigned int idx)
 static int stp_master_alloc(struct stm_device *stm, unsigned int idx)
 {
        struct stp_master *master;
-       size_t size;
 
-       size = ALIGN(stm->data->sw_nchannels, 8) / 8;
-       size += sizeof(struct stp_master);
-       master = kzalloc(size, GFP_ATOMIC);
+       master = kzalloc(struct_size(master, chan_map,
+                                    BITS_TO_LONGS(stm->data->sw_nchannels)),
+                        GFP_ATOMIC);
        if (!master)
                return -ENOMEM;
 
@@ -218,8 +217,8 @@ stm_output_disclaim(struct stm_device *stm, struct stm_output *output)
        bitmap_release_region(&master->chan_map[0], output->channel,
                              ilog2(output->nr_chans));
 
-       output->nr_chans = 0;
        master->nr_free += output->nr_chans;
+       output->nr_chans = 0;
 }
 
 /*
index da22bcb62b0482751c2208268328e6cdda4f7d02..52c95add56f0161bebf8230912764c38ca5a53ca 100644 (file)
@@ -451,6 +451,7 @@ static void rts5260_pwr_saving_setting(struct rtsx_pcr *pcr)
        lss_l1_2 = rtsx_check_dev_flag(pcr, ASPM_L1_2_EN)
                        | rtsx_check_dev_flag(pcr, PM_L1_2_EN);
 
+       rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0xFF, 0);
        if (lss_l1_2) {
                pcr_dbg(pcr, "Set parameters for L1.2.");
                rtsx_pci_write_register(pcr, PWR_GLOBAL_CTRL,
@@ -573,10 +574,10 @@ static int rts5260_extra_init_hw(struct rtsx_pcr *pcr)
         * to drive low, and we forcibly request clock.
         */
        if (option->force_clkreq_0)
-               rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG,
+               rtsx_pci_write_register(pcr, PETXCFG,
                                 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
        else
-               rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG,
+               rtsx_pci_write_register(pcr, PETXCFG,
                                 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
 
        return 0;
@@ -704,7 +705,7 @@ void rts5260_init_params(struct rtsx_pcr *pcr)
        option->ocp_en = 1;
        if (option->ocp_en)
                hw_param->interrupt_en |= SD_OC_INT_EN;
-       hw_param->ocp_glitch =  SDVIO_OCP_GLITCH_800U | SDVIO_OCP_GLITCH_800U;
+       hw_param->ocp_glitch =  SD_OCP_GLITCH_100U | SDVIO_OCP_GLITCH_800U;
        option->sd_400mA_ocp_thd = RTS5260_DVCC_OCP_THD_550;
        option->sd_800mA_ocp_thd = RTS5260_DVCC_OCP_THD_970;
 }
index fb1204bcc4548a23d2864b011cf8eefb9eb84e5f..53772d35b36eb80caff55adb8bd7429f093b22a1 100644 (file)
@@ -3,7 +3,8 @@
 #
 config PHY_SUN4I_USB
        tristate "Allwinner sunxi SoC USB PHY driver"
-       depends on ARCH_SUNXI && HAS_IOMEM && OF
+       depends on ARCH_SUNXI || COMPILE_TEST
+       depends on HAS_IOMEM
        depends on RESET_CONTROLLER
        depends on EXTCON
        depends on POWER_SUPPLY
@@ -19,7 +20,8 @@ config PHY_SUN4I_USB
 
 config PHY_SUN6I_MIPI_DPHY
        tristate "Allwinner A31 MIPI D-PHY Support"
-       depends on ARCH_SUNXI && HAS_IOMEM && OF
+       depends on ARCH_SUNXI || COMPILE_TEST
+       depends on HAS_IOMEM
        depends on RESET_CONTROLLER
        select GENERIC_PHY
        select GENERIC_PHY_MIPI_DPHY
@@ -31,7 +33,8 @@ config PHY_SUN6I_MIPI_DPHY
 
 config PHY_SUN9I_USB
        tristate "Allwinner sun9i SoC USB PHY driver"
-       depends on ARCH_SUNXI && HAS_IOMEM && OF
+       depends on ARCH_SUNXI || COMPILE_TEST
+       depends on HAS_IOMEM
        depends on RESET_CONTROLLER
        depends on USB_SUPPORT
        select USB_COMMON
index 4bbd9ede38c8355a9bf226e80eaabc19bc9eda6e..cc5af961778d661c0fb829a8b391eb3874e89e7b 100644 (file)
@@ -554,6 +554,7 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
        struct sun4i_usb_phy_data *data =
                container_of(work, struct sun4i_usb_phy_data, detect.work);
        struct phy *phy0 = data->phys[0].phy;
+       struct sun4i_usb_phy *phy = phy_get_drvdata(phy0);
        bool force_session_end, id_notify = false, vbus_notify = false;
        int id_det, vbus_det;
 
@@ -610,6 +611,9 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
                        mutex_unlock(&phy0->mutex);
                }
 
+               /* Enable PHY0 passby for host mode only. */
+               sun4i_usb_phy_passby(phy, !id_det);
+
                /* Re-route PHY0 if necessary */
                if (data->cfg->phy0_dual_route)
                        sun4i_usb_phy0_reroute(data, id_det);
index 94a29dea57af37f9d9d873bb796d62e5fda699e2..ded900b06f5aa01b2e1e545828406267ba3af237 100644 (file)
@@ -266,7 +266,6 @@ static struct platform_driver mvebu_a3700_utmi_driver = {
        .probe  = mvebu_a3700_utmi_phy_probe,
        .driver = {
                .name           = "mvebu-a3700-utmi-phy",
-               .owner          = THIS_MODULE,
                .of_match_table = mvebu_a3700_utmi_of_match,
         },
 };
index 82651524ffb9ce33424dd5a3eb9851cc14eef11f..718f8729701df1d7c0c2763965e611346d5194fe 100644 (file)
@@ -13,7 +13,7 @@ config PHY_CPCAP_USB
 
 config PHY_MAPPHONE_MDM6600
        tristate "Motorola Mapphone MDM6600 modem USB PHY driver"
-       depends on OF && USB_SUPPORT
+       depends on OF && USB_SUPPORT && GPIOLIB
        select GENERIC_PHY
        help
          Enable this for MDM6600 USB modem to work on Motorola phones
index f2979ccad00a3ce26d2d92121c11828630a9b897..78c339b2fc8bdf1a45890013922320848a88f62a 100644 (file)
@@ -459,7 +459,7 @@ out:
 }
 
 /* Turn OFF M-PHY RMMI interface clocks */
-void ufs_qcom_phy_disable_iface_clk(struct ufs_qcom_phy *phy)
+static void ufs_qcom_phy_disable_iface_clk(struct ufs_qcom_phy *phy)
 {
        if (phy->is_iface_clk_enabled) {
                clk_disable_unprepare(phy->tx_iface_clk);
index e32edeebcd63fa7a9336abf22fd1541eb66aaefc..8ad366ee6adae4dc1580b9850cd8b173728da4b7 100644 (file)
@@ -400,7 +400,7 @@ struct phy_reg {
        u32 addr;
 };
 
-struct phy_reg usb3_pll_cfg[] = {
+static struct phy_reg usb3_pll_cfg[] = {
        { 0xf0,         CMN_PLL0_VCOCAL_INIT },
        { 0x18,         CMN_PLL0_VCOCAL_ITER },
        { 0xd0,         CMN_PLL0_INTDIV },
@@ -417,7 +417,7 @@ struct phy_reg usb3_pll_cfg[] = {
        { 0x8,          CMN_DIAG_PLL0_LF_PROG },
 };
 
-struct phy_reg dp_pll_cfg[] = {
+static struct phy_reg dp_pll_cfg[] = {
        { 0xf0,         CMN_PLL1_VCOCAL_INIT },
        { 0x18,         CMN_PLL1_VCOCAL_ITER },
        { 0x30b9,       CMN_PLL1_VCOCAL_START },
index 103efc456a12eb7cd48742ff3f0fe12e147fe48b..022ac16f626cff716e24a3edf40f3f87d5fd07bc 100644 (file)
@@ -37,7 +37,7 @@ config OMAP_USB2
        depends on USB_SUPPORT
        select GENERIC_PHY
        select USB_PHY
-       select OMAP_CONTROL_PHY if ARCH_OMAP2PLUS
+       select OMAP_CONTROL_PHY if ARCH_OMAP2PLUS || COMPILE_TEST
        help
          Enable this to support the transceiver that is part of SOC. This
          driver takes care of all the PHY functionality apart from comparator.
index c267afb68f077cd5817059c9a5125cc61996d1d4..176e16a365534344cf7999c10ba2142328fef6ea 100644 (file)
@@ -172,6 +172,7 @@ struct twl4030_usb {
 
        int                     irq;
        enum musb_vbus_id_status linkstat;
+       atomic_t                connected;
        bool                    vbus_supplied;
        bool                    musb_mailbox_pending;
 
@@ -575,39 +576,29 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
 {
        struct twl4030_usb *twl = _twl;
        enum musb_vbus_id_status status;
-       bool status_changed = false;
        int err;
 
        status = twl4030_usb_linkstat(twl);
 
        mutex_lock(&twl->lock);
-       if (status >= 0 && status != twl->linkstat) {
-               status_changed =
-                       cable_present(twl->linkstat) !=
-                       cable_present(status);
-               twl->linkstat = status;
-       }
+       twl->linkstat = status;
        mutex_unlock(&twl->lock);
 
-       if (status_changed) {
-               /* FIXME add a set_power() method so that B-devices can
-                * configure the charger appropriately.  It's not always
-                * correct to consume VBUS power, and how much current to
-                * consume is a function of the USB configuration chosen
-                * by the host.
-                *
-                * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
-                * its disconnect() sibling, when changing to/from the
-                * USB_LINK_VBUS state.  musb_hdrc won't care until it
-                * starts to handle softconnect right.
-                */
-               if (cable_present(status)) {
+       if (cable_present(status)) {
+               if (atomic_add_unless(&twl->connected, 1, 1)) {
+                       dev_dbg(twl->dev, "%s: cable connected %i\n",
+                               __func__, status);
                        pm_runtime_get_sync(twl->dev);
-               } else {
+                       twl->musb_mailbox_pending = true;
+               }
+       } else {
+               if (atomic_add_unless(&twl->connected, -1, 0)) {
+                       dev_dbg(twl->dev, "%s: cable disconnected %i\n",
+                               __func__, status);
                        pm_runtime_mark_last_busy(twl->dev);
                        pm_runtime_put_autosuspend(twl->dev);
+                       twl->musb_mailbox_pending = true;
                }
-               twl->musb_mailbox_pending = true;
        }
        if (twl->musb_mailbox_pending) {
                err = musb_mailbox(status);
index 64698ec8f2accd3d3e939f61a9f860623cd6d3ca..8b9a93c99c9b40acf87c286147aa30a379fe5970 100644 (file)
@@ -141,6 +141,11 @@ struct hv_ring_buffer_info {
 
        u32 ring_datasize;              /* < ring_size */
        u32 priv_read_index;
+       /*
+        * The ring buffer mutex lock. This lock prevents the ring buffer from
+        * being freed while the ring buffer is being accessed.
+        */
+       struct mutex ring_buffer_mutex;
 };
 
 
@@ -1206,7 +1211,7 @@ struct hv_ring_buffer_debug_info {
 };
 
 
-int hv_ringbuffer_get_debuginfo(const struct hv_ring_buffer_info *ring_info,
+int hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info,
                                struct hv_ring_buffer_debug_info *debug_info);
 
 /* Vmbus interface */