[{"id":1775871,"web_url":"http://patchwork.ozlabs.org/comment/1775871/","msgid":"<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>","list_archive_url":null,"date":"2017-09-26T21:32:47","subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":68377,"url":"http://patchwork.ozlabs.org/api/people/68377/","name":"Scott Branden","email":"scott.branden@broadcom.com"},"content":"Hi Markus,\n\n\nOn 17-09-26 02:27 PM, Markus Mayer wrote:\n> From: Brian Norris <computersforpeace@gmail.com>\n>\n> The AVS TMON core provides temperature readings, a pair of configurable\n> high- and low-temperature threshold interrupts, and an emergency\n> over-temperature chip reset. The driver utilizes the first two to\n> provide temperature readings and high-temperature notifications to\n> applications. The over-temperature reset is not exposed to\n> applications; this reset threshold is critical to the system and should\n> be set with care within the bootloader.\n>\n> Applications may choose to utilize the notification mechanism, the\n> temperature reading mechanism (e.g., through polling), or both.\n>\n> Signed-off-by: Brian Norris <computersforpeace@gmail.com>\n> Signed-off-by: Doug Berger <opendmb@gmail.com>\n> Signed-off-by: Markus Mayer <mmayer@broadcom.com>\n> ---\n>   drivers/thermal/Kconfig                    |   2 +-\n>   drivers/thermal/broadcom/Kconfig           |   7 +\n>   drivers/thermal/broadcom/Makefile          |   1 +\n>   drivers/thermal/broadcom/brcmstb_thermal.c | 387 +++++++++++++++++++++++++++++\n>   4 files changed, 396 insertions(+), 1 deletion(-)\n>   create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>\n> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig\n> index 07002df..96774a7 100644\n> --- a/drivers/thermal/Kconfig\n> +++ b/drivers/thermal/Kconfig\n> @@ -408,7 +408,7 @@ config MTK_THERMAL\n>   \t  controller present in Mediatek SoCs\n>   \n>   menu \"Broadcom thermal drivers\"\n> -depends on ARCH_BCM || COMPILE_TEST\n> +depends on ARCH_BCM || ARCH_BRCMSTB || COMPILE_TEST\nNo need for this additional depends.  ARCH_BCM is always defined before \nARCH_BRCMSTB can be selected.\n>   source \"drivers/thermal/broadcom/Kconfig\"\n>   endmenu\n>   \n> diff --git a/drivers/thermal/broadcom/Kconfig b/drivers/thermal/broadcom/Kconfig\n> index 42c098e..c106a15 100644\n> --- a/drivers/thermal/broadcom/Kconfig\n> +++ b/drivers/thermal/broadcom/Kconfig\n> @@ -6,6 +6,13 @@ config BCM2835_THERMAL\n>   \thelp\n>   \t  Support for thermal sensors on Broadcom bcm2835 SoCs.\n>   \n> +config BRCMSTB_THERMAL\n> +\ttristate \"Broadcom STB AVS TMON thermal driver\"\n> +\tdepends on ARCH_BRCMSTB || COMPILE_TEST\n> +\thelp\n> +\t  Enable this driver if you have a Broadcom STB SoC and would like\n> +\t  thermal framework support.\n> +\n>   config BCM_NS_THERMAL\n>   \ttristate \"Northstar thermal driver\"\n>   \tdepends on ARCH_BCM_IPROC || COMPILE_TEST\n> diff --git a/drivers/thermal/broadcom/Makefile b/drivers/thermal/broadcom/Makefile\n> index c6f62e4..fae10ec 100644\n> --- a/drivers/thermal/broadcom/Makefile\n> +++ b/drivers/thermal/broadcom/Makefile\n> @@ -1,2 +1,3 @@\n>   obj-$(CONFIG_BCM2835_THERMAL)\t\t+= bcm2835_thermal.o\n> +obj-$(CONFIG_BRCMSTB_THERMAL)\t\t+= brcmstb_thermal.o\n>   obj-$(CONFIG_BCM_NS_THERMAL)\t\t+= ns-thermal.o\n> diff --git a/drivers/thermal/broadcom/brcmstb_thermal.c b/drivers/thermal/broadcom/brcmstb_thermal.c\n> new file mode 100644\n> index 0000000..1919f91\n> --- /dev/null\n> +++ b/drivers/thermal/broadcom/brcmstb_thermal.c\n> @@ -0,0 +1,387 @@\n> +/*\n> + * Broadcom STB AVS TMON thermal sensor driver\n> + *\n> + * Copyright (c) 2015-2017 Broadcom\n> + *\n> + * This software is licensed under the terms of the GNU General Public\n> + * License version 2, as published by the Free Software Foundation, and\n> + * may be copied, distributed, and modified under those terms.\n> + *\n> + * This program is distributed in the hope that it will be useful,\n> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n> + * GNU General Public License for more details.\n> + *\n> + */\n> +\n> +#define DRV_NAME\t\"brcmstb_thermal\"\n> +\n> +#define pr_fmt(fmt)\tDRV_NAME \": \" fmt\n> +\n> +#include <linux/bitops.h>\n> +#include <linux/device.h>\n> +#include <linux/err.h>\n> +#include <linux/io.h>\n> +#include <linux/irqreturn.h>\n> +#include <linux/interrupt.h>\n> +#include <linux/kernel.h>\n> +#include <linux/module.h>\n> +#include <linux/platform_device.h>\n> +#include <linux/of_device.h>\n> +#include <linux/thermal.h>\n> +\n> +#define AVS_TMON_STATUS\t\t\t0x00\n> + #define AVS_TMON_STATUS_valid_msk\tBIT(11)\n> + #define AVS_TMON_STATUS_data_msk\tGENMASK(10, 1)\n> + #define AVS_TMON_STATUS_data_shift\t1\n> +\n> +#define AVS_TMON_EN_OVERTEMP_RESET\t0x04\n> + #define AVS_TMON_EN_OVERTEMP_RESET_msk\tBIT(0)\n> +\n> +#define AVS_TMON_RESET_THRESH\t\t0x08\n> + #define AVS_TMON_RESET_THRESH_msk\tGENMASK(10, 1)\n> + #define AVS_TMON_RESET_THRESH_shift\t1\n> +\n> +#define AVS_TMON_INT_IDLE_TIME\t\t0x10\n> +\n> +#define AVS_TMON_EN_TEMP_INT_SRCS\t0x14\n> + #define AVS_TMON_EN_TEMP_INT_SRCS_high\tBIT(1)\n> + #define AVS_TMON_EN_TEMP_INT_SRCS_low\tBIT(0)\n> +\n> +#define AVS_TMON_INT_THRESH\t\t0x18\n> + #define AVS_TMON_INT_THRESH_high_msk\tGENMASK(26, 17)\n> + #define AVS_TMON_INT_THRESH_high_shift\t17\n> + #define AVS_TMON_INT_THRESH_low_msk\tGENMASK(10, 1)\n> + #define AVS_TMON_INT_THRESH_low_shift\t1\n> +\n> +#define AVS_TMON_TEMP_INT_CODE\t\t0x1c\n> +#define AVS_TMON_TP_TEST_ENABLE\t\t0x20\n> +\n> +/* Default coefficients */\n> +#define AVS_TMON_TEMP_SLOPE\t\t-487\n> +#define AVS_TMON_TEMP_OFFSET\t\t410040\n> +\n> +/* HW related temperature constants */\n> +#define AVS_TMON_TEMP_MAX\t\t0x3ff\n> +#define AVS_TMON_TEMP_MIN\t\t-88161\n> +#define AVS_TMON_TEMP_MASK\t\tAVS_TMON_TEMP_MAX\n> +\n> +enum avs_tmon_trip_type {\n> +\tTMON_TRIP_TYPE_LOW = 0,\n> +\tTMON_TRIP_TYPE_HIGH,\n> +\tTMON_TRIP_TYPE_RESET,\n> +\tTMON_TRIP_TYPE_MAX,\n> +};\n> +\n> +struct avs_tmon_trip {\n> +\t/* HW bit to enable the trip */\n> +\tu32 enable_offs;\n> +\tu32 enable_mask;\n> +\n> +\t/* HW field to read the trip temperature */\n> +\tu32 reg_offs;\n> +\tu32 reg_msk;\n> +\tint reg_shift;\n> +};\n> +\n> +static struct avs_tmon_trip avs_tmon_trips[] = {\n> +\t/* Trips when temperature is below threshold */\n> +\t[TMON_TRIP_TYPE_LOW] = {\n> +\t\t.enable_offs\t= AVS_TMON_EN_TEMP_INT_SRCS,\n> +\t\t.enable_mask\t= AVS_TMON_EN_TEMP_INT_SRCS_low,\n> +\t\t.reg_offs\t= AVS_TMON_INT_THRESH,\n> +\t\t.reg_msk\t= AVS_TMON_INT_THRESH_low_msk,\n> +\t\t.reg_shift\t= AVS_TMON_INT_THRESH_low_shift,\n> +\t},\n> +\t/* Trips when temperature is above threshold */\n> +\t[TMON_TRIP_TYPE_HIGH] = {\n> +\t\t.enable_offs\t= AVS_TMON_EN_TEMP_INT_SRCS,\n> +\t\t.enable_mask\t= AVS_TMON_EN_TEMP_INT_SRCS_high,\n> +\t\t.reg_offs\t= AVS_TMON_INT_THRESH,\n> +\t\t.reg_msk\t= AVS_TMON_INT_THRESH_high_msk,\n> +\t\t.reg_shift\t= AVS_TMON_INT_THRESH_high_shift,\n> +\t},\n> +\t/* Automatically resets chip when above threshold */\n> +\t[TMON_TRIP_TYPE_RESET] = {\n> +\t\t.enable_offs\t= AVS_TMON_EN_OVERTEMP_RESET,\n> +\t\t.enable_mask\t= AVS_TMON_EN_OVERTEMP_RESET_msk,\n> +\t\t.reg_offs\t= AVS_TMON_RESET_THRESH,\n> +\t\t.reg_msk\t= AVS_TMON_RESET_THRESH_msk,\n> +\t\t.reg_shift\t= AVS_TMON_RESET_THRESH_shift,\n> +\t},\n> +};\n> +\n> +struct brcmstb_thermal_priv {\n> +\tvoid __iomem *tmon_base;\n> +\tstruct device *dev;\n> +\tstruct thermal_zone_device *thermal;\n> +};\n> +\n> +static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int *slope,\n> +\t\t\t\tint *offset)\n> +{\n> +\t*slope = thermal_zone_get_slope(tz);\n> +\t*offset = thermal_zone_get_offset(tz);\n> +}\n> +\n> +/* Convert a HW code to a temperature reading (millidegree celsius) */\n> +static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz,\n> +\t\t\t\t\tu32 code)\n> +{\n> +\tconst int val = code & AVS_TMON_TEMP_MASK;\n> +\tint slope, offset;\n> +\n> +\tavs_tmon_get_coeffs(tz, &slope, &offset);\n> +\n> +\treturn slope * val + offset;\n> +}\n> +\n> +/*\n> + * Convert a temperature value (millidegree celsius) to a HW code\n> + *\n> + * @temp: temperature to convert\n> + * @low: if true, round toward the low side\n> + */\n> +static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz,\n> +\t\t\t\t\tint temp, bool low)\n> +{\n> +\tint slope, offset;\n> +\n> +\tif (temp < AVS_TMON_TEMP_MIN)\n> +\t\treturn AVS_TMON_TEMP_MAX; /* Maximum code value */\n> +\n> +\tavs_tmon_get_coeffs(tz, &slope, &offset);\n> +\n> +\tif (temp >= offset)\n> +\t\treturn 0;\t/* Minimum code value */\n> +\n> +\tif (low)\n> +\t\treturn (u32)(DIV_ROUND_UP(offset - temp, abs(slope)));\n> +\telse\n> +\t\treturn (u32)((offset - temp) / abs(slope));\n> +}\n> +\n> +static int brcmstb_get_temp(void *data, int *temp)\n> +{\n> +\tstruct brcmstb_thermal_priv *priv = data;\n> +\tu32 val;\n> +\tlong t;\n> +\n> +\tval = __raw_readl(priv->tmon_base + AVS_TMON_STATUS);\n> +\n> +\tif (!(val & AVS_TMON_STATUS_valid_msk)) {\n> +\t\tdev_err(priv->dev, \"reading not valid\\n\");\n> +\t\treturn -EIO;\n> +\t}\n> +\n> +\tval = (val & AVS_TMON_STATUS_data_msk) >> AVS_TMON_STATUS_data_shift;\n> +\n> +\tt = avs_tmon_code_to_temp(priv->thermal, val);\n> +\tif (t < 0)\n> +\t\t*temp = 0;\n> +\telse\n> +\t\t*temp = t;\n> +\n> +\treturn 0;\n> +}\n> +\n> +static void avs_tmon_trip_enable(struct brcmstb_thermal_priv *priv,\n> +\t\t\t\t enum avs_tmon_trip_type type, int en)\n> +{\n> +\tstruct avs_tmon_trip *trip = &avs_tmon_trips[type];\n> +\tu32 val = __raw_readl(priv->tmon_base + trip->enable_offs);\n> +\n> +\tdev_dbg(priv->dev, \"%sable trip, type %d\\n\", en ? \"en\" : \"dis\", type);\n> +\n> +\tif (en)\n> +\t\tval |= trip->enable_mask;\n> +\telse\n> +\t\tval &= ~trip->enable_mask;\n> +\n> +\t__raw_writel(val, priv->tmon_base + trip->enable_offs);\n> +}\n> +\n> +static int avs_tmon_get_trip_temp(struct brcmstb_thermal_priv *priv,\n> +\t\t\t\t  enum avs_tmon_trip_type type)\n> +{\n> +\tstruct avs_tmon_trip *trip = &avs_tmon_trips[type];\n> +\tu32 val = __raw_readl(priv->tmon_base + trip->reg_offs);\n> +\n> +\tval &= trip->reg_msk;\n> +\tval >>= trip->reg_shift;\n> +\n> +\treturn avs_tmon_code_to_temp(priv->thermal, val);\n> +}\n> +\n> +static void avs_tmon_set_trip_temp(struct brcmstb_thermal_priv *priv,\n> +\t\t\t\t   enum avs_tmon_trip_type type,\n> +\t\t\t\t   int temp)\n> +{\n> +\tstruct avs_tmon_trip *trip = &avs_tmon_trips[type];\n> +\tu32 val, orig;\n> +\n> +\tdev_dbg(priv->dev, \"set temp %d to %d\\n\", type, temp);\n> +\n> +\t/* round toward low temp for the low interrupt */\n> +\tval = avs_tmon_temp_to_code(priv->thermal, temp,\n> +\t\t\t\t    type == TMON_TRIP_TYPE_LOW);\n> +\n> +\tval <<= trip->reg_shift;\n> +\tval &= trip->reg_msk;\n> +\n> +\torig = __raw_readl(priv->tmon_base + trip->reg_offs);\n> +\torig &= ~trip->reg_msk;\n> +\torig |= val;\n> +\t__raw_writel(orig, priv->tmon_base + trip->reg_offs);\n> +}\n> +\n> +static int avs_tmon_get_intr_temp(struct brcmstb_thermal_priv *priv)\n> +{\n> +\tu32 val;\n> +\n> +\tval = __raw_readl(priv->tmon_base + AVS_TMON_TEMP_INT_CODE);\n> +\treturn avs_tmon_code_to_temp(priv->thermal, val);\n> +}\n> +\n> +static irqreturn_t brcmstb_tmon_irq_thread(int irq, void *data)\n> +{\n> +\tstruct brcmstb_thermal_priv *priv = data;\n> +\tint low, high, intr;\n> +\n> +\tlow = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_LOW);\n> +\thigh = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_HIGH);\n> +\tintr = avs_tmon_get_intr_temp(priv);\n> +\n> +\tdev_dbg(priv->dev, \"low/intr/high: %d/%d/%d\\n\",\n> +\t\t\tlow, intr, high);\n> +\n> +\t/* Disable high-temp until next threshold shift */\n> +\tif (intr >= high)\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n> +\t/* Disable low-temp until next threshold shift */\n> +\tif (intr <= low)\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n> +\n> +\t/*\n> +\t * Notify using the interrupt temperature, in case the temperature\n> +\t * changes before it can next be read out\n> +\t */\n> +\tthermal_zone_device_update(priv->thermal, intr);\n> +\n> +\treturn IRQ_HANDLED;\n> +}\n> +\n> +static int brcmstb_set_trips(void *data, int low, int high)\n> +{\n> +\tstruct brcmstb_thermal_priv *priv = data;\n> +\n> +\tdev_dbg(priv->dev, \"set trips %d <--> %d\\n\", low, high);\n> +\n> +\t/*\n> +\t * Disable low-temp if \"low\" is too small. As per thermal framework\n> +\t * API, we use -INT_MAX rather than INT_MIN.\n> +\t */\n> +\tif (low <= -INT_MAX) {\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n> +\t} else {\n> +\t\tavs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_LOW, low);\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 1);\n> +\t}\n> +\n> +\t/* Disable high-temp if \"high\" is too big. */\n> +\tif (high == INT_MAX) {\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n> +\t} else {\n> +\t\tavs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_HIGH, high);\n> +\t\tavs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 1);\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n> +static struct thermal_zone_of_device_ops of_ops = {\n> +\t.get_temp\t= brcmstb_get_temp,\n> +\t.set_trips\t= brcmstb_set_trips,\n> +};\n> +\n> +static const struct of_device_id brcmstb_thermal_id_table[] = {\n> +\t{ .compatible = \"brcm,avs-tmon\" },\n> +\t{},\n> +};\n> +MODULE_DEVICE_TABLE(of, brcmstb_thermal_id_table);\n> +\n> +static int brcmstb_thermal_probe(struct platform_device *pdev)\n> +{\n> +\tstruct thermal_zone_device *thermal;\n> +\tstruct brcmstb_thermal_priv *priv;\n> +\tstruct resource *res;\n> +\tint irq, ret;\n> +\n> +\tpriv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n> +\tif (!priv)\n> +\t\treturn -ENOMEM;\n> +\n> +\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n> +\tpriv->tmon_base = devm_ioremap_resource(&pdev->dev, res);\n> +\tif (IS_ERR(priv->tmon_base))\n> +\t\treturn PTR_ERR(priv->tmon_base);\n> +\n> +\tpriv->dev = &pdev->dev;\n> +\tplatform_set_drvdata(pdev, priv);\n> +\n> +\tthermal = thermal_zone_of_sensor_register(&pdev->dev, 0, priv, &of_ops);\n> +\tif (IS_ERR(thermal)) {\n> +\t\tret = PTR_ERR(thermal);\n> +\t\tdev_err(&pdev->dev, \"could not register sensor: %d\\n\", ret);\n> +\t\treturn ret;\n> +\t}\n> +\n> +\tpriv->thermal = thermal;\n> +\n> +\tirq = platform_get_irq(pdev, 0);\n> +\tif (irq < 0) {\n> +\t\tdev_err(&pdev->dev, \"could not get IRQ\\n\");\n> +\t\tret = irq;\n> +\t\tgoto err;\n> +\t}\n> +\tret = devm_request_threaded_irq(&pdev->dev, irq, NULL,\n> +\t\t\t\t\tbrcmstb_tmon_irq_thread, IRQF_ONESHOT,\n> +\t\t\t\t\tDRV_NAME, priv);\n> +\tif (ret < 0) {\n> +\t\tdev_err(&pdev->dev, \"could not request IRQ: %d\\n\", ret);\n> +\t\tgoto err;\n> +\t}\n> +\n> +\tdev_info(&pdev->dev, \"registered AVS TMON of-sensor driver\\n\");\n> +\n> +\treturn 0;\n> +\n> +err:\n> +\tthermal_zone_of_sensor_unregister(&pdev->dev, thermal);\n> +\treturn ret;\n> +}\n> +\n> +static int brcmstb_thermal_exit(struct platform_device *pdev)\n> +{\n> +\tstruct brcmstb_thermal_priv *priv = platform_get_drvdata(pdev);\n> +\tstruct thermal_zone_device *thermal = priv->thermal;\n> +\n> +\tif (thermal)\n> +\t\tthermal_zone_of_sensor_unregister(&pdev->dev, priv->thermal);\n> +\n> +\treturn 0;\n> +}\n> +\n> +static struct platform_driver brcmstb_thermal_driver = {\n> +\t.probe = brcmstb_thermal_probe,\n> +\t.remove = brcmstb_thermal_exit,\n> +\t.driver = {\n> +\t\t.name = DRV_NAME,\n> +\t\t.of_match_table = brcmstb_thermal_id_table,\n> +\t},\n> +};\n> +module_platform_driver(brcmstb_thermal_driver);\n> +\n> +MODULE_LICENSE(\"GPL v2\");\n> +MODULE_AUTHOR(\"Brian Norris\");\n> +MODULE_DESCRIPTION(\"Broadcom STB AVS TMON thermal driver\");\n\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"Y8OHD9Sh\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1vLy2SCcz9t3Z\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 07:32:58 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S965254AbdIZVcz (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tTue, 26 Sep 2017 17:32:55 -0400","from mail-qk0-f169.google.com ([209.85.220.169]:52605 \"EHLO\n\tmail-qk0-f169.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S967795AbdIZVcy (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 26 Sep 2017 17:32:54 -0400","by mail-qk0-f169.google.com with SMTP id o77so11506204qke.9\n\tfor <devicetree@vger.kernel.org>;\n\tTue, 26 Sep 2017 14:32:53 -0700 (PDT)","from [10.136.13.65] ([192.19.224.250])\n\tby smtp.gmail.com with ESMTPSA id\n\tl51sm3241140qtl.41.2017.09.26.14.32.49\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 26 Sep 2017 14:32:52 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n\ts=google; \n\th=subject:to:references:cc:from:message-id:date:user-agent\n\t:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=NpGE8GykWu7+TF5WZTxIjN2wPMTAMTY2ibqQhgu2OUg=;\n\tb=Y8OHD9Sh29+rTlsEevlgOamX1utpVdX6PT7nUr0mJdT1BUqnFLrR0wGRCgONZDvZzV\n\twQk65nWg7n4X6RdSeyP5nz5qNNyQITbBP0LEzxlDxEncYBYtbTQxwZeKpPhjXsXTXLpB\n\tOQdDHeIE68fwHucFUeTkOIPLYls4nHYKzGnn4=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:references:cc:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=NpGE8GykWu7+TF5WZTxIjN2wPMTAMTY2ibqQhgu2OUg=;\n\tb=ZJi/bXzr0dkaFKVKhAgwte8Xm7FohJOk1cCL+qeKtvAUN/RD2YV5FZ0It8j0Z1N8C0\n\tcZPS08LlpWkkkjzYtvn8a88KZDP5GzoqT5zYooUH1oO3tD2mFfPD70epkvi1hbRFt+t6\n\tE6n56+5FvGpa2B61+a+Pr1cjHVA/Tj+RK7hwP3+eW/68zJCkHSOEen+jBH+2CO5SToSA\n\tCEVPSG7m6+ZFgJdoOxk94yQUK9WsLkmQGreTa47EgbCm//O8aaGATvsXMEtr69Hxm/SE\n\t8Jt8R1wPIiQqc+JHSZ0Lp3nGjFkr3G8V4aiqrX0f+Xm88/tHyckmgqR4WhlQgcWo5IZG\n\tGdHQ==","X-Gm-Message-State":"AHPjjUi6m7/nlST1BhfEy8nfofTJDaqEnwu7SM9FTERCUOD14Z99zug6\n\tJ0Z9h4eLkfnWHjLMqKyOWulyJg==","X-Google-Smtp-Source":"AOwi7QAvPLDCW4VHiyObFPevsH4nL3Hq48tZZ/9rExt1h1q9+THw09q3cyx2ZGAu01YUrlgWTPgytA==","X-Received":"by 10.55.207.87 with SMTP id e84mr15736522qkj.65.1506461573219; \n\tTue, 26 Sep 2017 14:32:53 -0700 (PDT)","Subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","To":"Markus Mayer <code@mmayer.net>, Zhang Rui <rui.zhang@intel.com>, Eduardo\n\tValentin <edubezval@gmail.com>, Rob Herring <robh+dt@kernel.org>, \n\tMark Rutland <mark.rutland@arm.com>, Doug Berger <opendmb@gmail.com>, \n\tBrian Norris <computersforpeace@gmail.com>, \n\tGregory Fong <gregory.0xf0@gmail.com>, Florian Fainelli\n\t<f.fainelli@gmail.com>, =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?=\n\t<rafal@milecki.pl>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<20170926212800.4879-3-code@mmayer.net>","Cc":"Broadcom Kernel List <bcm-kernel-feedback-list@broadcom.com>,\n\tPower Management List <linux-pm@vger.kernel.org>,\n\tDevice Tree List <devicetree@vger.kernel.org>,\n\tARM Kernel List <linux-arm-kernel@lists.infradead.org>,\n\tLinux Kernel Mailing List <linux-kernel@vger.kernel.org>,\n\tMarkus Mayer <mmayer@broadcom.com>","From":"Scott Branden <scott.branden@broadcom.com>","Message-ID":"<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>","Date":"Tue, 26 Sep 2017 14:32:47 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101\n\tThunderbird/45.8.0","MIME-Version":"1.0","In-Reply-To":"<20170926212800.4879-3-code@mmayer.net>","Content-Type":"text/plain; charset=windows-1252; format=flowed","Content-Transfer-Encoding":"7bit","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1775879,"web_url":"http://patchwork.ozlabs.org/comment/1775879/","msgid":"<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>","list_archive_url":null,"date":"2017-09-26T21:38:27","subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":70280,"url":"http://patchwork.ozlabs.org/api/people/70280/","name":"Markus Mayer","email":"code@mmayer.net"},"content":"On 26 September 2017 at 14:32, Scott Branden <scott.branden@broadcom.com> wrote:\n> Hi Markus,\n>\n>\n> On 17-09-26 02:27 PM, Markus Mayer wrote:\n>>\n>> From: Brian Norris <computersforpeace@gmail.com>\n>>\n>> The AVS TMON core provides temperature readings, a pair of configurable\n>> high- and low-temperature threshold interrupts, and an emergency\n>> over-temperature chip reset. The driver utilizes the first two to\n>> provide temperature readings and high-temperature notifications to\n>> applications. The over-temperature reset is not exposed to\n>> applications; this reset threshold is critical to the system and should\n>> be set with care within the bootloader.\n>>\n>> Applications may choose to utilize the notification mechanism, the\n>> temperature reading mechanism (e.g., through polling), or both.\n>>\n>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>\n>> Signed-off-by: Doug Berger <opendmb@gmail.com>\n>> Signed-off-by: Markus Mayer <mmayer@broadcom.com>\n>> ---\n>>   drivers/thermal/Kconfig                    |   2 +-\n>>   drivers/thermal/broadcom/Kconfig           |   7 +\n>>   drivers/thermal/broadcom/Makefile          |   1 +\n>>   drivers/thermal/broadcom/brcmstb_thermal.c | 387\n>> +++++++++++++++++++++++++++++\n>>   4 files changed, 396 insertions(+), 1 deletion(-)\n>>   create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>>\n>> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig\n>> index 07002df..96774a7 100644\n>> --- a/drivers/thermal/Kconfig\n>> +++ b/drivers/thermal/Kconfig\n>> @@ -408,7 +408,7 @@ config MTK_THERMAL\n>>           controller present in Mediatek SoCs\n>>     menu \"Broadcom thermal drivers\"\n>> -depends on ARCH_BCM || COMPILE_TEST\n>> +depends on ARCH_BCM || ARCH_BRCMSTB || COMPILE_TEST\n>\n> No need for this additional depends.  ARCH_BCM is always defined before\n> ARCH_BRCMSTB can be selected.\n\nARCH_BCM does not exist in arch/arm64/configs/defconfig. ARCH_BRCMSTB\ndoes. So, we do need both or the driver won't be built on ARM64.\n(After internal discussions we went with that approach rather than\ndefining ARCH_BCM on ARM64.)\n\n>>   source \"drivers/thermal/broadcom/Kconfig\"\n>>   endmenu\n>>   diff --git a/drivers/thermal/broadcom/Kconfig\n>> b/drivers/thermal/broadcom/Kconfig\n>> index 42c098e..c106a15 100644\n>> --- a/drivers/thermal/broadcom/Kconfig\n>> +++ b/drivers/thermal/broadcom/Kconfig\n>> @@ -6,6 +6,13 @@ config BCM2835_THERMAL\n>>         help\n>>           Support for thermal sensors on Broadcom bcm2835 SoCs.\n>>   +config BRCMSTB_THERMAL\n>> +       tristate \"Broadcom STB AVS TMON thermal driver\"\n>> +       depends on ARCH_BRCMSTB || COMPILE_TEST\n>> +       help\n>> +         Enable this driver if you have a Broadcom STB SoC and would like\n>> +         thermal framework support.\n>> +\n>>   config BCM_NS_THERMAL\n>>         tristate \"Northstar thermal driver\"\n>>         depends on ARCH_BCM_IPROC || COMPILE_TEST\n>> diff --git a/drivers/thermal/broadcom/Makefile\n>> b/drivers/thermal/broadcom/Makefile\n>> index c6f62e4..fae10ec 100644\n>> --- a/drivers/thermal/broadcom/Makefile\n>> +++ b/drivers/thermal/broadcom/Makefile\n>> @@ -1,2 +1,3 @@\n>>   obj-$(CONFIG_BCM2835_THERMAL)         += bcm2835_thermal.o\n>> +obj-$(CONFIG_BRCMSTB_THERMAL)          += brcmstb_thermal.o\n>>   obj-$(CONFIG_BCM_NS_THERMAL)          += ns-thermal.o\n>> diff --git a/drivers/thermal/broadcom/brcmstb_thermal.c\n>> b/drivers/thermal/broadcom/brcmstb_thermal.c\n>> new file mode 100644\n>> index 0000000..1919f91\n>> --- /dev/null\n>> +++ b/drivers/thermal/broadcom/brcmstb_thermal.c\n>> @@ -0,0 +1,387 @@\n>>\n>> +/*\n>> + * Broadcom STB AVS TMON thermal sensor driver\n>> + *\n>> + * Copyright (c) 2015-2017 Broadcom\n>> + *\n>> + * This software is licensed under the terms of the GNU General Public\n>> + * License version 2, as published by the Free Software Foundation, and\n>> + * may be copied, distributed, and modified under those terms.\n>> + *\n>> + * This program is distributed in the hope that it will be useful,\n>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n>> + * GNU General Public License for more details.\n>> + *\n>> + */\n>> +\n>> +#define DRV_NAME       \"brcmstb_thermal\"\n>> +\n>> +#define pr_fmt(fmt)    DRV_NAME \": \" fmt\n>> +\n>> +#include <linux/bitops.h>\n>> +#include <linux/device.h>\n>> +#include <linux/err.h>\n>> +#include <linux/io.h>\n>> +#include <linux/irqreturn.h>\n>> +#include <linux/interrupt.h>\n>> +#include <linux/kernel.h>\n>> +#include <linux/module.h>\n>> +#include <linux/platform_device.h>\n>> +#include <linux/of_device.h>\n>> +#include <linux/thermal.h>\n>> +\n>> +#define AVS_TMON_STATUS                        0x00\n>> + #define AVS_TMON_STATUS_valid_msk     BIT(11)\n>> + #define AVS_TMON_STATUS_data_msk      GENMASK(10, 1)\n>> + #define AVS_TMON_STATUS_data_shift    1\n>> +\n>> +#define AVS_TMON_EN_OVERTEMP_RESET     0x04\n>> + #define AVS_TMON_EN_OVERTEMP_RESET_msk        BIT(0)\n>> +\n>> +#define AVS_TMON_RESET_THRESH          0x08\n>> + #define AVS_TMON_RESET_THRESH_msk     GENMASK(10, 1)\n>> + #define AVS_TMON_RESET_THRESH_shift   1\n>> +\n>> +#define AVS_TMON_INT_IDLE_TIME         0x10\n>> +\n>> +#define AVS_TMON_EN_TEMP_INT_SRCS      0x14\n>> + #define AVS_TMON_EN_TEMP_INT_SRCS_high        BIT(1)\n>> + #define AVS_TMON_EN_TEMP_INT_SRCS_low BIT(0)\n>> +\n>> +#define AVS_TMON_INT_THRESH            0x18\n>> + #define AVS_TMON_INT_THRESH_high_msk  GENMASK(26, 17)\n>> + #define AVS_TMON_INT_THRESH_high_shift        17\n>> + #define AVS_TMON_INT_THRESH_low_msk   GENMASK(10, 1)\n>> + #define AVS_TMON_INT_THRESH_low_shift 1\n>> +\n>> +#define AVS_TMON_TEMP_INT_CODE         0x1c\n>> +#define AVS_TMON_TP_TEST_ENABLE                0x20\n>> +\n>> +/* Default coefficients */\n>> +#define AVS_TMON_TEMP_SLOPE            -487\n>> +#define AVS_TMON_TEMP_OFFSET           410040\n>> +\n>> +/* HW related temperature constants */\n>> +#define AVS_TMON_TEMP_MAX              0x3ff\n>> +#define AVS_TMON_TEMP_MIN              -88161\n>> +#define AVS_TMON_TEMP_MASK             AVS_TMON_TEMP_MAX\n>> +\n>> +enum avs_tmon_trip_type {\n>> +       TMON_TRIP_TYPE_LOW = 0,\n>> +       TMON_TRIP_TYPE_HIGH,\n>> +       TMON_TRIP_TYPE_RESET,\n>> +       TMON_TRIP_TYPE_MAX,\n>> +};\n>> +\n>> +struct avs_tmon_trip {\n>> +       /* HW bit to enable the trip */\n>> +       u32 enable_offs;\n>> +       u32 enable_mask;\n>> +\n>> +       /* HW field to read the trip temperature */\n>> +       u32 reg_offs;\n>> +       u32 reg_msk;\n>> +       int reg_shift;\n>> +};\n>> +\n>> +static struct avs_tmon_trip avs_tmon_trips[] = {\n>> +       /* Trips when temperature is below threshold */\n>> +       [TMON_TRIP_TYPE_LOW] = {\n>> +               .enable_offs    = AVS_TMON_EN_TEMP_INT_SRCS,\n>> +               .enable_mask    = AVS_TMON_EN_TEMP_INT_SRCS_low,\n>> +               .reg_offs       = AVS_TMON_INT_THRESH,\n>> +               .reg_msk        = AVS_TMON_INT_THRESH_low_msk,\n>> +               .reg_shift      = AVS_TMON_INT_THRESH_low_shift,\n>> +       },\n>> +       /* Trips when temperature is above threshold */\n>> +       [TMON_TRIP_TYPE_HIGH] = {\n>> +               .enable_offs    = AVS_TMON_EN_TEMP_INT_SRCS,\n>> +               .enable_mask    = AVS_TMON_EN_TEMP_INT_SRCS_high,\n>> +               .reg_offs       = AVS_TMON_INT_THRESH,\n>> +               .reg_msk        = AVS_TMON_INT_THRESH_high_msk,\n>> +               .reg_shift      = AVS_TMON_INT_THRESH_high_shift,\n>> +       },\n>> +       /* Automatically resets chip when above threshold */\n>> +       [TMON_TRIP_TYPE_RESET] = {\n>> +               .enable_offs    = AVS_TMON_EN_OVERTEMP_RESET,\n>> +               .enable_mask    = AVS_TMON_EN_OVERTEMP_RESET_msk,\n>> +               .reg_offs       = AVS_TMON_RESET_THRESH,\n>> +               .reg_msk        = AVS_TMON_RESET_THRESH_msk,\n>> +               .reg_shift      = AVS_TMON_RESET_THRESH_shift,\n>> +       },\n>> +};\n>> +\n>> +struct brcmstb_thermal_priv {\n>> +       void __iomem *tmon_base;\n>> +       struct device *dev;\n>> +       struct thermal_zone_device *thermal;\n>> +};\n>> +\n>> +static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int\n>> *slope,\n>> +                               int *offset)\n>> +{\n>> +       *slope = thermal_zone_get_slope(tz);\n>> +       *offset = thermal_zone_get_offset(tz);\n>> +}\n>> +\n>> +/* Convert a HW code to a temperature reading (millidegree celsius) */\n>> +static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz,\n>> +                                       u32 code)\n>> +{\n>> +       const int val = code & AVS_TMON_TEMP_MASK;\n>> +       int slope, offset;\n>> +\n>> +       avs_tmon_get_coeffs(tz, &slope, &offset);\n>> +\n>> +       return slope * val + offset;\n>> +}\n>> +\n>> +/*\n>> + * Convert a temperature value (millidegree celsius) to a HW code\n>> + *\n>> + * @temp: temperature to convert\n>> + * @low: if true, round toward the low side\n>> + */\n>> +static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz,\n>> +                                       int temp, bool low)\n>> +{\n>> +       int slope, offset;\n>> +\n>> +       if (temp < AVS_TMON_TEMP_MIN)\n>> +               return AVS_TMON_TEMP_MAX; /* Maximum code value */\n>> +\n>> +       avs_tmon_get_coeffs(tz, &slope, &offset);\n>> +\n>> +       if (temp >= offset)\n>> +               return 0;       /* Minimum code value */\n>> +\n>> +       if (low)\n>> +               return (u32)(DIV_ROUND_UP(offset - temp, abs(slope)));\n>> +       else\n>> +               return (u32)((offset - temp) / abs(slope));\n>> +}\n>> +\n>> +static int brcmstb_get_temp(void *data, int *temp)\n>> +{\n>> +       struct brcmstb_thermal_priv *priv = data;\n>> +       u32 val;\n>> +       long t;\n>> +\n>> +       val = __raw_readl(priv->tmon_base + AVS_TMON_STATUS);\n>> +\n>> +       if (!(val & AVS_TMON_STATUS_valid_msk)) {\n>> +               dev_err(priv->dev, \"reading not valid\\n\");\n>> +               return -EIO;\n>> +       }\n>> +\n>> +       val = (val & AVS_TMON_STATUS_data_msk) >>\n>> AVS_TMON_STATUS_data_shift;\n>> +\n>> +       t = avs_tmon_code_to_temp(priv->thermal, val);\n>> +       if (t < 0)\n>> +               *temp = 0;\n>> +       else\n>> +               *temp = t;\n>> +\n>> +       return 0;\n>> +}\n>> +\n>> +static void avs_tmon_trip_enable(struct brcmstb_thermal_priv *priv,\n>> +                                enum avs_tmon_trip_type type, int en)\n>> +{\n>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>> +       u32 val = __raw_readl(priv->tmon_base + trip->enable_offs);\n>> +\n>> +       dev_dbg(priv->dev, \"%sable trip, type %d\\n\", en ? \"en\" : \"dis\",\n>> type);\n>> +\n>> +       if (en)\n>> +               val |= trip->enable_mask;\n>> +       else\n>> +               val &= ~trip->enable_mask;\n>> +\n>> +       __raw_writel(val, priv->tmon_base + trip->enable_offs);\n>> +}\n>> +\n>> +static int avs_tmon_get_trip_temp(struct brcmstb_thermal_priv *priv,\n>> +                                 enum avs_tmon_trip_type type)\n>> +{\n>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>> +       u32 val = __raw_readl(priv->tmon_base + trip->reg_offs);\n>> +\n>> +       val &= trip->reg_msk;\n>> +       val >>= trip->reg_shift;\n>> +\n>> +       return avs_tmon_code_to_temp(priv->thermal, val);\n>> +}\n>> +\n>> +static void avs_tmon_set_trip_temp(struct brcmstb_thermal_priv *priv,\n>> +                                  enum avs_tmon_trip_type type,\n>> +                                  int temp)\n>> +{\n>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>> +       u32 val, orig;\n>> +\n>> +       dev_dbg(priv->dev, \"set temp %d to %d\\n\", type, temp);\n>> +\n>> +       /* round toward low temp for the low interrupt */\n>> +       val = avs_tmon_temp_to_code(priv->thermal, temp,\n>> +                                   type == TMON_TRIP_TYPE_LOW);\n>> +\n>> +       val <<= trip->reg_shift;\n>> +       val &= trip->reg_msk;\n>> +\n>> +       orig = __raw_readl(priv->tmon_base + trip->reg_offs);\n>> +       orig &= ~trip->reg_msk;\n>> +       orig |= val;\n>> +       __raw_writel(orig, priv->tmon_base + trip->reg_offs);\n>> +}\n>> +\n>> +static int avs_tmon_get_intr_temp(struct brcmstb_thermal_priv *priv)\n>> +{\n>> +       u32 val;\n>> +\n>> +       val = __raw_readl(priv->tmon_base + AVS_TMON_TEMP_INT_CODE);\n>> +       return avs_tmon_code_to_temp(priv->thermal, val);\n>> +}\n>> +\n>> +static irqreturn_t brcmstb_tmon_irq_thread(int irq, void *data)\n>> +{\n>> +       struct brcmstb_thermal_priv *priv = data;\n>> +       int low, high, intr;\n>> +\n>> +       low = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_LOW);\n>> +       high = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_HIGH);\n>> +       intr = avs_tmon_get_intr_temp(priv);\n>> +\n>> +       dev_dbg(priv->dev, \"low/intr/high: %d/%d/%d\\n\",\n>> +                       low, intr, high);\n>> +\n>> +       /* Disable high-temp until next threshold shift */\n>> +       if (intr >= high)\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n>> +       /* Disable low-temp until next threshold shift */\n>> +       if (intr <= low)\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n>> +\n>> +       /*\n>> +        * Notify using the interrupt temperature, in case the temperature\n>> +        * changes before it can next be read out\n>> +        */\n>> +       thermal_zone_device_update(priv->thermal, intr);\n>> +\n>> +       return IRQ_HANDLED;\n>> +}\n>> +\n>> +static int brcmstb_set_trips(void *data, int low, int high)\n>> +{\n>> +       struct brcmstb_thermal_priv *priv = data;\n>> +\n>> +       dev_dbg(priv->dev, \"set trips %d <--> %d\\n\", low, high);\n>> +\n>> +       /*\n>> +        * Disable low-temp if \"low\" is too small. As per thermal\n>> framework\n>> +        * API, we use -INT_MAX rather than INT_MIN.\n>> +        */\n>> +       if (low <= -INT_MAX) {\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n>> +       } else {\n>> +               avs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_LOW, low);\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 1);\n>> +       }\n>> +\n>> +       /* Disable high-temp if \"high\" is too big. */\n>> +       if (high == INT_MAX) {\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n>> +       } else {\n>> +               avs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_HIGH, high);\n>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 1);\n>> +       }\n>> +\n>> +       return 0;\n>> +}\n>> +\n>> +static struct thermal_zone_of_device_ops of_ops = {\n>> +       .get_temp       = brcmstb_get_temp,\n>> +       .set_trips      = brcmstb_set_trips,\n>> +};\n>> +\n>> +static const struct of_device_id brcmstb_thermal_id_table[] = {\n>> +       { .compatible = \"brcm,avs-tmon\" },\n>> +       {},\n>> +};\n>> +MODULE_DEVICE_TABLE(of, brcmstb_thermal_id_table);\n>> +\n>> +static int brcmstb_thermal_probe(struct platform_device *pdev)\n>> +{\n>> +       struct thermal_zone_device *thermal;\n>> +       struct brcmstb_thermal_priv *priv;\n>> +       struct resource *res;\n>> +       int irq, ret;\n>> +\n>> +       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n>> +       if (!priv)\n>> +               return -ENOMEM;\n>> +\n>> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n>> +       priv->tmon_base = devm_ioremap_resource(&pdev->dev, res);\n>> +       if (IS_ERR(priv->tmon_base))\n>> +               return PTR_ERR(priv->tmon_base);\n>> +\n>> +       priv->dev = &pdev->dev;\n>> +       platform_set_drvdata(pdev, priv);\n>> +\n>> +       thermal = thermal_zone_of_sensor_register(&pdev->dev, 0, priv,\n>> &of_ops);\n>> +       if (IS_ERR(thermal)) {\n>> +               ret = PTR_ERR(thermal);\n>> +               dev_err(&pdev->dev, \"could not register sensor: %d\\n\",\n>> ret);\n>> +               return ret;\n>> +       }\n>> +\n>> +       priv->thermal = thermal;\n>> +\n>> +       irq = platform_get_irq(pdev, 0);\n>> +       if (irq < 0) {\n>> +               dev_err(&pdev->dev, \"could not get IRQ\\n\");\n>> +               ret = irq;\n>> +               goto err;\n>> +       }\n>> +       ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,\n>> +                                       brcmstb_tmon_irq_thread,\n>> IRQF_ONESHOT,\n>> +                                       DRV_NAME, priv);\n>> +       if (ret < 0) {\n>> +               dev_err(&pdev->dev, \"could not request IRQ: %d\\n\", ret);\n>> +               goto err;\n>> +       }\n>> +\n>> +       dev_info(&pdev->dev, \"registered AVS TMON of-sensor driver\\n\");\n>> +\n>> +       return 0;\n>> +\n>> +err:\n>> +       thermal_zone_of_sensor_unregister(&pdev->dev, thermal);\n>> +       return ret;\n>> +}\n>> +\n>> +static int brcmstb_thermal_exit(struct platform_device *pdev)\n>> +{\n>> +       struct brcmstb_thermal_priv *priv = platform_get_drvdata(pdev);\n>> +       struct thermal_zone_device *thermal = priv->thermal;\n>> +\n>> +       if (thermal)\n>> +               thermal_zone_of_sensor_unregister(&pdev->dev,\n>> priv->thermal);\n>> +\n>> +       return 0;\n>> +}\n>> +\n>> +static struct platform_driver brcmstb_thermal_driver = {\n>> +       .probe = brcmstb_thermal_probe,\n>> +       .remove = brcmstb_thermal_exit,\n>> +       .driver = {\n>> +               .name = DRV_NAME,\n>> +               .of_match_table = brcmstb_thermal_id_table,\n>> +       },\n>> +};\n>> +module_platform_driver(brcmstb_thermal_driver);\n>> +\n>> +MODULE_LICENSE(\"GPL v2\");\n>> +MODULE_AUTHOR(\"Brian Norris\");\n>> +MODULE_DESCRIPTION(\"Broadcom STB AVS TMON thermal driver\");\n>\n>\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=mmayer-net.20150623.gappssmtp.com\n\theader.i=@mmayer-net.20150623.gappssmtp.com header.b=\"zoHR8i4j\"; \n\tdkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1vTc4zxHz9t3Z\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 07:38:44 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1032265AbdIZVib (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tTue, 26 Sep 2017 17:38:31 -0400","from mail-io0-f195.google.com ([209.85.223.195]:34822 \"EHLO\n\tmail-io0-f195.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S968299AbdIZVi3 (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 26 Sep 2017 17:38:29 -0400","by mail-io0-f195.google.com with SMTP id d16so5178553ioj.2\n\tfor <devicetree@vger.kernel.org>;\n\tTue, 26 Sep 2017 14:38:29 -0700 (PDT)","by 10.79.39.136 with HTTP; Tue, 26 Sep 2017 14:38:27 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=mmayer-net.20150623.gappssmtp.com; s=20150623;\n\th=mime-version:sender:in-reply-to:references:from:date:message-id\n\t:subject:to:cc;\n\tbh=1V8O/qQrYNNtcyEDsGxt1EcgRBlfG95j1XhtnRqRyXY=;\n\tb=zoHR8i4jumNqg7Ni0hdZiNCahFjBIHeC5e62K0nE+Q9m5wQJ6pRrI73x8RC0pic5tn\n\turDxmHQ1iNphQ1n4/krMqy2g/5GbuYqHXRo2E24rjpCoXPOhhyjyoJsTBfFi+8CLnj8j\n\tgf8J1aHClLnWoIx6HLIGgjBrfpW/27duHSzXmxNltl2Qmj0qW86JeAGIKh3OgezW/qKn\n\tFhaDyGhGuzbccoGC8vkvQBlqvKYKbHDgfgP31iBiSMi4TfLTGIMeinjW8yB/kDaVVuZ0\n\tW56NpfR3VA3xczbeCOstf9B3y6i4xC/AY00utEayEZxmIbTOF3nyZ+FjcZ1Qc+gFXHk/\n\tpC+g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:sender:in-reply-to:references:from\n\t:date:message-id:subject:to:cc;\n\tbh=1V8O/qQrYNNtcyEDsGxt1EcgRBlfG95j1XhtnRqRyXY=;\n\tb=D8ItLlxZdrUs4qE5M5gaeMcIZQqqrAuwXspr8IUqJ83fIIZlhYJIucRlSCXK/ZcCrI\n\toMHdXsBSYlUd2h0sOV3xKRTigv22fQBgI+C+nSVM7kKEh42fqW+8WCIaYQj5h09aKIhr\n\tZdZbFv75guBW356osnjl8weWprKFmJXyKFjl/erkZpXXoh6QEa2mthA5eEtyFclFhhUj\n\tF90uuZQFpRUY1ExYDhaEKpLCv12nM4NAghhJqblTCn4BOy5U9mkyTpwyWydXoOWetYIV\n\tlVaq1xkowEERsgNRA+QIfoO6tN7yaNOTyKU5JHNu9Vw12AASXLmb3/PBah8GseEyMNi1\n\tbhpA==","X-Gm-Message-State":"AHPjjUgWOdgL8xYRRqN3s8Knrh9hWOsjqr3haKZkd94fEigEyNYTqdyj\n\twXOB9ndfF63GmakATpcKCk9Si6AHdQROmQ/Tjqqfvg==","X-Google-Smtp-Source":"AOwi7QBqo8VLc4ZtoAN18a4Rl0lJQV8gfKfwbiSF1kuVnAqoZMpR2MfiaCUzr/hQSVHNKZs2YVLzszfPyUE/S0ilSI0=","X-Received":"by 10.107.19.100 with SMTP id b97mr17205328ioj.19.1506461908377; \n\tTue, 26 Sep 2017 14:38:28 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<20170926212800.4879-3-code@mmayer.net>\n\t<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>","From":"Markus Mayer <code@mmayer.net>","Date":"Tue, 26 Sep 2017 14:38:27 -0700","X-Google-Sender-Auth":"TWomOQZGOZ4P-ECGtM5ls9LzQEo","Message-ID":"<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>","Subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","To":"Scott Branden <scott.branden@broadcom.com>","Cc":"Zhang Rui <rui.zhang@intel.com>, Eduardo Valentin <edubezval@gmail.com>, \n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,\n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\tFlorian Fainelli <f.fainelli@gmail.com>, \n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>,  Markus Mayer <mmayer@broadcom.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1775911,"web_url":"http://patchwork.ozlabs.org/comment/1775911/","msgid":"<9bdd9959-da47-9adb-e550-31bf06254310@broadcom.com>","list_archive_url":null,"date":"2017-09-26T22:08:28","subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":68377,"url":"http://patchwork.ozlabs.org/api/people/68377/","name":"Scott Branden","email":"scott.branden@broadcom.com"},"content":"On 17-09-26 02:38 PM, Markus Mayer wrote:\n> On 26 September 2017 at 14:32, Scott Branden <scott.branden@broadcom.com> wrote:\n>> Hi Markus,\n>>\n>>\n>> On 17-09-26 02:27 PM, Markus Mayer wrote:\n>>> From: Brian Norris <computersforpeace@gmail.com>\n>>>\n>>> The AVS TMON core provides temperature readings, a pair of configurable\n>>> high- and low-temperature threshold interrupts, and an emergency\n>>> over-temperature chip reset. The driver utilizes the first two to\n>>> provide temperature readings and high-temperature notifications to\n>>> applications. The over-temperature reset is not exposed to\n>>> applications; this reset threshold is critical to the system and should\n>>> be set with care within the bootloader.\n>>>\n>>> Applications may choose to utilize the notification mechanism, the\n>>> temperature reading mechanism (e.g., through polling), or both.\n>>>\n>>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>\n>>> Signed-off-by: Doug Berger <opendmb@gmail.com>\n>>> Signed-off-by: Markus Mayer <mmayer@broadcom.com>\n>>> ---\n>>>    drivers/thermal/Kconfig                    |   2 +-\n>>>    drivers/thermal/broadcom/Kconfig           |   7 +\n>>>    drivers/thermal/broadcom/Makefile          |   1 +\n>>>    drivers/thermal/broadcom/brcmstb_thermal.c | 387\n>>> +++++++++++++++++++++++++++++\n>>>    4 files changed, 396 insertions(+), 1 deletion(-)\n>>>    create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>>>\n>>> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig\n>>> index 07002df..96774a7 100644\n>>> --- a/drivers/thermal/Kconfig\n>>> +++ b/drivers/thermal/Kconfig\n>>> @@ -408,7 +408,7 @@ config MTK_THERMAL\n>>>            controller present in Mediatek SoCs\n>>>      menu \"Broadcom thermal drivers\"\n>>> -depends on ARCH_BCM || COMPILE_TEST\n>>> +depends on ARCH_BCM || ARCH_BRCMSTB || COMPILE_TEST\n>> No need for this additional depends.  ARCH_BCM is always defined before\n>> ARCH_BRCMSTB can be selected.\n> ARCH_BCM does not exist in arch/arm64/configs/defconfig. ARCH_BRCMSTB\n> does. So, we do need both or the driver won't be built on ARM64.\n> (After internal discussions we went with that approach rather than\n> defining ARCH_BCM on ARM64.)\nGot it.  Looking at our internal iproc tree I see we've done exactly the \nsame with ARCH_BCM_IPROC needing to be added.  We haven't upstreamed\nthe thermal driver needing it yet.\n\nPerhaps we should add ARCH_BCM to ARM64....\n\n>\n>>>    source \"drivers/thermal/broadcom/Kconfig\"\n>>>    endmenu\n>>>    diff --git a/drivers/thermal/broadcom/Kconfig\n>>> b/drivers/thermal/broadcom/Kconfig\n>>> index 42c098e..c106a15 100644\n>>> --- a/drivers/thermal/broadcom/Kconfig\n>>> +++ b/drivers/thermal/broadcom/Kconfig\n>>> @@ -6,6 +6,13 @@ config BCM2835_THERMAL\n>>>          help\n>>>            Support for thermal sensors on Broadcom bcm2835 SoCs.\n>>>    +config BRCMSTB_THERMAL\n>>> +       tristate \"Broadcom STB AVS TMON thermal driver\"\n>>> +       depends on ARCH_BRCMSTB || COMPILE_TEST\n>>> +       help\n>>> +         Enable this driver if you have a Broadcom STB SoC and would like\n>>> +         thermal framework support.\n>>> +\n>>>    config BCM_NS_THERMAL\n>>>          tristate \"Northstar thermal driver\"\n>>>          depends on ARCH_BCM_IPROC || COMPILE_TEST\n>>> diff --git a/drivers/thermal/broadcom/Makefile\n>>> b/drivers/thermal/broadcom/Makefile\n>>> index c6f62e4..fae10ec 100644\n>>> --- a/drivers/thermal/broadcom/Makefile\n>>> +++ b/drivers/thermal/broadcom/Makefile\n>>> @@ -1,2 +1,3 @@\n>>>    obj-$(CONFIG_BCM2835_THERMAL)         += bcm2835_thermal.o\n>>> +obj-$(CONFIG_BRCMSTB_THERMAL)          += brcmstb_thermal.o\n>>>    obj-$(CONFIG_BCM_NS_THERMAL)          += ns-thermal.o\n>>> diff --git a/drivers/thermal/broadcom/brcmstb_thermal.c\n>>> b/drivers/thermal/broadcom/brcmstb_thermal.c\n>>> new file mode 100644\n>>> index 0000000..1919f91\n>>> --- /dev/null\n>>> +++ b/drivers/thermal/broadcom/brcmstb_thermal.c\n>>> @@ -0,0 +1,387 @@\n>>>\n>>> +/*\n>>> + * Broadcom STB AVS TMON thermal sensor driver\n>>> + *\n>>> + * Copyright (c) 2015-2017 Broadcom\n>>> + *\n>>> + * This software is licensed under the terms of the GNU General Public\n>>> + * License version 2, as published by the Free Software Foundation, and\n>>> + * may be copied, distributed, and modified under those terms.\n>>> + *\n>>> + * This program is distributed in the hope that it will be useful,\n>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n>>> + * GNU General Public License for more details.\n>>> + *\n>>> + */\n>>> +\n>>> +#define DRV_NAME       \"brcmstb_thermal\"\n>>> +\n>>> +#define pr_fmt(fmt)    DRV_NAME \": \" fmt\n>>> +\n>>> +#include <linux/bitops.h>\n>>> +#include <linux/device.h>\n>>> +#include <linux/err.h>\n>>> +#include <linux/io.h>\n>>> +#include <linux/irqreturn.h>\n>>> +#include <linux/interrupt.h>\n>>> +#include <linux/kernel.h>\n>>> +#include <linux/module.h>\n>>> +#include <linux/platform_device.h>\n>>> +#include <linux/of_device.h>\n>>> +#include <linux/thermal.h>\n>>> +\n>>> +#define AVS_TMON_STATUS                        0x00\n>>> + #define AVS_TMON_STATUS_valid_msk     BIT(11)\n>>> + #define AVS_TMON_STATUS_data_msk      GENMASK(10, 1)\n>>> + #define AVS_TMON_STATUS_data_shift    1\n>>> +\n>>> +#define AVS_TMON_EN_OVERTEMP_RESET     0x04\n>>> + #define AVS_TMON_EN_OVERTEMP_RESET_msk        BIT(0)\n>>> +\n>>> +#define AVS_TMON_RESET_THRESH          0x08\n>>> + #define AVS_TMON_RESET_THRESH_msk     GENMASK(10, 1)\n>>> + #define AVS_TMON_RESET_THRESH_shift   1\n>>> +\n>>> +#define AVS_TMON_INT_IDLE_TIME         0x10\n>>> +\n>>> +#define AVS_TMON_EN_TEMP_INT_SRCS      0x14\n>>> + #define AVS_TMON_EN_TEMP_INT_SRCS_high        BIT(1)\n>>> + #define AVS_TMON_EN_TEMP_INT_SRCS_low BIT(0)\n>>> +\n>>> +#define AVS_TMON_INT_THRESH            0x18\n>>> + #define AVS_TMON_INT_THRESH_high_msk  GENMASK(26, 17)\n>>> + #define AVS_TMON_INT_THRESH_high_shift        17\n>>> + #define AVS_TMON_INT_THRESH_low_msk   GENMASK(10, 1)\n>>> + #define AVS_TMON_INT_THRESH_low_shift 1\n>>> +\n>>> +#define AVS_TMON_TEMP_INT_CODE         0x1c\n>>> +#define AVS_TMON_TP_TEST_ENABLE                0x20\n>>> +\n>>> +/* Default coefficients */\n>>> +#define AVS_TMON_TEMP_SLOPE            -487\n>>> +#define AVS_TMON_TEMP_OFFSET           410040\n>>> +\n>>> +/* HW related temperature constants */\n>>> +#define AVS_TMON_TEMP_MAX              0x3ff\n>>> +#define AVS_TMON_TEMP_MIN              -88161\n>>> +#define AVS_TMON_TEMP_MASK             AVS_TMON_TEMP_MAX\n>>> +\n>>> +enum avs_tmon_trip_type {\n>>> +       TMON_TRIP_TYPE_LOW = 0,\n>>> +       TMON_TRIP_TYPE_HIGH,\n>>> +       TMON_TRIP_TYPE_RESET,\n>>> +       TMON_TRIP_TYPE_MAX,\n>>> +};\n>>> +\n>>> +struct avs_tmon_trip {\n>>> +       /* HW bit to enable the trip */\n>>> +       u32 enable_offs;\n>>> +       u32 enable_mask;\n>>> +\n>>> +       /* HW field to read the trip temperature */\n>>> +       u32 reg_offs;\n>>> +       u32 reg_msk;\n>>> +       int reg_shift;\n>>> +};\n>>> +\n>>> +static struct avs_tmon_trip avs_tmon_trips[] = {\n>>> +       /* Trips when temperature is below threshold */\n>>> +       [TMON_TRIP_TYPE_LOW] = {\n>>> +               .enable_offs    = AVS_TMON_EN_TEMP_INT_SRCS,\n>>> +               .enable_mask    = AVS_TMON_EN_TEMP_INT_SRCS_low,\n>>> +               .reg_offs       = AVS_TMON_INT_THRESH,\n>>> +               .reg_msk        = AVS_TMON_INT_THRESH_low_msk,\n>>> +               .reg_shift      = AVS_TMON_INT_THRESH_low_shift,\n>>> +       },\n>>> +       /* Trips when temperature is above threshold */\n>>> +       [TMON_TRIP_TYPE_HIGH] = {\n>>> +               .enable_offs    = AVS_TMON_EN_TEMP_INT_SRCS,\n>>> +               .enable_mask    = AVS_TMON_EN_TEMP_INT_SRCS_high,\n>>> +               .reg_offs       = AVS_TMON_INT_THRESH,\n>>> +               .reg_msk        = AVS_TMON_INT_THRESH_high_msk,\n>>> +               .reg_shift      = AVS_TMON_INT_THRESH_high_shift,\n>>> +       },\n>>> +       /* Automatically resets chip when above threshold */\n>>> +       [TMON_TRIP_TYPE_RESET] = {\n>>> +               .enable_offs    = AVS_TMON_EN_OVERTEMP_RESET,\n>>> +               .enable_mask    = AVS_TMON_EN_OVERTEMP_RESET_msk,\n>>> +               .reg_offs       = AVS_TMON_RESET_THRESH,\n>>> +               .reg_msk        = AVS_TMON_RESET_THRESH_msk,\n>>> +               .reg_shift      = AVS_TMON_RESET_THRESH_shift,\n>>> +       },\n>>> +};\n>>> +\n>>> +struct brcmstb_thermal_priv {\n>>> +       void __iomem *tmon_base;\n>>> +       struct device *dev;\n>>> +       struct thermal_zone_device *thermal;\n>>> +};\n>>> +\n>>> +static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int\n>>> *slope,\n>>> +                               int *offset)\n>>> +{\n>>> +       *slope = thermal_zone_get_slope(tz);\n>>> +       *offset = thermal_zone_get_offset(tz);\n>>> +}\n>>> +\n>>> +/* Convert a HW code to a temperature reading (millidegree celsius) */\n>>> +static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz,\n>>> +                                       u32 code)\n>>> +{\n>>> +       const int val = code & AVS_TMON_TEMP_MASK;\n>>> +       int slope, offset;\n>>> +\n>>> +       avs_tmon_get_coeffs(tz, &slope, &offset);\n>>> +\n>>> +       return slope * val + offset;\n>>> +}\n>>> +\n>>> +/*\n>>> + * Convert a temperature value (millidegree celsius) to a HW code\n>>> + *\n>>> + * @temp: temperature to convert\n>>> + * @low: if true, round toward the low side\n>>> + */\n>>> +static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz,\n>>> +                                       int temp, bool low)\n>>> +{\n>>> +       int slope, offset;\n>>> +\n>>> +       if (temp < AVS_TMON_TEMP_MIN)\n>>> +               return AVS_TMON_TEMP_MAX; /* Maximum code value */\n>>> +\n>>> +       avs_tmon_get_coeffs(tz, &slope, &offset);\n>>> +\n>>> +       if (temp >= offset)\n>>> +               return 0;       /* Minimum code value */\n>>> +\n>>> +       if (low)\n>>> +               return (u32)(DIV_ROUND_UP(offset - temp, abs(slope)));\n>>> +       else\n>>> +               return (u32)((offset - temp) / abs(slope));\n>>> +}\n>>> +\n>>> +static int brcmstb_get_temp(void *data, int *temp)\n>>> +{\n>>> +       struct brcmstb_thermal_priv *priv = data;\n>>> +       u32 val;\n>>> +       long t;\n>>> +\n>>> +       val = __raw_readl(priv->tmon_base + AVS_TMON_STATUS);\n>>> +\n>>> +       if (!(val & AVS_TMON_STATUS_valid_msk)) {\n>>> +               dev_err(priv->dev, \"reading not valid\\n\");\n>>> +               return -EIO;\n>>> +       }\n>>> +\n>>> +       val = (val & AVS_TMON_STATUS_data_msk) >>\n>>> AVS_TMON_STATUS_data_shift;\n>>> +\n>>> +       t = avs_tmon_code_to_temp(priv->thermal, val);\n>>> +       if (t < 0)\n>>> +               *temp = 0;\n>>> +       else\n>>> +               *temp = t;\n>>> +\n>>> +       return 0;\n>>> +}\n>>> +\n>>> +static void avs_tmon_trip_enable(struct brcmstb_thermal_priv *priv,\n>>> +                                enum avs_tmon_trip_type type, int en)\n>>> +{\n>>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>>> +       u32 val = __raw_readl(priv->tmon_base + trip->enable_offs);\n>>> +\n>>> +       dev_dbg(priv->dev, \"%sable trip, type %d\\n\", en ? \"en\" : \"dis\",\n>>> type);\n>>> +\n>>> +       if (en)\n>>> +               val |= trip->enable_mask;\n>>> +       else\n>>> +               val &= ~trip->enable_mask;\n>>> +\n>>> +       __raw_writel(val, priv->tmon_base + trip->enable_offs);\n>>> +}\n>>> +\n>>> +static int avs_tmon_get_trip_temp(struct brcmstb_thermal_priv *priv,\n>>> +                                 enum avs_tmon_trip_type type)\n>>> +{\n>>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>>> +       u32 val = __raw_readl(priv->tmon_base + trip->reg_offs);\n>>> +\n>>> +       val &= trip->reg_msk;\n>>> +       val >>= trip->reg_shift;\n>>> +\n>>> +       return avs_tmon_code_to_temp(priv->thermal, val);\n>>> +}\n>>> +\n>>> +static void avs_tmon_set_trip_temp(struct brcmstb_thermal_priv *priv,\n>>> +                                  enum avs_tmon_trip_type type,\n>>> +                                  int temp)\n>>> +{\n>>> +       struct avs_tmon_trip *trip = &avs_tmon_trips[type];\n>>> +       u32 val, orig;\n>>> +\n>>> +       dev_dbg(priv->dev, \"set temp %d to %d\\n\", type, temp);\n>>> +\n>>> +       /* round toward low temp for the low interrupt */\n>>> +       val = avs_tmon_temp_to_code(priv->thermal, temp,\n>>> +                                   type == TMON_TRIP_TYPE_LOW);\n>>> +\n>>> +       val <<= trip->reg_shift;\n>>> +       val &= trip->reg_msk;\n>>> +\n>>> +       orig = __raw_readl(priv->tmon_base + trip->reg_offs);\n>>> +       orig &= ~trip->reg_msk;\n>>> +       orig |= val;\n>>> +       __raw_writel(orig, priv->tmon_base + trip->reg_offs);\n>>> +}\n>>> +\n>>> +static int avs_tmon_get_intr_temp(struct brcmstb_thermal_priv *priv)\n>>> +{\n>>> +       u32 val;\n>>> +\n>>> +       val = __raw_readl(priv->tmon_base + AVS_TMON_TEMP_INT_CODE);\n>>> +       return avs_tmon_code_to_temp(priv->thermal, val);\n>>> +}\n>>> +\n>>> +static irqreturn_t brcmstb_tmon_irq_thread(int irq, void *data)\n>>> +{\n>>> +       struct brcmstb_thermal_priv *priv = data;\n>>> +       int low, high, intr;\n>>> +\n>>> +       low = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_LOW);\n>>> +       high = avs_tmon_get_trip_temp(priv, TMON_TRIP_TYPE_HIGH);\n>>> +       intr = avs_tmon_get_intr_temp(priv);\n>>> +\n>>> +       dev_dbg(priv->dev, \"low/intr/high: %d/%d/%d\\n\",\n>>> +                       low, intr, high);\n>>> +\n>>> +       /* Disable high-temp until next threshold shift */\n>>> +       if (intr >= high)\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n>>> +       /* Disable low-temp until next threshold shift */\n>>> +       if (intr <= low)\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n>>> +\n>>> +       /*\n>>> +        * Notify using the interrupt temperature, in case the temperature\n>>> +        * changes before it can next be read out\n>>> +        */\n>>> +       thermal_zone_device_update(priv->thermal, intr);\n>>> +\n>>> +       return IRQ_HANDLED;\n>>> +}\n>>> +\n>>> +static int brcmstb_set_trips(void *data, int low, int high)\n>>> +{\n>>> +       struct brcmstb_thermal_priv *priv = data;\n>>> +\n>>> +       dev_dbg(priv->dev, \"set trips %d <--> %d\\n\", low, high);\n>>> +\n>>> +       /*\n>>> +        * Disable low-temp if \"low\" is too small. As per thermal\n>>> framework\n>>> +        * API, we use -INT_MAX rather than INT_MIN.\n>>> +        */\n>>> +       if (low <= -INT_MAX) {\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 0);\n>>> +       } else {\n>>> +               avs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_LOW, low);\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_LOW, 1);\n>>> +       }\n>>> +\n>>> +       /* Disable high-temp if \"high\" is too big. */\n>>> +       if (high == INT_MAX) {\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 0);\n>>> +       } else {\n>>> +               avs_tmon_set_trip_temp(priv, TMON_TRIP_TYPE_HIGH, high);\n>>> +               avs_tmon_trip_enable(priv, TMON_TRIP_TYPE_HIGH, 1);\n>>> +       }\n>>> +\n>>> +       return 0;\n>>> +}\n>>> +\n>>> +static struct thermal_zone_of_device_ops of_ops = {\n>>> +       .get_temp       = brcmstb_get_temp,\n>>> +       .set_trips      = brcmstb_set_trips,\n>>> +};\n>>> +\n>>> +static const struct of_device_id brcmstb_thermal_id_table[] = {\n>>> +       { .compatible = \"brcm,avs-tmon\" },\n>>> +       {},\n>>> +};\n>>> +MODULE_DEVICE_TABLE(of, brcmstb_thermal_id_table);\n>>> +\n>>> +static int brcmstb_thermal_probe(struct platform_device *pdev)\n>>> +{\n>>> +       struct thermal_zone_device *thermal;\n>>> +       struct brcmstb_thermal_priv *priv;\n>>> +       struct resource *res;\n>>> +       int irq, ret;\n>>> +\n>>> +       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n>>> +       if (!priv)\n>>> +               return -ENOMEM;\n>>> +\n>>> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n>>> +       priv->tmon_base = devm_ioremap_resource(&pdev->dev, res);\n>>> +       if (IS_ERR(priv->tmon_base))\n>>> +               return PTR_ERR(priv->tmon_base);\n>>> +\n>>> +       priv->dev = &pdev->dev;\n>>> +       platform_set_drvdata(pdev, priv);\n>>> +\n>>> +       thermal = thermal_zone_of_sensor_register(&pdev->dev, 0, priv,\n>>> &of_ops);\n>>> +       if (IS_ERR(thermal)) {\n>>> +               ret = PTR_ERR(thermal);\n>>> +               dev_err(&pdev->dev, \"could not register sensor: %d\\n\",\n>>> ret);\n>>> +               return ret;\n>>> +       }\n>>> +\n>>> +       priv->thermal = thermal;\n>>> +\n>>> +       irq = platform_get_irq(pdev, 0);\n>>> +       if (irq < 0) {\n>>> +               dev_err(&pdev->dev, \"could not get IRQ\\n\");\n>>> +               ret = irq;\n>>> +               goto err;\n>>> +       }\n>>> +       ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,\n>>> +                                       brcmstb_tmon_irq_thread,\n>>> IRQF_ONESHOT,\n>>> +                                       DRV_NAME, priv);\n>>> +       if (ret < 0) {\n>>> +               dev_err(&pdev->dev, \"could not request IRQ: %d\\n\", ret);\n>>> +               goto err;\n>>> +       }\n>>> +\n>>> +       dev_info(&pdev->dev, \"registered AVS TMON of-sensor driver\\n\");\n>>> +\n>>> +       return 0;\n>>> +\n>>> +err:\n>>> +       thermal_zone_of_sensor_unregister(&pdev->dev, thermal);\n>>> +       return ret;\n>>> +}\n>>> +\n>>> +static int brcmstb_thermal_exit(struct platform_device *pdev)\n>>> +{\n>>> +       struct brcmstb_thermal_priv *priv = platform_get_drvdata(pdev);\n>>> +       struct thermal_zone_device *thermal = priv->thermal;\n>>> +\n>>> +       if (thermal)\n>>> +               thermal_zone_of_sensor_unregister(&pdev->dev,\n>>> priv->thermal);\n>>> +\n>>> +       return 0;\n>>> +}\n>>> +\n>>> +static struct platform_driver brcmstb_thermal_driver = {\n>>> +       .probe = brcmstb_thermal_probe,\n>>> +       .remove = brcmstb_thermal_exit,\n>>> +       .driver = {\n>>> +               .name = DRV_NAME,\n>>> +               .of_match_table = brcmstb_thermal_id_table,\n>>> +       },\n>>> +};\n>>> +module_platform_driver(brcmstb_thermal_driver);\n>>> +\n>>> +MODULE_LICENSE(\"GPL v2\");\n>>> +MODULE_AUTHOR(\"Brian Norris\");\n>>> +MODULE_DESCRIPTION(\"Broadcom STB AVS TMON thermal driver\");\n>>\n\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"eCGT4acj\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1w8J1KmBz9t4Z\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 08:08:48 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S937551AbdIZWIg (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tTue, 26 Sep 2017 18:08:36 -0400","from mail-qt0-f171.google.com ([209.85.216.171]:48226 \"EHLO\n\tmail-qt0-f171.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S935880AbdIZWIf (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 26 Sep 2017 18:08:35 -0400","by mail-qt0-f171.google.com with SMTP id q8so11939502qtb.5\n\tfor <devicetree@vger.kernel.org>;\n\tTue, 26 Sep 2017 15:08:34 -0700 (PDT)","from [10.136.13.65] ([192.19.224.250])\n\tby smtp.gmail.com with ESMTPSA id\n\tw46sm7526840qta.84.2017.09.26.15.08.30\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 26 Sep 2017 15:08:32 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n\ts=google; \n\th=subject:to:references:cc:from:message-id:date:user-agent\n\t:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=pOGSkiXNUAD+AYNN2D/uBHiF9YSVUO9InMyPSuUld4w=;\n\tb=eCGT4acja8K/D/rjts9rz/GlHpT7K5N/tC5eLC/OBHX3mygdN+MN9fI1/j39sR/2zT\n\tzdGg488G49Xdz2irO0zZBcq+Afod6m77tJiCbcCQn7kVNBid7UyconHBXv1bJwlUxs59\n\tklDfquiE038CeixDYHO1Wi4IA+iI4ddEIzxbY=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:references:cc:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=pOGSkiXNUAD+AYNN2D/uBHiF9YSVUO9InMyPSuUld4w=;\n\tb=cnhAzo6XY2kinZVr3Hd2V8Ayz+3EHKECRWX9/JqTt1nuqSBKobF6q9QTdLgpJ4391j\n\tKptijXao6l0L03aBG5IwbevSnRBpZVOq+21sogIfIctBsFjxzSATs8/asVytJlBsVeRI\n\tN1bcOOQeE0OtZgntxI3MICyvnUggMdd3CY2y9Xj/bqq01koTfCLCXSOnzY1joIz7AJwd\n\t+1E/4WFFXQBS9FcXUc7rb9l8bJnDwRy5zClwhXXYktzpYu/JizH8qODEDyQGB0ahWfGj\n\tUbFTNu1K2w7ScfJuulsZbP8pfl/azY6vrD5zUQ+n0XTcBsW+RQ4a3y4glZY6S4YFSdW/\n\tLn3Q==","X-Gm-Message-State":"AHPjjUixDeMIDWgHmDhth1/Z+FnXgmzG5wyx9ftR3nH5VOJC7/RFhLXm\n\tcMvo3i4MfUfjGm7JfeibXsnv/Q==","X-Google-Smtp-Source":"AOwi7QBaPeHJPBHk6cp7rv0DeJ3jGc85egoNPj4I8AeoUYjWNulqQs9Yqs/1gAXIAY8kjbM1TCLanA==","X-Received":"by 10.200.53.129 with SMTP id k1mr17168080qtb.243.1506463713789; \n\tTue, 26 Sep 2017 15:08:33 -0700 (PDT)","Subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","To":"Markus Mayer <code@mmayer.net>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<20170926212800.4879-3-code@mmayer.net>\n\t<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>\n\t<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>","Cc":"Zhang Rui <rui.zhang@intel.com>, Eduardo Valentin <edubezval@gmail.com>, \n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,\n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\tFlorian Fainelli <f.fainelli@gmail.com>, \n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>,  Markus Mayer <mmayer@broadcom.com>","From":"Scott Branden <scott.branden@broadcom.com>","Message-ID":"<9bdd9959-da47-9adb-e550-31bf06254310@broadcom.com>","Date":"Tue, 26 Sep 2017 15:08:28 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101\n\tThunderbird/45.8.0","MIME-Version":"1.0","In-Reply-To":"<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"7bit","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1775914,"web_url":"http://patchwork.ozlabs.org/comment/1775914/","msgid":"<9587b134-9727-d7cb-7a46-6df5ee4a0494@gmail.com>","list_archive_url":null,"date":"2017-09-26T22:14:25","subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":2800,"url":"http://patchwork.ozlabs.org/api/people/2800/","name":"Florian Fainelli","email":"f.fainelli@gmail.com"},"content":"On 09/26/2017 03:08 PM, Scott Branden wrote:\n> \n> \n> On 17-09-26 02:38 PM, Markus Mayer wrote:\n>> On 26 September 2017 at 14:32, Scott Branden\n>> <scott.branden@broadcom.com> wrote:\n>>> Hi Markus,\n>>>\n>>>\n>>> On 17-09-26 02:27 PM, Markus Mayer wrote:\n>>>> From: Brian Norris <computersforpeace@gmail.com>\n>>>>\n>>>> The AVS TMON core provides temperature readings, a pair of configurable\n>>>> high- and low-temperature threshold interrupts, and an emergency\n>>>> over-temperature chip reset. The driver utilizes the first two to\n>>>> provide temperature readings and high-temperature notifications to\n>>>> applications. The over-temperature reset is not exposed to\n>>>> applications; this reset threshold is critical to the system and should\n>>>> be set with care within the bootloader.\n>>>>\n>>>> Applications may choose to utilize the notification mechanism, the\n>>>> temperature reading mechanism (e.g., through polling), or both.\n>>>>\n>>>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>\n>>>> Signed-off-by: Doug Berger <opendmb@gmail.com>\n>>>> Signed-off-by: Markus Mayer <mmayer@broadcom.com>\n>>>> ---\n>>>>    drivers/thermal/Kconfig                    |   2 +-\n>>>>    drivers/thermal/broadcom/Kconfig           |   7 +\n>>>>    drivers/thermal/broadcom/Makefile          |   1 +\n>>>>    drivers/thermal/broadcom/brcmstb_thermal.c | 387\n>>>> +++++++++++++++++++++++++++++\n>>>>    4 files changed, 396 insertions(+), 1 deletion(-)\n>>>>    create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>>>>\n>>>> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig\n>>>> index 07002df..96774a7 100644\n>>>> --- a/drivers/thermal/Kconfig\n>>>> +++ b/drivers/thermal/Kconfig\n>>>> @@ -408,7 +408,7 @@ config MTK_THERMAL\n>>>>            controller present in Mediatek SoCs\n>>>>      menu \"Broadcom thermal drivers\"\n>>>> -depends on ARCH_BCM || COMPILE_TEST\n>>>> +depends on ARCH_BCM || ARCH_BRCMSTB || COMPILE_TEST\n>>> No need for this additional depends.  ARCH_BCM is always defined before\n>>> ARCH_BRCMSTB can be selected.\n>> ARCH_BCM does not exist in arch/arm64/configs/defconfig. ARCH_BRCMSTB\n>> does. So, we do need both or the driver won't be built on ARM64.\n>> (After internal discussions we went with that approach rather than\n>> defining ARCH_BCM on ARM64.)\n> Got it.  Looking at our internal iproc tree I see we've done exactly the\n> same with ARCH_BCM_IPROC needing to be added.  We haven't upstreamed\n> the thermal driver needing it yet.\n> \n> Perhaps we should add ARCH_BCM to ARM64....\n\nIf it is just added to satisfy dependencies, I don't see much value in\ndoing that. It does make sense in the ARM v7 multiplatform context, but\noutside of that, not so sur.","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"lFn04eSA\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1wH21Q3Cz9t4X\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 08:14:38 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S969219AbdIZWOg (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tTue, 26 Sep 2017 18:14:36 -0400","from mail-qk0-f193.google.com ([209.85.220.193]:34906 \"EHLO\n\tmail-qk0-f193.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S967632AbdIZWOf (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 26 Sep 2017 18:14:35 -0400","by mail-qk0-f193.google.com with SMTP id o77so7706062qke.2;\n\tTue, 26 Sep 2017 15:14:35 -0700 (PDT)","from [10.112.156.244] ([192.19.255.250])\n\tby smtp.googlemail.com with ESMTPSA id\n\tn85sm7235227qke.53.2017.09.26.15.14.27\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 26 Sep 2017 15:14:33 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=subject:to:cc:references:from:message-id:date:user-agent\n\t:mime-version:in-reply-to:content-language:content-transfer-encoding; \n\tbh=ooFyMy9aXfD6jFtHs2cHJnRxIlXPeVUDwYqniPIa2lQ=;\n\tb=lFn04eSAOL7Hn4V1AaAsJnYWfIHFJItd9JMjoQXGwZbndHw9FMnyUko3c8Z4eAuFOb\n\tnxjaKX6rqxTPQaySK5wzD7httlqw7yBSBE1/hcvkb0KCf31MBJtZYf3IbLKF6A9PajSr\n\tj/tX6bstRHjxvhGqKWRgN37MLvBJvmlBA/rTntbR5Z7nS8hd1x08Ks3Ty66TE3lLlO1+\n\tDBWg3hHRG+opMFjSb5lKvQKToVjyhFGbxTGDo0rk1OjhCGPGgUqSV3DOsOk9dhmAfzz/\n\tv4S3ekpDxLt2tNDjMWcfbOkWfu/Dxo0a8O7Y+oT8a96KCDAlRPBgJRyo2QsBOi+nQagH\n\toJBg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:cc:references:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-language\n\t:content-transfer-encoding;\n\tbh=ooFyMy9aXfD6jFtHs2cHJnRxIlXPeVUDwYqniPIa2lQ=;\n\tb=Vnhh2bFfZ0NM6cQj8Y0ivSD6ckzI6VQgUW6X2zcrO3UtFEI9euDWy0GAKQqSj1eZ/E\n\t4pLWrO9UM7Vl6bQw5MmJh8dCvqcKRgD3W1tppus0WVB3W7kLKRW/BP/UDoqiJYTcgTKv\n\txhlJonnLI88N7dHkkXgN7nnwqTGZETU0iDKIg2nYR5sjUHiHA9zcHwxzHxc6pUHAtCZ4\n\t1fxhOPMMahXFogNEFeJ0GVz3L2b/LyoDiFw6DLEO517kh9CWndyrN6xR4ajfS08bZt6Z\n\t+bvtTVKW0W6rZXFiScNmY+BKMNIMdcOr+L+D1JgK1+RBwQUx5g1kbyWCpV/I/ikwWHzy\n\ty4Uw==","X-Gm-Message-State":"AHPjjUjFE43ND0xIPeFKBHm+jT2qTau+wXoNvUvHO50H/lG+iHXSoOm6\n\tMl22kOz6LwSgbgwgf2SNWh8=","X-Google-Smtp-Source":"AOwi7QDLul1xRjPqYdOmrvD5jQlLs6dZj/Bfh09IxavKnYzXhmKbquD5WTcTV8+Gf5LJkctK0uD4ng==","X-Received":"by 10.55.154.2 with SMTP id c2mr17361335qke.4.1506464074611;\n\tTue, 26 Sep 2017 15:14:34 -0700 (PDT)","Subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","To":"Scott Branden <scott.branden@broadcom.com>,\n\tMarkus Mayer <code@mmayer.net>","Cc":"Zhang Rui <rui.zhang@intel.com>, Eduardo Valentin <edubezval@gmail.com>, \n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,\n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\tFlorian Fainelli <f.fainelli@gmail.com>, \n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>,  Markus Mayer <mmayer@broadcom.com>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<20170926212800.4879-3-code@mmayer.net>\n\t<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>\n\t<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>\n\t<9bdd9959-da47-9adb-e550-31bf06254310@broadcom.com>","From":"Florian Fainelli <f.fainelli@gmail.com>","Message-ID":"<9587b134-9727-d7cb-7a46-6df5ee4a0494@gmail.com>","Date":"Tue, 26 Sep 2017 15:14:25 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.2.1","MIME-Version":"1.0","In-Reply-To":"<9bdd9959-da47-9adb-e550-31bf06254310@broadcom.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-US","Content-Transfer-Encoding":"7bit","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1775918,"web_url":"http://patchwork.ozlabs.org/comment/1775918/","msgid":"<5245cf8e-d35f-c1fd-b7ea-e3a58c468688@broadcom.com>","list_archive_url":null,"date":"2017-09-26T22:17:40","subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":68377,"url":"http://patchwork.ozlabs.org/api/people/68377/","name":"Scott Branden","email":"scott.branden@broadcom.com"},"content":"On 17-09-26 03:14 PM, Florian Fainelli wrote:\n> On 09/26/2017 03:08 PM, Scott Branden wrote:\n>>\n>> On 17-09-26 02:38 PM, Markus Mayer wrote:\n>>> On 26 September 2017 at 14:32, Scott Branden\n>>> <scott.branden@broadcom.com> wrote:\n>>>> Hi Markus,\n>>>>\n>>>>\n>>>> On 17-09-26 02:27 PM, Markus Mayer wrote:\n>>>>> From: Brian Norris <computersforpeace@gmail.com>\n>>>>>\n>>>>> The AVS TMON core provides temperature readings, a pair of configurable\n>>>>> high- and low-temperature threshold interrupts, and an emergency\n>>>>> over-temperature chip reset. The driver utilizes the first two to\n>>>>> provide temperature readings and high-temperature notifications to\n>>>>> applications. The over-temperature reset is not exposed to\n>>>>> applications; this reset threshold is critical to the system and should\n>>>>> be set with care within the bootloader.\n>>>>>\n>>>>> Applications may choose to utilize the notification mechanism, the\n>>>>> temperature reading mechanism (e.g., through polling), or both.\n>>>>>\n>>>>> Signed-off-by: Brian Norris <computersforpeace@gmail.com>\n>>>>> Signed-off-by: Doug Berger <opendmb@gmail.com>\n>>>>> Signed-off-by: Markus Mayer <mmayer@broadcom.com>\n>>>>> ---\n>>>>>     drivers/thermal/Kconfig                    |   2 +-\n>>>>>     drivers/thermal/broadcom/Kconfig           |   7 +\n>>>>>     drivers/thermal/broadcom/Makefile          |   1 +\n>>>>>     drivers/thermal/broadcom/brcmstb_thermal.c | 387\n>>>>> +++++++++++++++++++++++++++++\n>>>>>     4 files changed, 396 insertions(+), 1 deletion(-)\n>>>>>     create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>>>>>\n>>>>> diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig\n>>>>> index 07002df..96774a7 100644\n>>>>> --- a/drivers/thermal/Kconfig\n>>>>> +++ b/drivers/thermal/Kconfig\n>>>>> @@ -408,7 +408,7 @@ config MTK_THERMAL\n>>>>>             controller present in Mediatek SoCs\n>>>>>       menu \"Broadcom thermal drivers\"\n>>>>> -depends on ARCH_BCM || COMPILE_TEST\n>>>>> +depends on ARCH_BCM || ARCH_BRCMSTB || COMPILE_TEST\n>>>> No need for this additional depends.  ARCH_BCM is always defined before\n>>>> ARCH_BRCMSTB can be selected.\n>>> ARCH_BCM does not exist in arch/arm64/configs/defconfig. ARCH_BRCMSTB\n>>> does. So, we do need both or the driver won't be built on ARM64.\n>>> (After internal discussions we went with that approach rather than\n>>> defining ARCH_BCM on ARM64.)\n>> Got it.  Looking at our internal iproc tree I see we've done exactly the\n>> same with ARCH_BCM_IPROC needing to be added.  We haven't upstreamed\n>> the thermal driver needing it yet.\n>>\n>> Perhaps we should add ARCH_BCM to ARM64....\n> If it is just added to satisfy dependencies, I don't see much value in\n> doing that. It does make sense in the ARM v7 multiplatform context, but\n> outside of that, not so sur.\nOK - we'll just continue to add ARCH_BCM_IPROC || ARCH_BRCMSTB \neverywhere as needed.\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"O65vr2CG\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1wM05y2mz9t4X\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tWed, 27 Sep 2017 08:18:04 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S969723AbdIZWRu (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tTue, 26 Sep 2017 18:17:50 -0400","from mail-wm0-f47.google.com ([74.125.82.47]:50265 \"EHLO\n\tmail-wm0-f47.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S969686AbdIZWRs (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Tue, 26 Sep 2017 18:17:48 -0400","by mail-wm0-f47.google.com with SMTP id b195so12289468wmb.5\n\tfor <devicetree@vger.kernel.org>;\n\tTue, 26 Sep 2017 15:17:47 -0700 (PDT)","from [10.136.13.65] ([192.19.224.250])\n\tby smtp.gmail.com with ESMTPSA id\n\tm19sm2551421wma.24.2017.09.26.15.17.42\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 26 Sep 2017 15:17:45 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n\ts=google; \n\th=subject:to:references:cc:from:message-id:date:user-agent\n\t:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=O5z3IFU3+1k96g1MMT8jw43XlhEZhZwuxphnNwqHYm4=;\n\tb=O65vr2CGdnoFzBfuNM6BDwwmIydTLlzVV1fs/FRe9f8Ol1wBa8djXrFNvB8wULXStP\n\tgPR4EbJT0SpT4xokrP097pPLJ4CnQMlY0WUlq8+ehLsImAXzB67fdG3YfKifFF87Fkbj\n\tCA5v+koUVC1W00kxYH5ARtPJXn/ut3IYbJYHg=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:references:cc:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-transfer-encoding;\n\tbh=O5z3IFU3+1k96g1MMT8jw43XlhEZhZwuxphnNwqHYm4=;\n\tb=RhqGq85FdzubF5LIt+0GT2OCM7FLclAkPGwIxMufvLJ8IcTTJmiXrzDrBZZYrrghjc\n\t23+X9zjfUWDTUxqWEp+OUIWNDbXjY7GKGzUhDQorWaqmMsmDGX1iMA9f6XkoosxxlEJI\n\tNBmHyOv2pCNBXf4ByNTi1ytEx6BlsQtPwcLEWf4DgF53T4HNzIK6QB3YXbn86RT6+l43\n\tDabj2Yk9L6gZqkrBTJ0+5D1AiZORgysSMg8/4bSp5IRL1UbUsQ5vD9QlkaiaZNQQhB0h\n\tHW9PTen4VhfwuQ2PeHWirMb9J/Ag1yQDqN4NezB2Y5bIaCGR4lBDbXUl04ugPCsly3h1\n\tepfA==","X-Gm-Message-State":"AHPjjUjDZrHC7no/YgAzeVwVHVkwZl9ZqDmiqjv1PnJeuUXwWNGohPDn\n\tRFGDrsObBdxVRSAOx/OxcLezeg==","X-Google-Smtp-Source":"AOwi7QCV6KWgkQfpp5HxuzysOO2Qwm/mwj5vJN6GL4nqe+ANCg102gldhvW5LEUjMzYBmSuidOsNOw==","X-Received":"by 10.28.208.72 with SMTP id h69mr4810036wmg.134.1506464266690; \n\tTue, 26 Sep 2017 15:17:46 -0700 (PDT)","Subject":"Re: [PATCH v5 2/2] thermal: add brcmstb AVS TMON driver","To":"Florian Fainelli <f.fainelli@gmail.com>, Markus Mayer <code@mmayer.net>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<20170926212800.4879-3-code@mmayer.net>\n\t<4cb98266-6936-7668-fc88-199ac907b437@broadcom.com>\n\t<CANEuBv7pij+szVQZHZxNr4kXcCT0miTsYzG7g28zOmF9MqXKJQ@mail.gmail.com>\n\t<9bdd9959-da47-9adb-e550-31bf06254310@broadcom.com>\n\t<9587b134-9727-d7cb-7a46-6df5ee4a0494@gmail.com>","Cc":"Zhang Rui <rui.zhang@intel.com>, Eduardo Valentin <edubezval@gmail.com>, \n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,\n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>,  Markus Mayer <mmayer@broadcom.com>","From":"Scott Branden <scott.branden@broadcom.com>","Message-ID":"<5245cf8e-d35f-c1fd-b7ea-e3a58c468688@broadcom.com>","Date":"Tue, 26 Sep 2017 15:17:40 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101\n\tThunderbird/45.8.0","MIME-Version":"1.0","In-Reply-To":"<9587b134-9727-d7cb-7a46-6df5ee4a0494@gmail.com>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"7bit","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1794375,"web_url":"http://patchwork.ozlabs.org/comment/1794375/","msgid":"<9f6b61ee-7f53-f158-2642-15212db92781@gmail.com>","list_archive_url":null,"date":"2017-10-26T16:55:50","subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":2800,"url":"http://patchwork.ozlabs.org/api/people/2800/","name":"Florian Fainelli","email":"f.fainelli@gmail.com"},"content":"On 09/26/2017 02:27 PM, Markus Mayer wrote:\n> From: Markus Mayer <mmayer@broadcom.com>\n> \n> This series adds the brcmstb AVS TMON driver.\n> \n> The driver was originally written by Brian Norris.\n\nRui, Eduardo, what's going on here? Can either one of you merge this\ndriver or are we going to miss another merge window?\n\n\n\n> \n> Changes since v4:\n> - disable trip points properly when needed; there was code left-over\n>   from an older iteration of this driver that used long ints, which\n>   resulted in code that was incorrect now that we are using ints\n> - rebased on v4.14-rc1\n> - patches 3 & 4 (turning on CONFIG_BRCMSTB_THERMAL for arm/arm64) are no\n>   longer part of the series, because they were already picked up for 4.14\n> \n> Changes since v3:\n> - Rebased on v4.13-rc3 to resolve conflicts in the MAINTAINERS file\n> \n> Changes since v2:\n> - replaced calls to pr_debug() with calls to dev_dbg() [PATCH 2/4 only]\n> - all other patches are unchanged from v2\n> \n> Changes since v1:\n> - Fixed wording in binding document\n> - Fixed lincensing to consistently mention GPL v2\n> - Use thermal_zone_get_slope() and thermal_zone_get_offset()\n> - Some minor clean-ups\n> \n> Brian Norris (2):\n>   Documentation: devicetree: add binding for Broadcom STB AVS TMON\n>   thermal: add brcmstb AVS TMON driver\n> \n>  .../devicetree/bindings/thermal/brcm,avs-tmon.txt  |  20 ++\n>  MAINTAINERS                                        |   8 +\n>  drivers/thermal/Kconfig                            |   2 +-\n>  drivers/thermal/broadcom/Kconfig                   |   7 +\n>  drivers/thermal/broadcom/Makefile                  |   1 +\n>  drivers/thermal/broadcom/brcmstb_thermal.c         | 387 +++++++++++++++++++++\n>  6 files changed, 424 insertions(+), 1 deletion(-)\n>  create mode 100644 Documentation/devicetree/bindings/thermal/brcm,avs-tmon.txt\n>  create mode 100644 drivers/thermal/broadcom/brcmstb_thermal.c\n>","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"NndlbxTO\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yNCnX0WTdz9t6f\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tFri, 27 Oct 2017 03:55:59 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932291AbdJZQz6 (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tThu, 26 Oct 2017 12:55:58 -0400","from mail-qk0-f193.google.com ([209.85.220.193]:44562 \"EHLO\n\tmail-qk0-f193.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S932127AbdJZQz5 (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Thu, 26 Oct 2017 12:55:57 -0400","by mail-qk0-f193.google.com with SMTP id r64so5134209qkc.1;\n\tThu, 26 Oct 2017 09:55:55 -0700 (PDT)","from [10.112.156.244] ([192.19.255.250])\n\tby smtp.googlemail.com with ESMTPSA id\n\tl20sm3890506qtb.27.2017.10.26.09.55.51\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 26 Oct 2017 09:55:53 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=subject:to:cc:references:from:message-id:date:user-agent\n\t:mime-version:in-reply-to:content-language:content-transfer-encoding; \n\tbh=loIpaat4W4dgSI4LkL7Rox069PG8QKS7eEZDqOBy0a8=;\n\tb=NndlbxTOyPe4psm/I7x7lrAedG1FOlFa0YTuwVB5CA03cT9dLYbPI+8HQ+lUxH4d0P\n\tDoPIQr+YsgXebdw+TgeTUQZdhdtfpxgj44OWy+Pa5QlijG1KSB0dYF8m/8IwZh1bPQlN\n\tJpCpFHr5LokUOwooBUeJ34apNU+xuu+x9F39uuKTjWEWLZTcdyNU2hiN4DwK5s0aZSEU\n\tAU/EptucKRkw6wwamgBFq2vvT90RVFohOp71p6wDj5SzkLGIDBsp34rYuy5Em52nHg4A\n\tbjAO/diS9X8H/4q6MmO1sIZeRQwS8/bARTG6nTHTwgzAGzJScYCwhQ9pm6VZPCMtz14X\n\tvyfQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:cc:references:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-language\n\t:content-transfer-encoding;\n\tbh=loIpaat4W4dgSI4LkL7Rox069PG8QKS7eEZDqOBy0a8=;\n\tb=MEiKUaI7KHAABMibzZuaAb2jq2XMX9Gm5f9U53wIS0iVjOdOTp+16v5uz4bdyNrJiG\n\tnkIlCGQfahyNmp4KWebAdLJS+fj5LUYjcSVFek3khnvGlAttjosxwDjkMfOl/1+Zg5o9\n\t8fygN4e1TcyAGbmN0FyrbQLB6+xgUzQGHJD8uHWpjJMnmDgVvxYNAhWQtAgbdNzXgblc\n\tUZDvFJzCe7ZpbAGndKYpPb3iS+y2cwZ7G6N2QbEOEbW+T7wcVjtQQZulNuz3hthSRQEz\n\tqKm8AL5DvKHazr8PbT3u2lTszNvqX2r5Z6N4vSaFvFrG6RFhqQKviKVjUNCWx3vZJ6+F\n\tXThA==","X-Gm-Message-State":"AMCzsaUy/PKKXAWEInqxsLkBWA40j9afWjQ2W1+vPmhDBabU8YsQQTQh\n\tCFYRa0sV8PCD+Xsy/6TPy2cGOi5v","X-Google-Smtp-Source":"ABhQp+RVY9Fl10MeU+HN2WxvpesFmKRj/bU6LbOSfBa9aijmrAaWXEWfPUcg93I5ruf9gAtjOB7JaQ==","X-Received":"by 10.55.209.27 with SMTP id s27mr9212332qki.4.1509036954582;\n\tThu, 26 Oct 2017 09:55:54 -0700 (PDT)","Subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","To":"Markus Mayer <code@mmayer.net>, Zhang Rui <rui.zhang@intel.com>, Eduardo\n\tValentin <edubezval@gmail.com>, Rob Herring <robh+dt@kernel.org>, \n\tMark Rutland <mark.rutland@arm.com>, Doug Berger <opendmb@gmail.com>, \n\tBrian Norris <computersforpeace@gmail.com>, \n\tGregory Fong <gregory.0xf0@gmail.com>, Florian Fainelli\n\t<f.fainelli@gmail.com>, =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?=\n\t<rafal@milecki.pl>","Cc":"Markus Mayer <mmayer@broadcom.com>,\n\tBroadcom Kernel List <bcm-kernel-feedback-list@broadcom.com>,\n\tPower Management List <linux-pm@vger.kernel.org>,\n\tDevice Tree List <devicetree@vger.kernel.org>,\n\tARM Kernel List <linux-arm-kernel@lists.infradead.org>,\n\tLinux Kernel Mailing List <linux-kernel@vger.kernel.org>","References":"<20170926212800.4879-1-code@mmayer.net>","From":"Florian Fainelli <f.fainelli@gmail.com>","Message-ID":"<9f6b61ee-7f53-f158-2642-15212db92781@gmail.com>","Date":"Thu, 26 Oct 2017 09:55:50 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.2.1","MIME-Version":"1.0","In-Reply-To":"<20170926212800.4879-1-code@mmayer.net>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-US","Content-Transfer-Encoding":"8bit","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1794413,"web_url":"http://patchwork.ozlabs.org/comment/1794413/","msgid":"<20171026182431.GA22718@localhost.localdomain>","list_archive_url":null,"date":"2017-10-26T18:24:33","subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":64527,"url":"http://patchwork.ozlabs.org/api/people/64527/","name":"Eduardo Valentin","email":"edubezval@gmail.com"},"content":"On Thu, Oct 26, 2017 at 09:55:50AM -0700, Florian Fainelli wrote:\n> On 09/26/2017 02:27 PM, Markus Mayer wrote:\n> > From: Markus Mayer <mmayer@broadcom.com>\n> > \n> > This series adds the brcmstb AVS TMON driver.\n> > \n> > The driver was originally written by Brian Norris.\n> \n> Rui, Eduardo, what's going on here? Can either one of you merge this\n> driver or are we going to miss another merge window?\n\nI am taking a look. Thanks for the reminder.\n\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"BOx2V4J+\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yNFm44wQ5z9s7G\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tFri, 27 Oct 2017 05:24:52 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932335AbdJZSYi (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tThu, 26 Oct 2017 14:24:38 -0400","from mail-pg0-f47.google.com ([74.125.83.47]:43249 \"EHLO\n\tmail-pg0-f47.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S932327AbdJZSYh (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Thu, 26 Oct 2017 14:24:37 -0400","by mail-pg0-f47.google.com with SMTP id s75so3355950pgs.0;\n\tThu, 26 Oct 2017 11:24:37 -0700 (PDT)","from localhost.localdomain\n\t([2601:644:8201:32e0:7256:81ff:febd:926d])\n\tby smtp.gmail.com with ESMTPSA id\n\ti11sm12000600pgc.88.2017.10.26.11.24.35\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 26 Oct 2017 11:24:35 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:in-reply-to:user-agent;\n\tbh=CCl1jjHL158TJT0YBiK0RmS8czSeNdVvHjGG7gqT3EA=;\n\tb=BOx2V4J+tkA0G2pGS3CuFgdPwwUKdap98TbdHDymjg+Xe42GXzrjFyuV/OJ/7mC8jn\n\tbmmTp7rLd+J+PvQniyskDJoGYA5x4rc98Eom/GaSo+v4c9Fc1S5+IILJdL7WGzGRltgD\n\tqRd9zrCQVKNpQB4wX075x8F7Wn87vYrBKo/wiFRtgAh2Ockv6/3A+mOUj5LcKYXNklRk\n\tQmCEN65vZ0UMAv3yz0C4h71iZMCGfm0g04Q9qIpwnHXceA7UQaSWr+F8Xk/X0Zq0wZMY\n\tWTHwpLtDMeu/GFtNLbA7xaHfkt3UVku4TTcU+YrtCUakvbALzWahhrolgo5J6xLmn5n/\n\tmq8A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to:user-agent;\n\tbh=CCl1jjHL158TJT0YBiK0RmS8czSeNdVvHjGG7gqT3EA=;\n\tb=KSQ8xoXnnXu/qVOjbX2eStao/0pVX9PfMBX91DvZns9qxUn4bJk5oBwBYv59WwxTGv\n\t8p7wXSMw/1J7guRxzrWAiPVPSSDYmrxDUTiPF9H5iBtTgRtw1uwp2Ume8RwNbax7xpXd\n\tnnylYmILek6uvGgRYQJfsYaADV17WsuNmef2xepL5rEUdfcCRue0lB/pKqrC/Sb2+ZDi\n\tRuCOigCMTmG9F/D++AByT5HAINhV905N6TBGFUxrCBKBVf1gWRAHL5JXqchgukHsLe0Y\n\tjD7BZYpVGnmgc2llP7k/t8MXa2/c+TL1LXcM+FtBay8F7nhdOjZjaI0sOoKnY6bPMha7\n\tKt8w==","X-Gm-Message-State":"AMCzsaXUBjAeerL1LEVr9c4Ap/vs0J0eSoaOLxCEkoh+mTPWRK7wGBmI\n\tprUCSigPIjsSXjClxuKwtwM=","X-Google-Smtp-Source":"ABhQp+ScEvlt8kOXuUiowOb+letV5RzmVz83luzvSf4sI3HA1W6Zxo2Q5CXL+QupO4DXlAg1YlbrLg==","X-Received":"by 10.159.198.70 with SMTP id y6mr5141374plt.334.1509042276654; \n\tThu, 26 Oct 2017 11:24:36 -0700 (PDT)","Date":"Thu, 26 Oct 2017 11:24:33 -0700","From":"Eduardo Valentin <edubezval@gmail.com>","To":"Florian Fainelli <f.fainelli@gmail.com>","Cc":"Markus Mayer <code@mmayer.net>, Zhang Rui <rui.zhang@intel.com>, Rob\n\tHerring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>, \n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>,\n\tMarkus Mayer <mmayer@broadcom.com>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>","Subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","Message-ID":"<20171026182431.GA22718@localhost.localdomain>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<9f6b61ee-7f53-f158-2642-15212db92781@gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<9f6b61ee-7f53-f158-2642-15212db92781@gmail.com>","User-Agent":"Mutt/1.5.23 (2014-03-12)","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}},{"id":1794420,"web_url":"http://patchwork.ozlabs.org/comment/1794420/","msgid":"<20171026183903.GA8990@localhost.localdomain>","list_archive_url":null,"date":"2017-10-26T18:39:05","subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","submitter":{"id":64527,"url":"http://patchwork.ozlabs.org/api/people/64527/","name":"Eduardo Valentin","email":"edubezval@gmail.com"},"content":"On Thu, Oct 26, 2017 at 11:24:33AM -0700, Eduardo Valentin wrote:\n> On Thu, Oct 26, 2017 at 09:55:50AM -0700, Florian Fainelli wrote:\n> > On 09/26/2017 02:27 PM, Markus Mayer wrote:\n> > > From: Markus Mayer <mmayer@broadcom.com>\n> > > \n> > > This series adds the brcmstb AVS TMON driver.\n> > > \n> > > The driver was originally written by Brian Norris.\n> > \n> > Rui, Eduardo, what's going on here? Can either one of you merge this\n> > driver or are we going to miss another merge window?\n> \n> I am taking a look. Thanks for the reminder.\n> \n\nI had no issues with these patches. Queued both in my -linus branch.\nApologizes for letting this to fall into the cracks.\n--\nTo unsubscribe from this list: send the line \"unsubscribe devicetree\" in\nthe body of a message to majordomo@vger.kernel.org\nMore majordomo info at  http://vger.kernel.org/majordomo-info.html","headers":{"Return-Path":"<devicetree-owner@vger.kernel.org>","X-Original-To":"incoming-dt@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming-dt@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=devicetree-owner@vger.kernel.org; receiver=<UNKNOWN>)","ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"JiQTckue\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yNG4c4d9Sz9s7G\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tFri, 27 Oct 2017 05:39:12 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932375AbdJZSjK (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tThu, 26 Oct 2017 14:39:10 -0400","from mail-pg0-f52.google.com ([74.125.83.52]:56992 \"EHLO\n\tmail-pg0-f52.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S932334AbdJZSjJ (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Thu, 26 Oct 2017 14:39:09 -0400","by mail-pg0-f52.google.com with SMTP id m18so3358224pgd.13;\n\tThu, 26 Oct 2017 11:39:09 -0700 (PDT)","from localhost.localdomain\n\t([2601:644:8201:32e0:7256:81ff:febd:926d])\n\tby smtp.gmail.com with ESMTPSA id\n\tg16sm12268976pfd.87.2017.10.26.11.39.07\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 26 Oct 2017 11:39:07 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:in-reply-to:user-agent;\n\tbh=dES80S7eRjX/WcVJ/Eno2LAKoimoGTh6qL4mQHwCf6Q=;\n\tb=JiQTckue0XvLFCvZvGh2fsak/jkDlyx6qWDDtk1z5f6AxPiDjBdBXu+Y4R3YcvIFmf\n\tkCbuZ1nXOedgpOq2HVTMuW9H2aDO1sVHX3qIvIZDDW3R+bpSzkeyYTJ6f4x5J9MaUXof\n\thR4dySmko86Sfsqi88bwsW5OgqannWsuhNKuqVOw2uo00YTVP5pACBmv8rRSBxphLgFw\n\tBT4VTcIT7VWHs4oRLoVMMY9N0ZXDbn38DPrwAIGOczpQQbF6C1tK45iTyGDGghQm0ot1\n\tzQCN5irwyLVJdCIDiQTTvi2A8hCWu7MlE/4a8dJkX/oCBx36ctGFQv8/zhn4k9rFmVVA\n\tD8hQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to:user-agent;\n\tbh=dES80S7eRjX/WcVJ/Eno2LAKoimoGTh6qL4mQHwCf6Q=;\n\tb=mK/YLYj6m4LMD+/Qm0U6mN7pC1emf78zVAZc47WDYt2lIBSqrxOSFJ+PjY68V1eK/B\n\tQJQ1eoDlrC+DzeFzwCSZG0cm4QiJEdkYwFAWSibD/C8DLMlVkJbGno8SKOf+K3JDWwfs\n\tS6awP5e1OwQRgZSF51Zkrs0tC34gtPVIgptPvyekVDKaLxqVHP5EuQfVlmm3ciAarbDJ\n\tr4jiUi2pYUpY3hZtEqFL3Kl6Id00C98o5dREJRNHHoNfmE2y2hk5f18yWNZzYlmtezs/\n\tc/z44lH3xKzpyTtRddfv3wOE+CbbFa1ykx1gj4Oyc2uy8i3Pc3p+vHKLICVTE1l9NCwB\n\tsATw==","X-Gm-Message-State":"AMCzsaXt/Qdo72BAVXGzhkrfqZddT2Jm2NogBkIbkn8lC47Iv2Eg+SdP\n\trJoZKunvcS8XLCPNhjPOM8Y=","X-Google-Smtp-Source":"ABhQp+R17+XKYY6W28CFi1wRuDpzHSXL/eEo32UjhXLEl81rqpAC5EhZYkSQiu5yl0caVQJS2p7qKg==","X-Received":"by 10.98.245.66 with SMTP id n63mr6338799pfh.102.1509043148981; \n\tThu, 26 Oct 2017 11:39:08 -0700 (PDT)","Date":"Thu, 26 Oct 2017 11:39:05 -0700","From":"Eduardo Valentin <edubezval@gmail.com>","To":"Florian Fainelli <f.fainelli@gmail.com>","Cc":"Markus Mayer <code@mmayer.net>, Zhang Rui <rui.zhang@intel.com>, Rob\n\tHerring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>, \n\tDoug Berger <opendmb@gmail.com>, Brian Norris\n\t<computersforpeace@gmail.com>,  Gregory Fong <gregory.0xf0@gmail.com>,\n\t=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>,\n\tMarkus Mayer <mmayer@broadcom.com>, Broadcom Kernel List\n\t<bcm-kernel-feedback-list@broadcom.com>, Power Management List\n\t<linux-pm@vger.kernel.org>, Device Tree List\n\t<devicetree@vger.kernel.org>, ARM Kernel List\n\t<linux-arm-kernel@lists.infradead.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>","Subject":"Re: [PATCH v5 0/2] thermal: add brcmstb AVS TMON driver","Message-ID":"<20171026183903.GA8990@localhost.localdomain>","References":"<20170926212800.4879-1-code@mmayer.net>\n\t<9f6b61ee-7f53-f158-2642-15212db92781@gmail.com>\n\t<20171026182431.GA22718@localhost.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20171026182431.GA22718@localhost.localdomain>","User-Agent":"Mutt/1.5.23 (2014-03-12)","Sender":"devicetree-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<devicetree.vger.kernel.org>","X-Mailing-List":"devicetree@vger.kernel.org"}}]