linux-hwmon.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
diff for duplicates of <c5d8771d-3274-6982-2f9f-903fd5310488@roeck-us.net>

diff --git a/a/1.txt b/N1/1.txt
index eb007b8..d430f1c 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,124 +1,111 @@
-
 On 1/4/19 4:49 PM, Nicolin Chen wrote:
-
-By default, ina3221, as a hardware monitor, continuously measures
-the inputs and generates corresponding data. However, for battery
-powered devices, this mode might be power consuming.
-
-The DT binding doc is updated with a new boolean type property to
-allow changing the default operating mode from consuming mode to
-single-shot mode, which will measure input on demand and then shut
-down to save power.
-
-So this patch implements the DT property accordingly.
-
-Signed-off-by: Nicolin Chen <nicoleots...@gmail.com>
----
-  drivers/hwmon/ina3221.c | 28 ++++++++++++++++++++++++++++
-  1 file changed, 28 insertions(+)
-
-diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
-index e90ccac8bebb..152735659e19 100644
---- a/drivers/hwmon/ina3221.c
-+++ b/drivers/hwmon/ina3221.c
-@@ -91,6 +91,12 @@ enum ina3221_channels {
-        INA3221_NUM_CHANNELS
-  };
-  
-+enum ina3221_modes {
-
-+       INA3221_MODE_SINGLE_SHOT,
-+       INA3221_MODE_CONTINUOUS,
-+       INA3221_NUM_MODES,
-
+> By default, ina3221, as a hardware monitor, continuously measures
+> the inputs and generates corresponding data. However, for battery
+> powered devices, this mode might be power consuming.
+> 
+> The DT binding doc is updated with a new boolean type property to
+> allow changing the default operating mode from consuming mode to
+> single-shot mode, which will measure input on demand and then shut
+> down to save power.
+> 
+> So this patch implements the DT property accordingly.
+> 
+> Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
+> ---
+>   drivers/hwmon/ina3221.c | 28 ++++++++++++++++++++++++++++
+>   1 file changed, 28 insertions(+)
+> 
+> diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
+> index e90ccac8bebb..152735659e19 100644
+> --- a/drivers/hwmon/ina3221.c
+> +++ b/drivers/hwmon/ina3221.c
+> @@ -91,6 +91,12 @@ enum ina3221_channels {
+>   	INA3221_NUM_CHANNELS
+>   };
+>   
+> +enum ina3221_modes {
+> +	INA3221_MODE_SINGLE_SHOT,
+> +	INA3221_MODE_CONTINUOUS,
+> +	INA3221_NUM_MODES,
 
 Is NUM_MODES used anywhere ? Please drop unless there is a reason to keep it.
 
 Guenter
 
-
-+};
-+
-  /**
-   * struct ina3221_input - channel input source specific information
-   * @label: label of channel input source
-@@ -111,6 +117,7 @@ struct ina3221_input {
-   * @inputs: Array of channel input source specific structures
-   * @lock: mutex lock to serialize sysfs attribute accesses
-   * @reg_config: Register value of INA3221_CONFIG
-+ * @mode: Operating mode -- continuous or single-shot
-   */
-  struct ina3221_data {
-        struct device *pm_dev;
-@@ -119,6 +126,7 @@ struct ina3221_data {
-        struct ina3221_input inputs[INA3221_NUM_CHANNELS];
-        struct mutex lock;
-        u32 reg_config;
-+       enum ina3221_modes mode;
-  };
-  
-  static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)
-
-@@ -188,6 +196,11 @@ static int ina3221_read_in(struct device *dev, u32 attr, 
-int channel, long *val)
-                if (!ina3221_is_enabled(ina, channel))
-                        return -ENODATA;
-  
-+		/* Write CONFIG register to trigger a single-shot measurement */
-
-+               if (ina->mode == INA3221_MODE_SINGLE_SHOT)
-+                       regmap_write(ina->regmap, INA3221_CONFIG,
-+                                    ina->reg_config);
-+
-                ret = ina3221_wait_for_data(ina);
-                if (ret)
-                        return ret;
-@@ -232,6 +245,11 @@ static int ina3221_read_curr(struct device *dev, u32 attr,
-                if (!ina3221_is_enabled(ina, channel))
-                        return -ENODATA;
-  
-+		/* Write CONFIG register to trigger a single-shot measurement */
-
-+               if (ina->mode == INA3221_MODE_SINGLE_SHOT)
-+                       regmap_write(ina->regmap, INA3221_CONFIG,
-+                                    ina->reg_config);
-+
-                ret = ina3221_wait_for_data(ina);
-                if (ret)
-                        return ret;
-@@ -617,6 +635,9 @@ static int ina3221_probe_from_dt(struct device *dev, struct 
-ina3221_data *ina)
-        if (!np)
-                return 0;
-  
-+	if (of_property_read_bool(np, "ti,single-shot"))
-
-+               ina->mode = INA3221_MODE_SINGLE_SHOT;
-+
-        for_each_child_of_node(np, child) {
-                ret = ina3221_probe_child_from_dt(dev, child, ina);
-                if (ret)
-@@ -654,6 +675,9 @@ static int ina3221_probe(struct i2c_client *client,
-                }
-        }
-  
-+	/* Hardware default uses the continuous mode */
-
-+       ina->mode = INA3221_MODE_CONTINUOUS;
-+
-        for (i = 0; i < INA3221_NUM_CHANNELS; i++)
-                ina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT;
-  
-@@ -666,6 +690,10 @@ static int ina3221_probe(struct i2c_client *client,
-
-        /* The driver will be reset, so use reset value */
-        ina->reg_config = INA3221_CONFIG_DEFAULT;
-  
-+	/* Clear continuous bit to use single-shot mode */
-
-+       if (ina->mode == INA3221_MODE_SINGLE_SHOT)
-+               ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;
-+
-        /* Disable channels if their inputs are disconnected */
-        for (i = 0; i < INA3221_NUM_CHANNELS; i++) {
-                if (ina->inputs[i].disconnected)
\ No newline at end of file
+> +};
+> +
+>   /**
+>    * struct ina3221_input - channel input source specific information
+>    * @label: label of channel input source
+> @@ -111,6 +117,7 @@ struct ina3221_input {
+>    * @inputs: Array of channel input source specific structures
+>    * @lock: mutex lock to serialize sysfs attribute accesses
+>    * @reg_config: Register value of INA3221_CONFIG
+> + * @mode: Operating mode -- continuous or single-shot
+>    */
+>   struct ina3221_data {
+>   	struct device *pm_dev;
+> @@ -119,6 +126,7 @@ struct ina3221_data {
+>   	struct ina3221_input inputs[INA3221_NUM_CHANNELS];
+>   	struct mutex lock;
+>   	u32 reg_config;
+> +	enum ina3221_modes mode;
+>   };
+>   
+>   static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)
+> @@ -188,6 +196,11 @@ static int ina3221_read_in(struct device *dev, u32 attr, int channel, long *val)
+>   		if (!ina3221_is_enabled(ina, channel))
+>   			return -ENODATA;
+>   
+> +		/* Write CONFIG register to trigger a single-shot measurement */
+> +		if (ina->mode == INA3221_MODE_SINGLE_SHOT)
+> +			regmap_write(ina->regmap, INA3221_CONFIG,
+> +				     ina->reg_config);
+> +
+>   		ret = ina3221_wait_for_data(ina);
+>   		if (ret)
+>   			return ret;
+> @@ -232,6 +245,11 @@ static int ina3221_read_curr(struct device *dev, u32 attr,
+>   		if (!ina3221_is_enabled(ina, channel))
+>   			return -ENODATA;
+>   
+> +		/* Write CONFIG register to trigger a single-shot measurement */
+> +		if (ina->mode == INA3221_MODE_SINGLE_SHOT)
+> +			regmap_write(ina->regmap, INA3221_CONFIG,
+> +				     ina->reg_config);
+> +
+>   		ret = ina3221_wait_for_data(ina);
+>   		if (ret)
+>   			return ret;
+> @@ -617,6 +635,9 @@ static int ina3221_probe_from_dt(struct device *dev, struct ina3221_data *ina)
+>   	if (!np)
+>   		return 0;
+>   
+> +	if (of_property_read_bool(np, "ti,single-shot"))
+> +		ina->mode = INA3221_MODE_SINGLE_SHOT;
+> +
+>   	for_each_child_of_node(np, child) {
+>   		ret = ina3221_probe_child_from_dt(dev, child, ina);
+>   		if (ret)
+> @@ -654,6 +675,9 @@ static int ina3221_probe(struct i2c_client *client,
+>   		}
+>   	}
+>   
+> +	/* Hardware default uses the continuous mode */
+> +	ina->mode = INA3221_MODE_CONTINUOUS;
+> +
+>   	for (i = 0; i < INA3221_NUM_CHANNELS; i++)
+>   		ina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT;
+>   
+> @@ -666,6 +690,10 @@ static int ina3221_probe(struct i2c_client *client,
+>   	/* The driver will be reset, so use reset value */
+>   	ina->reg_config = INA3221_CONFIG_DEFAULT;
+>   
+> +	/* Clear continuous bit to use single-shot mode */
+> +	if (ina->mode == INA3221_MODE_SINGLE_SHOT)
+> +		ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;
+> +
+>   	/* Disable channels if their inputs are disconnected */
+>   	for (i = 0; i < INA3221_NUM_CHANNELS; i++) {
+>   		if (ina->inputs[i].disconnected)
+>
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index 0436780..493b635 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,6 +1,9 @@
 [
   "ref\00020190105004904.17947-1-nicoleotsuka\@gmail.com\0"
 ]
+[
+  "ref\00020190105004904.17947-3-nicoleotsuka\@gmail.com\0"
+]
 [
   "From\0Guenter Roeck <linux\@roeck-us.net>\0"
 ]
@@ -8,10 +11,18 @@
   "Subject\0Re: [PATCH 2/2] hwmon: (ina3221) Implement ti,single-shot DT property\0"
 ]
 [
-  "Date\0Fri, 04 Jan 2019 18:38:32 -0800\0"
+  "Date\0Fri, 4 Jan 2019 18:37:55 -0800\0"
 ]
 [
-  "To\0linux-hwmon\@vger.kernel.org\0"
+  "To\0Nicolin Chen <nicoleotsuka\@gmail.com>",
+  " jdelvare\@suse.com",
+  " robh+dt\@kernel.org",
+  " mark.rutland\@arm.com\0"
+]
+[
+  "Cc\0linux-hwmon\@vger.kernel.org",
+  " devicetree\@vger.kernel.org",
+  " linux-kernel\@vger.kernel.org\0"
 ]
 [
   "\0000:1\0"
@@ -20,130 +31,117 @@
   "b\0"
 ]
 [
-  "\n",
   "On 1/4/19 4:49 PM, Nicolin Chen wrote:\n",
-  "\n",
-  "By default, ina3221, as a hardware monitor, continuously measures\n",
-  "the inputs and generates corresponding data. However, for battery\n",
-  "powered devices, this mode might be power consuming.\n",
-  "\n",
-  "The DT binding doc is updated with a new boolean type property to\n",
-  "allow changing the default operating mode from consuming mode to\n",
-  "single-shot mode, which will measure input on demand and then shut\n",
-  "down to save power.\n",
-  "\n",
-  "So this patch implements the DT property accordingly.\n",
-  "\n",
-  "Signed-off-by: Nicolin Chen <nicoleots...\@gmail.com>\n",
-  "---\n",
-  "  drivers/hwmon/ina3221.c | 28 ++++++++++++++++++++++++++++\n",
-  "  1 file changed, 28 insertions(+)\n",
-  "\n",
-  "diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c\n",
-  "index e90ccac8bebb..152735659e19 100644\n",
-  "--- a/drivers/hwmon/ina3221.c\n",
-  "+++ b/drivers/hwmon/ina3221.c\n",
-  "\@\@ -91,6 +91,12 \@\@ enum ina3221_channels {\n",
-  "        INA3221_NUM_CHANNELS\n",
-  "  };\n",
-  "  \n",
-  "+enum ina3221_modes {\n",
-  "\n",
-  "+       INA3221_MODE_SINGLE_SHOT,\n",
-  "+       INA3221_MODE_CONTINUOUS,\n",
-  "+       INA3221_NUM_MODES,\n",
-  "\n",
+  "> By default, ina3221, as a hardware monitor, continuously measures\n",
+  "> the inputs and generates corresponding data. However, for battery\n",
+  "> powered devices, this mode might be power consuming.\n",
+  "> \n",
+  "> The DT binding doc is updated with a new boolean type property to\n",
+  "> allow changing the default operating mode from consuming mode to\n",
+  "> single-shot mode, which will measure input on demand and then shut\n",
+  "> down to save power.\n",
+  "> \n",
+  "> So this patch implements the DT property accordingly.\n",
+  "> \n",
+  "> Signed-off-by: Nicolin Chen <nicoleotsuka\@gmail.com>\n",
+  "> ---\n",
+  ">   drivers/hwmon/ina3221.c | 28 ++++++++++++++++++++++++++++\n",
+  ">   1 file changed, 28 insertions(+)\n",
+  "> \n",
+  "> diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c\n",
+  "> index e90ccac8bebb..152735659e19 100644\n",
+  "> --- a/drivers/hwmon/ina3221.c\n",
+  "> +++ b/drivers/hwmon/ina3221.c\n",
+  "> \@\@ -91,6 +91,12 \@\@ enum ina3221_channels {\n",
+  ">   \tINA3221_NUM_CHANNELS\n",
+  ">   };\n",
+  ">   \n",
+  "> +enum ina3221_modes {\n",
+  "> +\tINA3221_MODE_SINGLE_SHOT,\n",
+  "> +\tINA3221_MODE_CONTINUOUS,\n",
+  "> +\tINA3221_NUM_MODES,\n",
   "\n",
   "Is NUM_MODES used anywhere ? Please drop unless there is a reason to keep it.\n",
   "\n",
   "Guenter\n",
   "\n",
-  "\n",
-  "+};\n",
-  "+\n",
-  "  /**\n",
-  "   * struct ina3221_input - channel input source specific information\n",
-  "   * \@label: label of channel input source\n",
-  "\@\@ -111,6 +117,7 \@\@ struct ina3221_input {\n",
-  "   * \@inputs: Array of channel input source specific structures\n",
-  "   * \@lock: mutex lock to serialize sysfs attribute accesses\n",
-  "   * \@reg_config: Register value of INA3221_CONFIG\n",
-  "+ * \@mode: Operating mode -- continuous or single-shot\n",
-  "   */\n",
-  "  struct ina3221_data {\n",
-  "        struct device *pm_dev;\n",
-  "\@\@ -119,6 +126,7 \@\@ struct ina3221_data {\n",
-  "        struct ina3221_input inputs[INA3221_NUM_CHANNELS];\n",
-  "        struct mutex lock;\n",
-  "        u32 reg_config;\n",
-  "+       enum ina3221_modes mode;\n",
-  "  };\n",
-  "  \n",
-  "  static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)\n",
-  "\n",
-  "\@\@ -188,6 +196,11 \@\@ static int ina3221_read_in(struct device *dev, u32 attr, \n",
-  "int channel, long *val)\n",
-  "                if (!ina3221_is_enabled(ina, channel))\n",
-  "                        return -ENODATA;\n",
-  "  \n",
-  "+\t\t/* Write CONFIG register to trigger a single-shot measurement */\n",
-  "\n",
-  "+               if (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
-  "+                       regmap_write(ina->regmap, INA3221_CONFIG,\n",
-  "+                                    ina->reg_config);\n",
-  "+\n",
-  "                ret = ina3221_wait_for_data(ina);\n",
-  "                if (ret)\n",
-  "                        return ret;\n",
-  "\@\@ -232,6 +245,11 \@\@ static int ina3221_read_curr(struct device *dev, u32 attr,\n",
-  "                if (!ina3221_is_enabled(ina, channel))\n",
-  "                        return -ENODATA;\n",
-  "  \n",
-  "+\t\t/* Write CONFIG register to trigger a single-shot measurement */\n",
-  "\n",
-  "+               if (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
-  "+                       regmap_write(ina->regmap, INA3221_CONFIG,\n",
-  "+                                    ina->reg_config);\n",
-  "+\n",
-  "                ret = ina3221_wait_for_data(ina);\n",
-  "                if (ret)\n",
-  "                        return ret;\n",
-  "\@\@ -617,6 +635,9 \@\@ static int ina3221_probe_from_dt(struct device *dev, struct \n",
-  "ina3221_data *ina)\n",
-  "        if (!np)\n",
-  "                return 0;\n",
-  "  \n",
-  "+\tif (of_property_read_bool(np, \"ti,single-shot\"))\n",
-  "\n",
-  "+               ina->mode = INA3221_MODE_SINGLE_SHOT;\n",
-  "+\n",
-  "        for_each_child_of_node(np, child) {\n",
-  "                ret = ina3221_probe_child_from_dt(dev, child, ina);\n",
-  "                if (ret)\n",
-  "\@\@ -654,6 +675,9 \@\@ static int ina3221_probe(struct i2c_client *client,\n",
-  "                }\n",
-  "        }\n",
-  "  \n",
-  "+\t/* Hardware default uses the continuous mode */\n",
-  "\n",
-  "+       ina->mode = INA3221_MODE_CONTINUOUS;\n",
-  "+\n",
-  "        for (i = 0; i < INA3221_NUM_CHANNELS; i++)\n",
-  "                ina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT;\n",
-  "  \n",
-  "\@\@ -666,6 +690,10 \@\@ static int ina3221_probe(struct i2c_client *client,\n",
-  "\n",
-  "        /* The driver will be reset, so use reset value */\n",
-  "        ina->reg_config = INA3221_CONFIG_DEFAULT;\n",
-  "  \n",
-  "+\t/* Clear continuous bit to use single-shot mode */\n",
-  "\n",
-  "+       if (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
-  "+               ina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;\n",
-  "+\n",
-  "        /* Disable channels if their inputs are disconnected */\n",
-  "        for (i = 0; i < INA3221_NUM_CHANNELS; i++) {\n",
-  "                if (ina->inputs[i].disconnected)"
+  "> +};\n",
+  "> +\n",
+  ">   /**\n",
+  ">    * struct ina3221_input - channel input source specific information\n",
+  ">    * \@label: label of channel input source\n",
+  "> \@\@ -111,6 +117,7 \@\@ struct ina3221_input {\n",
+  ">    * \@inputs: Array of channel input source specific structures\n",
+  ">    * \@lock: mutex lock to serialize sysfs attribute accesses\n",
+  ">    * \@reg_config: Register value of INA3221_CONFIG\n",
+  "> + * \@mode: Operating mode -- continuous or single-shot\n",
+  ">    */\n",
+  ">   struct ina3221_data {\n",
+  ">   \tstruct device *pm_dev;\n",
+  "> \@\@ -119,6 +126,7 \@\@ struct ina3221_data {\n",
+  ">   \tstruct ina3221_input inputs[INA3221_NUM_CHANNELS];\n",
+  ">   \tstruct mutex lock;\n",
+  ">   \tu32 reg_config;\n",
+  "> +\tenum ina3221_modes mode;\n",
+  ">   };\n",
+  ">   \n",
+  ">   static inline bool ina3221_is_enabled(struct ina3221_data *ina, int channel)\n",
+  "> \@\@ -188,6 +196,11 \@\@ static int ina3221_read_in(struct device *dev, u32 attr, int channel, long *val)\n",
+  ">   \t\tif (!ina3221_is_enabled(ina, channel))\n",
+  ">   \t\t\treturn -ENODATA;\n",
+  ">   \n",
+  "> +\t\t/* Write CONFIG register to trigger a single-shot measurement */\n",
+  "> +\t\tif (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
+  "> +\t\t\tregmap_write(ina->regmap, INA3221_CONFIG,\n",
+  "> +\t\t\t\t     ina->reg_config);\n",
+  "> +\n",
+  ">   \t\tret = ina3221_wait_for_data(ina);\n",
+  ">   \t\tif (ret)\n",
+  ">   \t\t\treturn ret;\n",
+  "> \@\@ -232,6 +245,11 \@\@ static int ina3221_read_curr(struct device *dev, u32 attr,\n",
+  ">   \t\tif (!ina3221_is_enabled(ina, channel))\n",
+  ">   \t\t\treturn -ENODATA;\n",
+  ">   \n",
+  "> +\t\t/* Write CONFIG register to trigger a single-shot measurement */\n",
+  "> +\t\tif (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
+  "> +\t\t\tregmap_write(ina->regmap, INA3221_CONFIG,\n",
+  "> +\t\t\t\t     ina->reg_config);\n",
+  "> +\n",
+  ">   \t\tret = ina3221_wait_for_data(ina);\n",
+  ">   \t\tif (ret)\n",
+  ">   \t\t\treturn ret;\n",
+  "> \@\@ -617,6 +635,9 \@\@ static int ina3221_probe_from_dt(struct device *dev, struct ina3221_data *ina)\n",
+  ">   \tif (!np)\n",
+  ">   \t\treturn 0;\n",
+  ">   \n",
+  "> +\tif (of_property_read_bool(np, \"ti,single-shot\"))\n",
+  "> +\t\tina->mode = INA3221_MODE_SINGLE_SHOT;\n",
+  "> +\n",
+  ">   \tfor_each_child_of_node(np, child) {\n",
+  ">   \t\tret = ina3221_probe_child_from_dt(dev, child, ina);\n",
+  ">   \t\tif (ret)\n",
+  "> \@\@ -654,6 +675,9 \@\@ static int ina3221_probe(struct i2c_client *client,\n",
+  ">   \t\t}\n",
+  ">   \t}\n",
+  ">   \n",
+  "> +\t/* Hardware default uses the continuous mode */\n",
+  "> +\tina->mode = INA3221_MODE_CONTINUOUS;\n",
+  "> +\n",
+  ">   \tfor (i = 0; i < INA3221_NUM_CHANNELS; i++)\n",
+  ">   \t\tina->inputs[i].shunt_resistor = INA3221_RSHUNT_DEFAULT;\n",
+  ">   \n",
+  "> \@\@ -666,6 +690,10 \@\@ static int ina3221_probe(struct i2c_client *client,\n",
+  ">   \t/* The driver will be reset, so use reset value */\n",
+  ">   \tina->reg_config = INA3221_CONFIG_DEFAULT;\n",
+  ">   \n",
+  "> +\t/* Clear continuous bit to use single-shot mode */\n",
+  "> +\tif (ina->mode == INA3221_MODE_SINGLE_SHOT)\n",
+  "> +\t\tina->reg_config &= ~INA3221_CONFIG_MODE_CONTINUOUS;\n",
+  "> +\n",
+  ">   \t/* Disable channels if their inputs are disconnected */\n",
+  ">   \tfor (i = 0; i < INA3221_NUM_CHANNELS; i++) {\n",
+  ">   \t\tif (ina->inputs[i].disconnected)\n",
+  ">"
 ]
 
-6edb5c23824c99ddd1ad7c44720d006bdc3088a269745ee04d6751b7997798eb
+62b443b6913e34d769d0a55e2b04bbc3c7b38436251a7c001f8c5d6c32ddb3bd

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).