Commit fc0c8146 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'char-misc-4.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Greg (well I), wrote:
  "Char/Misc driver fixes for 4.19-rc6

   Here are some soundwire and intel_th (tracing) driver fixes for some
   reported issues.

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

* tag 'char-misc-4.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  intel_th: pci: Add Ice Lake PCH support
  intel_th: Fix resource handling for ACPI glue layer
  intel_th: Fix device removal logic
  soundwire: Fix acquiring bus lock twice during master release
  soundwire: Fix incorrect exit after configuring stream
  soundwire: Fix duplicate stream state assignment
parents 8c0f9f5b 59d08d00
...@@ -139,7 +139,8 @@ static int intel_th_remove(struct device *dev) ...@@ -139,7 +139,8 @@ static int intel_th_remove(struct device *dev)
th->thdev[i] = NULL; th->thdev[i] = NULL;
} }
th->num_thdevs = lowest; if (lowest >= 0)
th->num_thdevs = lowest;
} }
if (thdrv->attr_group) if (thdrv->attr_group)
...@@ -487,7 +488,7 @@ static const struct intel_th_subdevice { ...@@ -487,7 +488,7 @@ static const struct intel_th_subdevice {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = TH_MMIO_SW, .start = 1, /* use resource[1] */
.end = 0, .end = 0,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
...@@ -580,6 +581,7 @@ intel_th_subdevice_alloc(struct intel_th *th, ...@@ -580,6 +581,7 @@ intel_th_subdevice_alloc(struct intel_th *th,
struct intel_th_device *thdev; struct intel_th_device *thdev;
struct resource res[3]; struct resource res[3];
unsigned int req = 0; unsigned int req = 0;
bool is64bit = false;
int r, err; int r, err;
thdev = intel_th_device_alloc(th, subdev->type, subdev->name, thdev = intel_th_device_alloc(th, subdev->type, subdev->name,
...@@ -589,12 +591,18 @@ intel_th_subdevice_alloc(struct intel_th *th, ...@@ -589,12 +591,18 @@ intel_th_subdevice_alloc(struct intel_th *th,
thdev->drvdata = th->drvdata; thdev->drvdata = th->drvdata;
for (r = 0; r < th->num_resources; r++)
if (th->resource[r].flags & IORESOURCE_MEM_64) {
is64bit = true;
break;
}
memcpy(res, subdev->res, memcpy(res, subdev->res,
sizeof(struct resource) * subdev->nres); sizeof(struct resource) * subdev->nres);
for (r = 0; r < subdev->nres; r++) { for (r = 0; r < subdev->nres; r++) {
struct resource *devres = th->resource; struct resource *devres = th->resource;
int bar = TH_MMIO_CONFIG; int bar = 0; /* cut subdevices' MMIO from resource[0] */
/* /*
* Take .end == 0 to mean 'take the whole bar', * Take .end == 0 to mean 'take the whole bar',
...@@ -603,6 +611,8 @@ intel_th_subdevice_alloc(struct intel_th *th, ...@@ -603,6 +611,8 @@ intel_th_subdevice_alloc(struct intel_th *th,
*/ */
if (!res[r].end && res[r].flags == IORESOURCE_MEM) { if (!res[r].end && res[r].flags == IORESOURCE_MEM) {
bar = res[r].start; bar = res[r].start;
if (is64bit)
bar *= 2;
res[r].start = 0; res[r].start = 0;
res[r].end = resource_size(&devres[bar]) - 1; res[r].end = resource_size(&devres[bar]) - 1;
} }
......
...@@ -160,6 +160,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { ...@@ -160,6 +160,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1), PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x18e1),
.driver_data = (kernel_ulong_t)&intel_th_2x, .driver_data = (kernel_ulong_t)&intel_th_2x,
}, },
{
/* Ice Lake PCH */
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x34a6),
.driver_data = (kernel_ulong_t)&intel_th_2x,
},
{ 0 }, { 0 },
}; };
......
...@@ -899,9 +899,10 @@ static void sdw_release_master_stream(struct sdw_stream_runtime *stream) ...@@ -899,9 +899,10 @@ static void sdw_release_master_stream(struct sdw_stream_runtime *stream)
struct sdw_master_runtime *m_rt = stream->m_rt; struct sdw_master_runtime *m_rt = stream->m_rt;
struct sdw_slave_runtime *s_rt, *_s_rt; struct sdw_slave_runtime *s_rt, *_s_rt;
list_for_each_entry_safe(s_rt, _s_rt, list_for_each_entry_safe(s_rt, _s_rt, &m_rt->slave_rt_list, m_rt_node) {
&m_rt->slave_rt_list, m_rt_node) sdw_slave_port_release(s_rt->slave->bus, s_rt->slave, stream);
sdw_stream_remove_slave(s_rt->slave, stream); sdw_release_slave_stream(s_rt->slave, stream);
}
list_del(&m_rt->bus_node); list_del(&m_rt->bus_node);
} }
...@@ -1112,7 +1113,7 @@ int sdw_stream_add_master(struct sdw_bus *bus, ...@@ -1112,7 +1113,7 @@ int sdw_stream_add_master(struct sdw_bus *bus,
"Master runtime config failed for stream:%s", "Master runtime config failed for stream:%s",
stream->name); stream->name);
ret = -ENOMEM; ret = -ENOMEM;
goto error; goto unlock;
} }
ret = sdw_config_stream(bus->dev, stream, stream_config, false); ret = sdw_config_stream(bus->dev, stream, stream_config, false);
...@@ -1123,11 +1124,11 @@ int sdw_stream_add_master(struct sdw_bus *bus, ...@@ -1123,11 +1124,11 @@ int sdw_stream_add_master(struct sdw_bus *bus,
if (ret) if (ret)
goto stream_error; goto stream_error;
stream->state = SDW_STREAM_CONFIGURED; goto unlock;
stream_error: stream_error:
sdw_release_master_stream(stream); sdw_release_master_stream(stream);
error: unlock:
mutex_unlock(&bus->bus_lock); mutex_unlock(&bus->bus_lock);
return ret; return ret;
} }
...@@ -1141,6 +1142,10 @@ EXPORT_SYMBOL(sdw_stream_add_master); ...@@ -1141,6 +1142,10 @@ EXPORT_SYMBOL(sdw_stream_add_master);
* @stream: SoundWire stream * @stream: SoundWire stream
* @port_config: Port configuration for audio stream * @port_config: Port configuration for audio stream
* @num_ports: Number of ports * @num_ports: Number of ports
*
* It is expected that Slave is added before adding Master
* to the Stream.
*
*/ */
int sdw_stream_add_slave(struct sdw_slave *slave, int sdw_stream_add_slave(struct sdw_slave *slave,
struct sdw_stream_config *stream_config, struct sdw_stream_config *stream_config,
...@@ -1186,6 +1191,12 @@ int sdw_stream_add_slave(struct sdw_slave *slave, ...@@ -1186,6 +1191,12 @@ int sdw_stream_add_slave(struct sdw_slave *slave,
if (ret) if (ret)
goto stream_error; goto stream_error;
/*
* Change stream state to CONFIGURED on first Slave add.
* Bus is not aware of number of Slave(s) in a stream at this
* point so cannot depend on all Slave(s) to be added in order to
* change stream state to CONFIGURED.
*/
stream->state = SDW_STREAM_CONFIGURED; stream->state = SDW_STREAM_CONFIGURED;
goto error; goto error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment