lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 150/219] drivers/perf: arm_pmu: handle no platform_device
    Date
    From: Mark Rutland <mark.rutland@arm.com>

    [ Upstream commit 7654137071fa706e5c91f4f27bc2a5cd7e435a9b ]

    In armpmu_dispatch_irq() we look at arm_pmu::plat_device to acquire
    platdata, so that we can defer to platform-specific IRQ handling,
    required on some 32-bit parts. With the advent of ACPI we won't always
    have a platform_device, and so we must avoid trying to dereference
    fields from it.

    This patch fixes up armpmu_dispatch_irq() to avoid doing so, introducing
    a new armpmu_get_platdata() helper.

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Tested-by: Jeremy Linton <jeremy.linton@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/perf/arm_pmu.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
    index b37b57294566..af82edc7fa5c 100644
    --- a/drivers/perf/arm_pmu.c
    +++ b/drivers/perf/arm_pmu.c
    @@ -322,10 +322,16 @@ validate_group(struct perf_event *event)
    return 0;
    }

    +static struct arm_pmu_platdata *armpmu_get_platdata(struct arm_pmu *armpmu)
    +{
    + struct platform_device *pdev = armpmu->plat_device;
    +
    + return pdev ? dev_get_platdata(&pdev->dev) : NULL;
    +}
    +
    static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
    {
    struct arm_pmu *armpmu;
    - struct platform_device *plat_device;
    struct arm_pmu_platdata *plat;
    int ret;
    u64 start_clock, finish_clock;
    @@ -337,8 +343,8 @@ static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
    * dereference.
    */
    armpmu = *(void **)dev;
    - plat_device = armpmu->plat_device;
    - plat = dev_get_platdata(&plat_device->dev);
    +
    + plat = armpmu_get_platdata(armpmu);

    start_clock = sched_clock();
    if (plat && plat->handle_irq)
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-04 00:37    [W:2.781 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site