Spam detection software, running on the system "lists.denx.de",
has identified this incoming email as possible spam.  The original
message has been attached to this so you can view it or label
similar future email.  If you have any questions, see
@@CONTACT_ADDRESS@@ for details.

Content preview:  Hi Philipp, 在 2017/9/14 4:40, Philipp Tomsich 写道: >
  > > On Wed, 13 Sep 2017, David Wu wrote: > >> The ADC can support some 
channels
   signal-ended some bits Successive >> Approximation >> Register (SAR) A/D
  Converter, like 6-channel and 10-bit. It converts >> the analog >> input 
signal
   into some bits binary digital codes. >> >> Signed-off-by: David Wu 
<david...@rock-chips.com>
   > > Reviewed-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com>
  > > Please see below for requested changes. > >> --- >> drivers/adc/KconfigÂ
            |  9 ++ >> drivers/adc/Makefile         | Â
   1 + >> drivers/adc/rockchip-saradc.c | 188 >> 
++++++++++++++++++++++++++++++++++++++++++
   >> 3 files changed, 198 insertions(+) >> create mode 100644 
drivers/adc/rockchip-saradc.c
   >> >> diff --git a/drivers/adc/Kconfig b/drivers/adc/Kconfig >> index 
e5335f7..830fe0f
   100644 >> --- a/drivers/adc/Kconfig >> +++ b/drivers/adc/Kconfig >> @@ -20,6
   +20,15 @@ config ADC_EXYNOS >> Â Â Â Â Â - 12-bit resolution >> Â Â Â Â Â
   - 600 KSPS of sample rate >> >> +config SARADC_ROCKCHIP >> +Â Â Â bool 
"Enable
   Rockchip SARADC driver" >> +Â Â Â help >> +Â Â Â Â Â This enables driver
  for Rockchip SARADC. >> +Â Â Â Â Â It provides: >> +Â Â Â Â Â - 2~6 analog
   input channels >> +Â Â Â Â Â - 1O-bit resolution >> +Â Â Â Â Â - 1MSPS of
   sample rate >> + >> config ADC_SANDBOX >> Â Â Â Â bool "Enable Sandbox ADC
   test driver" >> Â Â Â Â help >> diff --git a/drivers/adc/Makefile 
b/drivers/adc/Makefile
   >> index cebf26d..4b5aa69 100644 >> --- a/drivers/adc/Makefile >> +++ 
b/drivers/adc/Makefile
   >> @@ -8,3 +8,4 @@ >> obj-$(CONFIG_ADC) += adc-uclass.o >> 
obj-$(CONFIG_ADC_EXYNOS)
   += exynos-adc.o >> obj-$(CONFIG_ADC_SANDBOX) += sandbox.o >> 
+obj-$(CONFIG_SARADC_ROCKCHIP)
   += rockchip-saradc.o > > Do you feel strongly about the "SARADC_ROCKCHIP"
   or would "ADC_ROCKCHIP" > be correct as well? I don't care either way, but
   this is the first > entry here that does not start with CONFIG_ADC_, so I
   am wondering... [...] 

Content analysis details:   (6.8 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
 2.6 RCVD_IN_SBL            RBL: Received via a relay in Spamhaus SBL
                            [211.157.147.132 listed in zen.spamhaus.org]
 1.2 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net
                 [Blocked - see <http://www.spamcop.net/bl.shtml?58.22.7.114>]
 2.4 RCVD_IN_MSPIKE_L5      RBL: Very bad reputation (-5)
                            [211.157.147.132 listed in bl.mailspike.net]
 0.6 RCVD_IN_SORBS_WEB      RBL: SORBS: sender is an abusable web server
                            [58.22.7.114 listed in dnsbl.sorbs.net]
 0.0 RCVD_IN_MSPIKE_BL      Mailspike blacklisted


--- Begin Message ---
Hi Philipp,

在 2017/9/14 4:40, Philipp Tomsich 写道:


On Wed, 13 Sep 2017, David Wu wrote:

The ADC can support some channels signal-ended some bits Successive Approximation Register (SAR) A/D Converter, like 6-channel and 10-bit. It converts the analog
input signal into some bits binary digital codes.

Signed-off-by: David Wu <david...@rock-chips.com>

Reviewed-by: Philipp Tomsich <philipp.toms...@theobroma-systems.com>

Please see below for requested changes.

---
drivers/adc/Kconfig           |   9 ++
drivers/adc/Makefile          |   1 +
drivers/adc/rockchip-saradc.c | 188 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 198 insertions(+)
create mode 100644 drivers/adc/rockchip-saradc.c

diff --git a/drivers/adc/Kconfig b/drivers/adc/Kconfig
index e5335f7..830fe0f 100644
--- a/drivers/adc/Kconfig
+++ b/drivers/adc/Kconfig
@@ -20,6 +20,15 @@ config ADC_EXYNOS
      - 12-bit resolution
      - 600 KSPS of sample rate

+config SARADC_ROCKCHIP
+    bool "Enable Rockchip SARADC driver"
+    help
+      This enables driver for Rockchip SARADC.
+      It provides:
+      - 2~6 analog input channels
+      - 1O-bit resolution
+      - 1MSPS of sample rate
+
config ADC_SANDBOX
    bool "Enable Sandbox ADC test driver"
    help
diff --git a/drivers/adc/Makefile b/drivers/adc/Makefile
index cebf26d..4b5aa69 100644
--- a/drivers/adc/Makefile
+++ b/drivers/adc/Makefile
@@ -8,3 +8,4 @@
obj-$(CONFIG_ADC) += adc-uclass.o
obj-$(CONFIG_ADC_EXYNOS) += exynos-adc.o
obj-$(CONFIG_ADC_SANDBOX) += sandbox.o
+obj-$(CONFIG_SARADC_ROCKCHIP) += rockchip-saradc.o

Do you feel strongly about the "SARADC_ROCKCHIP" or would "ADC_ROCKCHIP" be correct as well?  I don't care either way, but this is the first entry here that does not start with CONFIG_ADC_, so I am wondering...

Yes, we have other adc IPs, like tsadc,vsadc...
So i think SARADC_ROCKCHIP is better.


diff --git a/drivers/adc/rockchip-saradc.c b/drivers/adc/rockchip-saradc.c
new file mode 100644
index 0000000..5c7c3d9
--- /dev/null
+++ b/drivers/adc/rockchip-saradc.c
@@ -0,0 +1,188 @@
+/*
+ * (C) Copyright 2017, Fuzhou Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ *
+ * Rockchip Saradc driver for U-Boot

Should this be SARADC (all uppercase)?

Okay, use SARADC.


+ */
+
+#include <asm/io.h>
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <adc.h>

Please see https://www.denx.de/wiki/U-Boot/CodingStyle for the include order. Please revise.

@Simon: yes, I am quick study ;-)

+
+#define SARADC_DATA            0x00
+
+#define SARADC_STAS            0x04

Please see https://www.denx.de/wiki/U-Boot/CodingStyle for the guidelines on using structures for I/O accesses.  Please revise.

+#define SARADC_STAS_BUSY        BIT(0)
+
+#define SARADC_CTRL            0x08
+#define SARADC_CTRL_POWER_CTRL        BIT(3)
+#define SARADC_CTRL_CHN_MASK        0x7
+#define SARADC_CTRL_IRQ_STATUS        BIT(6)
+#define SARADC_CTRL_IRQ_ENABLE        BIT(5)
+
+#define SARADC_DLY_PU_SOC        0x0c
+
+#define SARADC_TIMEOUT            (100 * 1000)
+
+struct rockchip_saradc_data {
+    int                num_bits;
+    int                num_channels;
+    unsigned long            clk_rate;
+};
+
+struct rockchip_saradc_priv {
+    fdt_addr_t                regs;
+    int                     active_channel;
+    const struct rockchip_saradc_data    *data;
+};
+
+int rockchip_saradc_channel_data(struct udevice *dev, int channel,
+                unsigned int *data)
+{
+    struct rockchip_saradc_priv *priv = dev_get_priv(dev);
+
+    if (channel != priv->active_channel) {
+        error("Requested channel is not active!");
+        return -EINVAL;
+    }
+
+    if ((readl(priv->regs + SARADC_CTRL) & SARADC_CTRL_IRQ_STATUS) != SARADC_CTRL_IRQ_STATUS)
+        return -EBUSY;
+
+    /* Read value */
+    *data = readl(priv->regs + SARADC_DATA);
+    *data &= (1 << priv->data->num_bits) - 1;

This recomputes the data_mask (from below).
Can we just use the data_mask again?

yes,use data_mask is ok.


+
+    /* Power down adc */
+    writel(0, priv->regs + SARADC_CTRL);
+
+    return 0;
+}
+
+int rockchip_saradc_start_channel(struct udevice *dev, int channel)
+{
+    struct rockchip_saradc_priv *priv = dev_get_priv(dev);
+
+    if (channel < 0 || channel >= priv->data->num_channels) {
+        error("Requested channel is invalid!");
+        return -EINVAL;
+    }
+
+    /* 8 clock periods as delay between power up and start cmd */
+    writel(8, priv->regs + SARADC_DLY_PU_SOC);
+
+    /* Select the channel to be used and trigger conversion */
+    writel(SARADC_CTRL_POWER_CTRL
+            | (channel & SARADC_CTRL_CHN_MASK) | SARADC_CTRL_IRQ_ENABLE,

This line does not match the style guideline: it is too wide and the operator should be before the line-break.

Did you run checkpatch or use patman?

maybe lost here 😃.


+           priv->regs + SARADC_CTRL);
+
+    priv->active_channel = channel;
+
+    return 0;
+}
+
+int rockchip_saradc_stop(struct udevice *dev)
+{
+    struct rockchip_saradc_priv *priv = dev_get_priv(dev);
+
+    /* Power down adc */
+    writel(0, priv->regs + SARADC_CTRL);
+
+    priv->active_channel = -1;
+
+    return 0;
+}
+
+int rockchip_saradc_probe(struct udevice *dev)
+{
+    struct rockchip_saradc_priv *priv = dev_get_priv(dev);
+    struct clk clk;
+    int ret;
+
+    ret = clk_get_by_index(dev, 0, &clk);
+    if (ret)
+        return ret;
+
+    ret = clk_set_rate(&clk, priv->data->clk_rate);
+    if (IS_ERR_VALUE(ret))
+        return ret;
+
+    priv->active_channel = -1;
+
+    return 0;
+}
+
+int rockchip_saradc_ofdata_to_platdata(struct udevice *dev)
+{
+    struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev);
+    struct rockchip_saradc_priv *priv = dev_get_priv(dev);
+    struct rockchip_saradc_data *data =
+                    (struct rockchip_saradc_data *)dev_get_driver_data(dev);
+
+    priv->regs = devfdt_get_addr(dev);

Shouldn't this be dev_read_addr?

okay


+    if (priv->regs == FDT_ADDR_T_NONE) {
+        error("Dev: %s - can't get address!", dev->name);
+        return -ENODATA;
+    }
+
+    priv->data = data;
+    uc_pdata->data_mask = (1 << priv->data->num_bits) - 1;;
+    uc_pdata->data_format = ADC_DATA_FORMAT_BIN;
+    uc_pdata->data_timeout_us = SARADC_TIMEOUT / 5;
+    uc_pdata->channel_mask = (1 << priv->data->num_channels) - 1;
+
+    return 0;
+}
+
+static const struct adc_ops rockchip_saradc_ops = {
+    .start_channel = rockchip_saradc_start_channel,
+    .channel_data = rockchip_saradc_channel_data,
+    .stop = rockchip_saradc_stop,
+};
+
+static const struct rockchip_saradc_data saradc_data = {
+    .num_bits = 10,
+    .num_channels = 3,
+    .clk_rate = 1000000,
+};
+
+static const struct rockchip_saradc_data rk3066_tsadc_data = {
+    .num_bits = 12,
+    .num_channels = 2,
+    .clk_rate = 50000,
+};
+
+static const struct rockchip_saradc_data rk3399_saradc_data = {
+    .num_bits = 10,
+    .num_channels = 6,
+    .clk_rate = 1000000,
+};
+
+static const struct udevice_id rockchip_saradc_ids[] = {
+    {
+        .compatible = "rockchip,saradc",
+        .data = (ulong)&saradc_data,
+    },
+    {
+        .compatible = "rockchip,rk3066-tsadc",
+        .data = (ulong)&rk3066_tsadc_data,
+    }, {
+        .compatible = "rockchip,rk3399-saradc",
+        .data = (ulong)&rk3399_saradc_data,
+    },
+    { }
+};
+
+U_BOOT_DRIVER(rockchip_saradc) = {
+    .name        = "rockchip_saradc",
+    .id        = UCLASS_ADC,
+    .of_match    = rockchip_saradc_ids,
+    .ops        = &rockchip_saradc_ops,
+    .probe        = rockchip_saradc_probe,
+    .ofdata_to_platdata = rockchip_saradc_ofdata_to_platdata,
+    .priv_auto_alloc_size = sizeof(struct rockchip_saradc_priv),
+};






--- End Message ---
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to