
Runtime suspend in slimbus driver makes QMI call which takes wakelock and result in first system suspend to fail. As a result of first suspend fail, POST_PM_SUSPEND event is dispatched to thermal core which registered to pm notifier. WSA being one of registered thermal zone gets query for temperature, and makes slimbus reads/writes which will result in runtime resume of slimbus driver to happen. System suspend fails again continuously in this endless loop as slimbus runtime suspend will make QMI call again. Update wsa temp sensor to handle suspend event by registering to pm notifier and ignore the temperature request from thermal core at resume. This will avoid slimbus reads/writes during suspend in progress and allow XO shutdown to happen. Change-Id: Id13a9701cffb1231ef7d563cbc30756fd71d5868 Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org> Signed-off-by: Sudheer Papothi <spapothi@codeaurora.org>
44 lines
1.3 KiB
C
44 lines
1.3 KiB
C
/* Copyright (c) 2015, 2018 The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
#ifndef WSA881X_TEMP_SENSOR_H
|
|
#define WSA881X_TEMP_SENSOR_H
|
|
|
|
#include <linux/thermal.h>
|
|
#include <sound/soc.h>
|
|
|
|
struct wsa_temp_register {
|
|
u8 d1_msb;
|
|
u8 d1_lsb;
|
|
u8 d2_msb;
|
|
u8 d2_lsb;
|
|
u8 dmeas_msb;
|
|
u8 dmeas_lsb;
|
|
};
|
|
typedef int32_t (*wsa_temp_register_read)(struct snd_soc_codec *codec,
|
|
struct wsa_temp_register *wsa_temp_reg);
|
|
struct wsa881x_tz_priv {
|
|
struct thermal_zone_device *tz_dev;
|
|
struct snd_soc_codec *codec;
|
|
struct wsa_temp_register *wsa_temp_reg;
|
|
char name[80];
|
|
wsa_temp_register_read wsa_temp_reg_read;
|
|
struct notifier_block pm_nb;
|
|
atomic_t is_suspend_spk;
|
|
int t0_init;
|
|
int curr_temp;
|
|
};
|
|
|
|
int wsa881x_get_temp(struct thermal_zone_device *tz_dev, int *temp);
|
|
int wsa881x_init_thermal(struct wsa881x_tz_priv *tz_pdata);
|
|
void wsa881x_deinit_thermal(struct thermal_zone_device *tz_dev);
|
|
#endif
|