Commit d4f5f545 authored by Alexander Shishkin's avatar Alexander Shishkin

intel_th: gth: Handle host mode correctly

When detecting host debugger mode either though a module option or via
the scratchpad register, do not export any configuration or capture
related attributes to userspace and refuse attempts by the output drivers
to configure output ports.

This way, GTH can still act as a hub and ensure that the other components
that rely on its presence continue to function properly, namely the
source devices.
Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
parent c49a7591
...@@ -564,6 +564,9 @@ static int intel_th_gth_assign(struct intel_th_device *thdev, ...@@ -564,6 +564,9 @@ static int intel_th_gth_assign(struct intel_th_device *thdev,
struct gth_device *gth = dev_get_drvdata(&thdev->dev); struct gth_device *gth = dev_get_drvdata(&thdev->dev);
int i, id; int i, id;
if (thdev->host_mode)
return -EBUSY;
if (othdev->type != INTEL_TH_OUTPUT) if (othdev->type != INTEL_TH_OUTPUT)
return -EINVAL; return -EINVAL;
...@@ -600,6 +603,9 @@ static void intel_th_gth_unassign(struct intel_th_device *thdev, ...@@ -600,6 +603,9 @@ static void intel_th_gth_unassign(struct intel_th_device *thdev,
struct gth_device *gth = dev_get_drvdata(&thdev->dev); struct gth_device *gth = dev_get_drvdata(&thdev->dev);
int port = othdev->output.port; int port = othdev->output.port;
if (thdev->host_mode)
return;
spin_lock(&gth->gth_lock); spin_lock(&gth->gth_lock);
othdev->output.port = -1; othdev->output.port = -1;
othdev->output.active = false; othdev->output.active = false;
...@@ -654,9 +660,24 @@ static int intel_th_gth_probe(struct intel_th_device *thdev) ...@@ -654,9 +660,24 @@ static int intel_th_gth_probe(struct intel_th_device *thdev)
gth->base = base; gth->base = base;
spin_lock_init(&gth->gth_lock); spin_lock_init(&gth->gth_lock);
/*
* Host mode can be signalled via SW means or via SCRPD_DEBUGGER_IN_USE
* bit. Either way, don't reset HW in this case, and don't export any
* capture configuration attributes. Also, refuse to assign output
* drivers to ports, see intel_th_gth_assign().
*/
if (thdev->host_mode)
goto done;
ret = intel_th_gth_reset(gth); ret = intel_th_gth_reset(gth);
if (ret) if (ret) {
return ret; if (ret != -EBUSY)
return ret;
thdev->host_mode = true;
goto done;
}
for (i = 0; i < TH_CONFIGURABLE_MASTERS + 1; i++) for (i = 0; i < TH_CONFIGURABLE_MASTERS + 1; i++)
gth->master[i] = -1; gth->master[i] = -1;
...@@ -677,6 +698,7 @@ static int intel_th_gth_probe(struct intel_th_device *thdev) ...@@ -677,6 +698,7 @@ static int intel_th_gth_probe(struct intel_th_device *thdev)
return -ENOMEM; return -ENOMEM;
} }
done:
dev_set_drvdata(dev, gth); dev_set_drvdata(dev, gth);
return 0; return 0;
......
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