[{"id":1761875,"web_url":"http://patchwork.ozlabs.org/comment/1761875/","msgid":"<CAAtXAHdgjJLBse8fjTWKcM3BBx+1C3G30TkkrrAKT2qmJo7z_g@mail.gmail.com>","list_archive_url":null,"date":"2017-09-01T17:48:13","subject":"Re: [patch v7 1/4] drivers: jtag: Add JTAG core driver","submitter":{"id":65751,"url":"http://patchwork.ozlabs.org/api/people/65751/","name":"Moritz Fischer","email":"moritz.fischer@ettus.com"},"content":"Nit inline ;-)\n\nOn Fri, Sep 1, 2017 at 9:06 AM, Oleksandr Shamray\n<oleksandrs@mellanox.com> wrote:\n> Initial patch for JTAG friver\n\ns/friver/driver\n> JTAG class driver provide infrastructure to support hardware/software\n> JTAG platform drivers. It provide user layer API interface for flashing\n> and debugging external devices which equipped with JTAG interface\n> using standard transactions.\n>\n> Driver exposes set of IOCTL to user space for:\n> - XFER:\n> - SIR (Scan Instruction Register, IEEE 1149.1 Data Register scan);\n> - SDR (Scan Data Register, IEEE 1149.1 Instruction Register scan);\n> - RUNTEST (Forces the IEEE 1149.1 bus to a run state for a specified\n>   number of clocks).\n> - SIOCFREQ/GIOCFREQ for setting and reading JTAG frequency.\n>\n> Driver core provides set of internal APIs for allocation and\n> registration:\n> - jtag_register;\n> - jtag_unregister;\n> - jtag_alloc;\n> - jtag_free;\n>\n> Platform driver on registration with jtag-core creates the next\n> entry in dev folder:\n> /dev/jtagX\n>\n> Signed-off-by: Oleksandr Shamray <oleksandrs@mellanox.com>\n> Signed-off-by: Jiri Pirko <jiri@mellanox.com>\n> ---\n> v6->v7\n> Notifications from kbuild test robot <lkp@intel.com>\n> - Remove include asm/types.h from jtag.h\n> - Add include <linux/types.h> to jtag.c\n>\n> v5->v6\n> v4->v5\n>\n> v3->v4\n> Comments pointed by Arnd Bergmann <arnd@arndb.de>\n> - change transaction pointer tdio type  to __u64\n> - change internal status type from enum to __u32\n> - reorder jtag_xfer members to aviod the implied padding\n> - add __packed attribute to jtag_xfer and jtag_run_test_idle\n>\n> v2->v3\n> Notifications from kbuild test robot <lkp@intel.com>\n> - Change include path to <linux/types.h> in jtag.h\n>\n> v1->v2\n> Comments pointed by Greg KH <gregkh@linuxfoundation.org>\n> - Change license type from GPLv2/BSD to GPLv2\n> - Change type of variables which crossed user/kernel to __type\n> - Remove \"default n\" from Kconfig\n>\n> Comments pointed by Andrew Lunn <andrew@lunn.ch>\n> - Change list_add_tail in jtag_unregister to list_del\n>\n> Comments pointed by Neil Armstrong <narmstrong@baylibre.com>\n> - Add SPDX-License-Identifier instead of license text\n>\n> Comments pointed by Arnd Bergmann <arnd@arndb.de>\n> - Change __copy_to_user to memdup_user\n> - Change __put_user to put_user\n> - Change type of variables to __type for compatible 32 and 64-bit systems\n> - Add check for maximum xfer data size\n> - Change lookup data mechanism to get jtag data from inode\n> - Add .compat_ioctl to file ops\n> - Add mem alignment for jtag priv data\n>\n> Comments pointed by Tobias Klauser <tklauser@distanz.ch>\n> - Change function names to avoid match with variable types\n> - Fix description for jtag_ru_test_idle in uapi jtag.h\n> - Fix misprints IDEL/IDLE, trough/through\n> ---\n>  Documentation/ioctl/ioctl-number.txt |    2 +\n>  MAINTAINERS                          |    8 +\n>  drivers/Kconfig                      |    2 +\n>  drivers/Makefile                     |    1 +\n>  drivers/jtag/Kconfig                 |   16 ++\n>  drivers/jtag/Makefile                |    1 +\n>  drivers/jtag/jtag.c                  |  312 ++++++++++++++++++++++++++++++++++\n>  include/linux/jtag.h                 |   48 +++++\n>  include/uapi/linux/jtag.h            |  111 ++++++++++++\n>  9 files changed, 501 insertions(+), 0 deletions(-)\n>  create mode 100644 drivers/jtag/Kconfig\n>  create mode 100644 drivers/jtag/Makefile\n>  create mode 100644 drivers/jtag/jtag.c\n>  create mode 100644 include/linux/jtag.h\n>  create mode 100644 include/uapi/linux/jtag.h\n>\n> diff --git a/Documentation/ioctl/ioctl-number.txt b/Documentation/ioctl/ioctl-number.txt\n> index 3e3fdae..1af2508 100644\n> --- a/Documentation/ioctl/ioctl-number.txt\n> +++ b/Documentation/ioctl/ioctl-number.txt\n> @@ -321,6 +321,8 @@ Code  Seq#(hex)     Include File            Comments\n>  0xB0   all     RATIO devices           in development:\n>                                         <mailto:vgo@ratio.de>\n>  0xB1   00-1F   PPPoX                   <mailto:mostrows@styx.uwaterloo.ca>\n> +0xB2   00-0f   linux/jtag.h            JTAG driver\n> +                                       <mailto:oleksandrs@mellanox.com>\n>  0xB3   00      linux/mmc/ioctl.h\n>  0xB4   00-0F   linux/gpio.h            <mailto:linux-gpio@vger.kernel.org>\n>  0xB5   00-0F   uapi/linux/rpmsg.h      <mailto:linux-remoteproc@vger.kernel.org>\n> diff --git a/MAINTAINERS b/MAINTAINERS\n> index 205d397..141aeaf 100644\n> --- a/MAINTAINERS\n> +++ b/MAINTAINERS\n> @@ -7292,6 +7292,14 @@ L:       linux-serial@vger.kernel.org\n>  S:     Maintained\n>  F:     drivers/tty/serial/jsm/\n>\n> +JTAG SUBSYSTEM\n> +M:     Oleksandr Shamray <oleksandrs@mellanox.com>\n> +M:     Vadim Pasternak <vadimp@mellanox.com>\n> +S:     Maintained\n> +F:     include/linux/jtag.h\n> +F:     include/uapi/linux/jtag.h\n> +F:     drivers/jtag/\n> +\n>  K10TEMP HARDWARE MONITORING DRIVER\n>  M:     Clemens Ladisch <clemens@ladisch.de>\n>  L:     linux-hwmon@vger.kernel.org\n> diff --git a/drivers/Kconfig b/drivers/Kconfig\n> index 505c676..2214678 100644\n> --- a/drivers/Kconfig\n> +++ b/drivers/Kconfig\n> @@ -208,4 +208,6 @@ source \"drivers/tee/Kconfig\"\n>\n>  source \"drivers/mux/Kconfig\"\n>\n> +source \"drivers/jtag/Kconfig\"\n> +\n>  endmenu\n> diff --git a/drivers/Makefile b/drivers/Makefile\n> index dfdcda0..6a2059b 100644\n> --- a/drivers/Makefile\n> +++ b/drivers/Makefile\n> @@ -182,3 +182,4 @@ obj-$(CONFIG_FPGA)          += fpga/\n>  obj-$(CONFIG_FSI)              += fsi/\n>  obj-$(CONFIG_TEE)              += tee/\n>  obj-$(CONFIG_MULTIPLEXER)      += mux/\n> +obj-$(CONFIG_JTAG)             += jtag/\n> diff --git a/drivers/jtag/Kconfig b/drivers/jtag/Kconfig\n> new file mode 100644\n> index 0000000..0fad1a3\n> --- /dev/null\n> +++ b/drivers/jtag/Kconfig\n> @@ -0,0 +1,16 @@\n> +menuconfig JTAG\n> +       tristate \"JTAG support\"\n> +       ---help---\n> +         This provides basic core functionality support for jtag class devices\n> +         Hardware equipped with JTAG microcontroller which can be built\n> +         on top of this drivers. Driver exposes the set of IOCTL to the\n> +         user space for:\n> +         SIR (Scan Instruction Register, IEEE 1149.1 Data Register scan);\n> +         SDR (Scan Data Register, IEEE 1149.1 Instruction Register scan);\n> +         RUNTEST (Forces IEEE 1149.1 bus to a run state for specified\n> +         number of clocks).\n> +\n> +         If you want this support, you should say Y here.\n> +\n> +         To compile this driver as a module, choose M here: the module will\n> +         be called jtag.\n> diff --git a/drivers/jtag/Makefile b/drivers/jtag/Makefile\n> new file mode 100644\n> index 0000000..af37493\n> --- /dev/null\n> +++ b/drivers/jtag/Makefile\n> @@ -0,0 +1 @@\n> +obj-$(CONFIG_JTAG)             += jtag.o\n> diff --git a/drivers/jtag/jtag.c b/drivers/jtag/jtag.c\n> new file mode 100644\n> index 0000000..f948d4c\n> --- /dev/null\n> +++ b/drivers/jtag/jtag.c\n> @@ -0,0 +1,312 @@\n> +/*\n> + * drivers/jtag/jtag.c\n> + *\n> + * Copyright (c) 2017 Mellanox Technologies. All rights reserved.\n> + * Copyright (c) 2017 Oleksandr Shamray <oleksandrs@mellanox.com>\n> + *\n> + * Released under the GPLv2 only.\n> + * SPDX-License-Identifier: GPL-2.0\n> + */\n> +\n> +#include <linux/cdev.h>\n> +#include <linux/device.h>\n> +#include <linux/jtag.h>\n> +#include <linux/kernel.h>\n> +#include <linux/list.h>\n> +#include <linux/module.h>\n> +#include <linux/rtnetlink.h>\n> +#include <linux/spinlock.h>\n> +#include <linux/types.h>\n> +#include <uapi/linux/jtag.h>\n> +\n> +struct jtag {\n> +       struct list_head list;\n> +       struct device *dev;\n> +       struct cdev cdev;\n> +       int id;\n> +       spinlock_t lock;\n> +       int open;\n> +       const struct jtag_ops *ops;\n> +       unsigned long priv[0] __aligned(ARCH_DMA_MINALIGN);\n> +};\n> +\n> +static dev_t jtag_devt;\n> +static LIST_HEAD(jtag_list);\n> +static DEFINE_MUTEX(jtag_mutex);\n> +static DEFINE_IDA(jtag_ida);\n> +\n> +void *jtag_priv(struct jtag *jtag)\n> +{\n> +       return jtag->priv;\n> +}\n> +EXPORT_SYMBOL_GPL(jtag_priv);\n> +\n> +static __u64 jtag_copy_from_user(__u64 udata, unsigned long bit_size)\n> +{\n> +       unsigned long size;\n> +       void *kdata;\n> +\n> +       size = DIV_ROUND_UP(bit_size, BITS_PER_BYTE);\n> +       kdata = memdup_user(u64_to_user_ptr(udata), size);\n> +\n> +       return (__u64)(uintptr_t)kdata;\n> +}\n> +\n> +static unsigned long jtag_copy_to_user(__u64 udata, __u64 kdata,\n> +                                      unsigned long bit_size)\n> +{\n> +       unsigned long size;\n> +\n> +       size = DIV_ROUND_UP(bit_size, BITS_PER_BYTE);\n> +\n> +       return copy_to_user(u64_to_user_ptr(udata), jtag_u64_to_ptr(kdata),\n> +                           size);\n> +}\n> +\n> +static struct class jtag_class = {\n> +       .name = \"jtag\",\n> +       .owner = THIS_MODULE,\n> +};\n> +\n> +static int jtag_run_test_idle_op(struct jtag *jtag,\n> +                                struct jtag_run_test_idle *idle)\n> +{\n> +       if (jtag->ops->idle)\n> +               return jtag->ops->idle(jtag, idle);\n> +       else\n> +               return -EOPNOTSUPP;\n> +}\n> +\n> +static int jtag_xfer_op(struct jtag *jtag, struct jtag_xfer *xfer)\n> +{\n> +       if (jtag->ops->xfer)\n> +               return jtag->ops->xfer(jtag, xfer);\n> +       else\n> +               return -EOPNOTSUPP;\n> +}\n> +\n> +static long jtag_ioctl(struct file *file, unsigned int cmd, unsigned long arg)\n> +{\n> +       struct jtag *jtag = file->private_data;\n> +       __u32 *uarg = (__u32 __user *)arg;\n> +       void  *varg = (void __user *)arg;\n> +       struct jtag_run_test_idle idle;\n> +       struct jtag_xfer xfer;\n> +       __u64 tdio_user;\n> +       __u32 value;\n> +       int err;\n> +\n> +       switch (cmd) {\n> +       case JTAG_GIOCFREQ:\n> +               if (jtag->ops->freq_get)\n> +                       err = jtag->ops->freq_get(jtag, &value);\n> +               else\n> +                       err = -EOPNOTSUPP;\n> +               if (err)\n> +                       break;\n> +\n> +               err = put_user(value, uarg);\n> +               break;\n> +\n> +       case JTAG_SIOCFREQ:\n> +               err = __get_user(value, uarg);\n> +\n> +               if (value == 0)\n> +                       err = -EINVAL;\n> +               if (err)\n> +                       break;\n> +\n> +               if (jtag->ops->freq_set)\n> +                       err = jtag->ops->freq_set(jtag, value);\n> +               else\n> +                       err = -EOPNOTSUPP;\n> +               break;\n> +\n> +       case JTAG_IOCRUNTEST:\n> +               if (copy_from_user(&idle, varg,\n> +                                  sizeof(struct jtag_run_test_idle)))\n> +                       return -ENOMEM;\n> +               err = jtag_run_test_idle_op(jtag, &idle);\n> +               break;\n> +\n> +       case JTAG_IOCXFER:\n> +               if (copy_from_user(&xfer, varg, sizeof(struct jtag_xfer)))\n> +                       return -EFAULT;\n> +\n> +               if (xfer.length >= JTAG_MAX_XFER_DATA_LEN)\n> +                       return -EFAULT;\n> +\n> +               tdio_user = xfer.tdio;\n> +               xfer.tdio = jtag_copy_from_user(xfer.tdio, xfer.length);\n> +               if (!xfer.tdio)\n> +                       return -ENOMEM;\n> +\n> +               err = jtag_xfer_op(jtag, &xfer);\n> +               if (jtag_copy_to_user(tdio_user, xfer.tdio, xfer.length)) {\n> +                       kfree(jtag_u64_to_ptr(xfer.tdio));\n> +                       return -EFAULT;\n> +               }\n> +\n> +               kfree(jtag_u64_to_ptr(xfer.tdio));\n> +               xfer.tdio = tdio_user;\n> +               if (copy_to_user(varg, &xfer, sizeof(struct jtag_xfer)))\n> +                       return -EFAULT;\n> +               break;\n> +\n> +       case JTAG_GIOCSTATUS:\n> +               if (jtag->ops->status_get)\n> +                       err = jtag->ops->status_get(jtag, &value);\n> +               else\n> +                       err = -EOPNOTSUPP;\n> +               if (err)\n> +                       break;\n> +\n> +               err = put_user(value, uarg);\n> +               break;\n> +\n> +       default:\n> +               return -EINVAL;\n> +       }\n> +       return err;\n> +}\n> +\n> +#ifdef CONFIG_COMPAT\n> +static long jtag_ioctl_compat(struct file *file, unsigned int cmd,\n> +                             unsigned long arg)\n> +{\n> +       return jtag_ioctl(file, cmd, (unsigned long)compat_ptr(arg));\n> +}\n> +#endif\n> +\n> +static int jtag_open(struct inode *inode, struct file *file)\n> +{\n> +       struct jtag *jtag = container_of(inode->i_cdev, struct jtag, cdev);\n> +\n> +       spin_lock(&jtag->lock);\n> +\n> +       if (jtag->open) {\n> +               dev_info(NULL, \"jtag already opened\\n\");\n> +               spin_unlock(&jtag->lock);\n> +               return -EBUSY;\n> +       }\n> +\n> +       jtag->open++;\n> +       file->private_data = jtag;\n> +       spin_unlock(&jtag->lock);\n> +       return 0;\n> +}\n> +\n> +static int jtag_release(struct inode *inode, struct file *file)\n> +{\n> +       struct jtag *jtag = file->private_data;\n> +\n> +       spin_lock(&jtag->lock);\n> +       jtag->open--;\n> +       spin_unlock(&jtag->lock);\n> +       return 0;\n> +}\n> +\n> +static const struct file_operations jtag_fops = {\n> +       .owner          = THIS_MODULE,\n> +       .open           = jtag_open,\n> +       .release        = jtag_release,\n> +       .llseek         = noop_llseek,\n> +       .unlocked_ioctl = jtag_ioctl,\n> +#ifdef CONFIG_COMPAT\n> +       .compat_ioctl   = jtag_ioctl_compat,\n> +#endif\n> +};\n> +\n> +struct jtag *jtag_alloc(size_t priv_size, const struct jtag_ops *ops)\n> +{\n> +       struct jtag *jtag;\n> +\n> +       jtag = kzalloc(sizeof(*jtag) + round_up(priv_size, ARCH_DMA_MINALIGN),\n> +                      GFP_KERNEL);\n> +       if (!jtag)\n> +               return NULL;\n> +\n> +       jtag->ops = ops;\n> +       return jtag;\n> +}\n> +EXPORT_SYMBOL_GPL(jtag_alloc);\n> +\n> +void jtag_free(struct jtag *jtag)\n> +{\n> +       kfree(jtag);\n> +}\n> +EXPORT_SYMBOL_GPL(jtag_free);\n> +\n> +int jtag_register(struct jtag *jtag)\n> +{\n> +       int id;\n> +       int err;\n> +\n> +       id = ida_simple_get(&jtag_ida, 0, 0, GFP_KERNEL);\n> +       if (id < 0)\n> +               return id;\n> +\n> +       jtag->id = id;\n> +       cdev_init(&jtag->cdev, &jtag_fops);\n> +       jtag->cdev.owner = THIS_MODULE;\n> +       err = cdev_add(&jtag->cdev, MKDEV(MAJOR(jtag_devt), jtag->id), 1);\n> +       if (err)\n> +               goto err_cdev;\n> +\n> +       /* Register this jtag device with the driver core */\n> +       jtag->dev = device_create(&jtag_class, NULL, MKDEV(MAJOR(jtag_devt),\n> +                                                          jtag->id),\n> +                                 NULL, \"jtag%d\", jtag->id);\n> +       if (!jtag->dev)\n> +               goto err_device_create;\n> +\n> +       jtag->open = 0;\n> +       dev_set_drvdata(jtag->dev, jtag);\n> +       spin_lock_init(&jtag->lock);\n> +       mutex_lock(&jtag_mutex);\n> +       list_add_tail(&jtag->list, &jtag_list);\n> +       mutex_unlock(&jtag_mutex);\n> +       return err;\n> +\n> +err_device_create:\n> +       cdev_del(&jtag->cdev);\n> +err_cdev:\n> +       ida_simple_remove(&jtag_ida, id);\n> +       return err;\n> +}\n> +EXPORT_SYMBOL_GPL(jtag_register);\n> +\n> +void jtag_unregister(struct jtag *jtag)\n> +{\n> +       struct device *dev = jtag->dev;\n> +\n> +       mutex_lock(&jtag_mutex);\n> +       list_del(&jtag->list);\n> +       mutex_unlock(&jtag_mutex);\n> +       cdev_del(&jtag->cdev);\n> +       device_unregister(dev);\n> +       ida_simple_remove(&jtag_ida, jtag->id);\n> +}\n> +EXPORT_SYMBOL_GPL(jtag_unregister);\n> +\n> +static int __init jtag_init(void)\n> +{\n> +       int err;\n> +\n> +       err = alloc_chrdev_region(&jtag_devt, 0, 1, \"jtag\");\n> +       if (err)\n> +               return err;\n> +       return class_register(&jtag_class);\n> +}\n> +\n> +static void __exit jtag_exit(void)\n> +{\n> +       class_unregister(&jtag_class);\n> +}\n> +\n> +module_init(jtag_init);\n> +module_exit(jtag_exit);\n> +\n> +MODULE_AUTHOR(\"Oleksandr Shamray <oleksandrs@mellanox.com>\");\n> +MODULE_DESCRIPTION(\"Generic jtag support\");\n> +MODULE_LICENSE(\"GPL v2\");\n> diff --git a/include/linux/jtag.h b/include/linux/jtag.h\n> new file mode 100644\n> index 0000000..f48ae9d\n> --- /dev/null\n> +++ b/include/linux/jtag.h\n> @@ -0,0 +1,48 @@\n> +/*\n> + * drivers/jtag/jtag.c\n> + *\n> + * Copyright (c) 2017 Mellanox Technologies. All rights reserved.\n> + * Copyright (c) 2017 Oleksandr Shamray <oleksandrs@mellanox.com>\n> + *\n> + * Released under the GPLv2 only.\n> + * SPDX-License-Identifier: GPL-2.0\n> + */\n> +\n> +#ifndef __JTAG_H\n> +#define __JTAG_H\n> +\n> +#include <uapi/linux/jtag.h>\n> +\n> +#ifndef ARCH_DMA_MINALIGN\n> +#define ARCH_DMA_MINALIGN 1\n> +#endif\n> +\n> +#define jtag_u64_to_ptr(arg) ((void *)(uintptr_t)arg)\n> +\n> +#define JTAG_MAX_XFER_DATA_LEN 65535\n> +\n> +struct jtag;\n> +/**\n> + * struct jtag_ops - callbacks for jtag control functions:\n> + *\n> + * @freq_get: get frequency function. Filled by device driver\n> + * @freq_set: set frequency function. Filled by device driver\n> + * @status_get: set status function. Filled by device driver\n> + * @idle: set JTAG to idle state function. Filled by device driver\n> + * @xfer: send JTAG xfer function. Filled by device driver\n> + */\n> +struct jtag_ops {\n> +       int (*freq_get)(struct jtag *jtag, __u32 *freq);\n> +       int (*freq_set)(struct jtag *jtag, __u32 freq);\n> +       int (*status_get)(struct jtag *jtag, __u32 *state);\n> +       int (*idle)(struct jtag *jtag, struct jtag_run_test_idle *idle);\n> +       int (*xfer)(struct jtag *jtag, struct jtag_xfer *xfer);\n> +};\n> +\n> +void *jtag_priv(struct jtag *jtag);\n> +int jtag_register(struct jtag *jtag);\n> +void jtag_unregister(struct jtag *jtag);\n> +struct jtag *jtag_alloc(size_t priv_size, const struct jtag_ops *ops);\n> +void jtag_free(struct jtag *jtag);\n> +\n> +#endif /* __JTAG_H */\n> diff --git a/include/uapi/linux/jtag.h b/include/uapi/linux/jtag.h\n> new file mode 100644\n> index 0000000..af22ea6\n> --- /dev/null\n> +++ b/include/uapi/linux/jtag.h\n> @@ -0,0 +1,111 @@\n> +/*\n> + * JTAG class driver\n> + *\n> + * Copyright (c) 2017 Mellanox Technologies. All rights reserved.\n> + * Copyright (c) 2017 Oleksandr Shamray <oleksandrs@mellanox.com>\n> + *\n> + * Released under the GPLv2/BSD.\n> + * SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause\n> + */\n> +\n> +#ifndef __UAPI_LINUX_JTAG_H\n> +#define __UAPI_LINUX_JTAG_H\n> +\n> +/**\n> + * enum jtag_xfer_mode:\n> + *\n> + * @JTAG_XFER_HW_MODE: hardware mode transfer\n> + * @JTAG_XFER_SW_MODE: software mode transfer\n> + */\n> +enum jtag_xfer_mode {\n> +       JTAG_XFER_HW_MODE,\n> +       JTAG_XFER_SW_MODE,\n> +};\n> +\n> +/**\n> + * enum jtag_endstate:\n> + *\n> + * @JTAG_STATE_IDLE: JTAG state machine IDLE state\n> + * @JTAG_STATE_PAUSEIR: JTAG state machine PAUSE_IR state\n> + * @JTAG_STATE_PAUSEDR: JTAG state machine PAUSE_DR state\n> + */\n> +enum jtag_endstate {\n> +       JTAG_STATE_IDLE,\n> +       JTAG_STATE_PAUSEIR,\n> +       JTAG_STATE_PAUSEDR,\n> +};\n> +\n> +/**\n> + * enum jtag_xfer_type:\n> + *\n> + * @JTAG_SIR_XFER: SIR transfer\n> + * @JTAG_SDR_XFER: SDR transfer\n> + */\n> +enum jtag_xfer_type {\n> +       JTAG_SIR_XFER,\n> +       JTAG_SDR_XFER,\n> +};\n> +\n> +/**\n> + * enum jtag_xfer_direction:\n> + *\n> + * @JTAG_READ_XFER: read transfer\n> + * @JTAG_WRITE_XFER: write transfer\n> + */\n> +enum jtag_xfer_direction {\n> +       JTAG_READ_XFER,\n> +       JTAG_WRITE_XFER,\n> +};\n> +\n> +/**\n> + * struct jtag_run_test_idle - forces JTAG state machine to\n> + * RUN_TEST/IDLE state\n> + *\n> + * @mode: access mode\n> + * @reset: 0 - run IDLE/PAUSE from current state\n> + *         1 - go through TEST_LOGIC/RESET state before  IDLE/PAUSE\n> + * @end: completion flag\n> + * @tck: clock counter\n> + *\n> + * Structure represents interface to JTAG device for jtag idle\n> + * execution.\n> + */\n> +struct jtag_run_test_idle {\n> +       __u8    mode;\n> +       __u8    reset;\n> +       __u8    endstate;\n> +       __u8    tck;\n> +};\n> +\n> +/**\n> + * struct jtag_xfer - jtag xfer:\n> + *\n> + * @mode: access mode\n> + * @type: transfer type\n> + * @direction: xfer direction\n> + * @length: xfer bits len\n> + * @tdio : xfer data array\n> + * @endir: xfer end state\n> + *\n> + * Structure represents interface to Aspeed JTAG device for jtag sdr xfer\n> + * execution.\n> + */\n> +struct jtag_xfer {\n> +       __u8    mode;\n> +       __u8    type;\n> +       __u8    direction;\n> +       __u8    endstate;\n> +       __u32   length;\n> +       __u64   tdio;\n> +};\n> +\n> +#define __JTAG_IOCTL_MAGIC     0xb2\n> +\n> +#define JTAG_IOCRUNTEST        _IOW(__JTAG_IOCTL_MAGIC, 0,\\\n> +                            struct jtag_run_test_idle)\n> +#define JTAG_SIOCFREQ  _IOW(__JTAG_IOCTL_MAGIC, 1, unsigned int)\n> +#define JTAG_GIOCFREQ  _IOR(__JTAG_IOCTL_MAGIC, 2, unsigned int)\n> +#define JTAG_IOCXFER   _IOWR(__JTAG_IOCTL_MAGIC, 3, struct jtag_xfer)\n> +#define JTAG_GIOCSTATUS _IOWR(__JTAG_IOCTL_MAGIC, 4, enum jtag_endstate)\n> +\n> +#endif /* __UAPI_LINUX_JTAG_H */\n> --\n> 1.7.1\n>\n> --\n> To unsubscribe from this list: send the line \"unsubscribe devicetree\" in\n> the body of a message to majordomo@vger.kernel.org\n> More majordomo info at  http://vger.kernel.org/majordomo-info.html\n\nThanks,\n\nMoritz\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=ettus-com.20150623.gappssmtp.com\n\theader.i=@ettus-com.20150623.gappssmtp.com header.b=\"s+rGGVPH\"; \n\tdkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xkRYc26T0z9t3x\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tSat,  2 Sep 2017 03:48:32 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752213AbdIARsS (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tFri, 1 Sep 2017 13:48:18 -0400","from mail-wm0-f54.google.com ([74.125.82.54]:38263 \"EHLO\n\tmail-wm0-f54.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752264AbdIARsQ (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Fri, 1 Sep 2017 13:48:16 -0400","by mail-wm0-f54.google.com with SMTP id 187so5577606wmn.1\n\tfor <devicetree@vger.kernel.org>;\n\tFri, 01 Sep 2017 10:48:15 -0700 (PDT)","by 10.28.216.140 with HTTP; Fri, 1 Sep 2017 10:48:13 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ettus-com.20150623.gappssmtp.com; s=20150623;\n\th=mime-version:in-reply-to:references:from:date:message-id:subject:to\n\t:cc; bh=qPxKqT5m2tsSNG31s7P2zOQm4HTRKNXj3V/m5D3gBME=;\n\tb=s+rGGVPH9bD78R6eEwsV16Xx2UALLwsapATM6Hn30gQJJ0zxKF2Zi12XuRJXHFqQfv\n\ttA7RrbOrxYu0YoPDqONNhaVJ9D4xaS9yfaEl3Y+K0CzKKk2LsoCiu9GsVQjLkzDyjehr\n\tpezm7OqpYc2sgLs7sWg1e10HhDjOfJrIljZvKHSX9w+MDC60XZkiESi/+AaovRIMb0YR\n\twjEOn0mZnsFK/9bsoa7tcjcaeANmTMtCJWRG0gC82IpXzpLr9mfz3mQncF0p5Sq6n1nU\n\to+UYcwRWzW8Us1hTieizkMqm5zsCTXGh74cFLexbSnLym0II97Jkgk6Y81mV/qtU8DRo\n\tDvnA==","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:in-reply-to:references:from:date\n\t:message-id:subject:to:cc;\n\tbh=qPxKqT5m2tsSNG31s7P2zOQm4HTRKNXj3V/m5D3gBME=;\n\tb=tYlMIHJGjnNqHP0YKDxlJM/QMSMBPiZUkzXBtVY6D27rzg8RA8rhkMBSgJqlRrHs6g\n\tWBPkmriaNzcTkU5pzs/X1SxytfQ1S89sMS0CaQ1QoGDcCIaSq49DV6dRjavpOasxszHO\n\t+vN5t4YWG/afnBktljUhc6V/Ka6XBxZI5vR8+kqrcHA4HwnxP2bVTcvv9qGfHlGBK7ry\n\tmYl2+2oNqJg38eGUS1XA3OVT1iYX8a1HqmWE58g+0agIxLFQSwuMhIfBW/rzX0zru3qD\n\tzD9CgyvFWMfKRqUDduGmzb5eG2Xbc4T6kjeFIaAjqWF1Wr9tb2tCg9bfbL21/GpYScDZ\n\t4uhQ==","X-Gm-Message-State":"AHPjjUhuVvPj2jQBfUUpCPZaoei+HiiGNqjyI6oJYWffI+NQXVmuvDnp\n\ty4PvBHD+Q7lBNU4MNnhomCd4dgjEOkSP","X-Google-Smtp-Source":"ADKCNb5xaEp2beEMcFeryWssQ+grdoXaPUMwPi3MpUXdbW4fNCrzFM5qxfkeslHYP/rAI5d8lq7TZq6SXHBFfptULlg=","X-Received":"by 10.28.107.76 with SMTP id g73mr893474wmc.66.1504288094176;\n\tFri, 01 Sep 2017 10:48:14 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<1504281966-6199-2-git-send-email-oleksandrs@mellanox.com>","References":"<1504281966-6199-1-git-send-email-oleksandrs@mellanox.com>\n\t<1504281966-6199-2-git-send-email-oleksandrs@mellanox.com>","From":"Moritz Fischer <moritz.fischer@ettus.com>","Date":"Fri, 1 Sep 2017 10:48:13 -0700","Message-ID":"<CAAtXAHdgjJLBse8fjTWKcM3BBx+1C3G30TkkrrAKT2qmJo7z_g@mail.gmail.com>","Subject":"Re: [patch v7 1/4] drivers: jtag: Add JTAG core driver","To":"Oleksandr Shamray <oleksandrs@mellanox.com>","Cc":"Greg KH <gregkh@linuxfoundation.org>, Arnd Bergmann <arnd@arndb.de>,\n\tLinux Kernel Mailing List <linux-kernel@vger.kernel.org>,\n\tlinux-arm-kernel <linux-arm-kernel@lists.infradead.org>,\n\tDevicetree List <devicetree@vger.kernel.org>,\n\topenbmc@lists.ozlabs.org, joel@jms.id.au, jiri@resnulli.us,\n\ttklauser@distanz.ch, linux-serial@vger.kernel.org, mec@shout.net,\n\tvadimp@maellanox.com, system-sw-low-level@mellanox.com,\n\tRob Herring <robh+dt@kernel.org>,\n\topenocd-devel-owner@lists.sourceforge.net,\n\tlinux-api@vger.kernel.org, \"David S. Miller\" <davem@davemloft.net>,\n\tmchehab@kernel.org, Jiri Pirko <jiri@mellanox.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":1764370,"web_url":"http://patchwork.ozlabs.org/comment/1764370/","msgid":"<CAK8P3a1Ym1UxbFyeUBrSBeHnoQh9NtBn5r6iVEjU_1ki_p3W5A@mail.gmail.com>","list_archive_url":null,"date":"2017-09-06T20:52:26","subject":"Re: [patch v7 2/4] drivers: jtag: Add Aspeed SoC 24xx and 25xx\n\tfamilies JTAG master driver","submitter":{"id":30,"url":"http://patchwork.ozlabs.org/api/people/30/","name":"Arnd Bergmann","email":"arnd@arndb.de"},"content":"On Fri, Sep 1, 2017 at 6:06 PM, Oleksandr Shamray\n<oleksandrs@mellanox.com> wrote:\n> Driver adds support of Aspeed 2500/2400 series SOC JTAG master controller.\n>\n> Driver implements the following jtag ops:\n> - freq_get;\n> - freq_set;\n> - status_get;\n> - idle;\n> - xfer;\n>\n> It has been tested on Mellanox system with BMC equipped with\n> Aspeed 2520 SoC for programming CPLD devices.\n>\n> Signed-off-by: Oleksandr Shamray <oleksandrs@mellanox.com>\n> Signed-off-by: Jiri Pirko <jiri@mellanox.com>\n\nNo further comments about this driver, if there is agreement about the subsystem\nin general, it looks good to go in.\n\nAcked-by: Arnd Bergmann <arnd@arndb.de\n\n       Arnd\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=\"Yqc5SenU\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xnbRW3s63z9sRY\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tThu,  7 Sep 2017 06:54:15 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752306AbdIFUw3 (ORCPT\n\t<rfc822;incoming-dt@patchwork.ozlabs.org>);\n\tWed, 6 Sep 2017 16:52:29 -0400","from mail-oi0-f68.google.com ([209.85.218.68]:36212 \"EHLO\n\tmail-oi0-f68.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752163AbdIFUw1 (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Wed, 6 Sep 2017 16:52:27 -0400","by mail-oi0-f68.google.com with SMTP id g15so5464829oib.3;\n\tWed, 06 Sep 2017 13:52:27 -0700 (PDT)","by 10.157.91.35 with HTTP; Wed, 6 Sep 2017 13:52:26 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=mime-version:sender:in-reply-to:references:from:date:message-id\n\t:subject:to:cc;\n\tbh=D/QUZ+aqKHxUztFWJ//HuKp/WM/Feb70kopqnRjeGeA=;\n\tb=Yqc5SenUrZbq5CXvSze6uCelJAfh4XNoRcoDo3evQbqbWmBBFXAes1begBp8xFF7AY\n\t0Ji9N3aoMEo5FCmrDsAQGOOmQrdrjKXxNV+QPgrYmJf5JEXuREFOnZWp5vBbXSwRel7a\n\tUjDo7e+LZfn9h2iu5KFE4f+B7U8rMmB2M0uSMucIlYNun+rKIv1SLB0Lk1tDdSyWZfJT\n\tRtyJD2qNSDLUHxHRnjWu6IfwqSZZ/DAgDoydZOFhi0Zx44ELAATYehIyyckiPua3amAw\n\th6JNi/7E6oEhfLJm2nhut6wjx+1DZ4smxPoXutyck+3ab/pVnQGdIgTt4xZtUz75cBK4\n\tPH3g==","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=D/QUZ+aqKHxUztFWJ//HuKp/WM/Feb70kopqnRjeGeA=;\n\tb=umDIYXZYbdp7VTJHcecPArXNRMOXCDKzhMsRqNR4WsvpPpCaw2opcOCj70zc5HDj4U\n\t4r88+Toi6NJ00VBS+AyLg8zvbjJImybxEhPvprsZfaPW95100OjJM+kmJJYL/hI79k9S\n\t/BDKR8KaToFtudBtpB1vr6Wb5QsJWIUOlzh5QmZ0RukYQIuXR19Le7BT8oC8xfLtsOpu\n\tMMakAvqiowYhrf2q0hBndOZn9sgyH/i3h2vDxXkeRj9uHai3HKVaeZHW7mzCnzShCXNW\n\t1faklNXdWkpYkyNTdV6P5QGrOct8Fl2CCyqeaYQsPubVhRjuSmidrH5e/m462UHikfAe\n\trTVQ==","X-Gm-Message-State":"AHPjjUgtqikrv5ZCtm4sXrWEb7Mfa6cSLy0V0mn6NqnWBgfLW0bMOFjk\n\tYhL92vIvt3G9VMzC8mm+Ky+UrLcoRA==","X-Google-Smtp-Source":"ADKCNb5GTz+pdRx55021OYWz4jkvsomPp5RtZWa0gpS1NnNaeCF5r/A1Mv6g4euqA0r/IpnWJf3IejFZiT/4Knawylo=","X-Received":"by 10.202.193.65 with SMTP id r62mr519039oif.313.1504731147008; \n\tWed, 06 Sep 2017 13:52:27 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<1504281966-6199-3-git-send-email-oleksandrs@mellanox.com>","References":"<1504281966-6199-1-git-send-email-oleksandrs@mellanox.com>\n\t<1504281966-6199-3-git-send-email-oleksandrs@mellanox.com>","From":"Arnd Bergmann <arnd@arndb.de>","Date":"Wed, 6 Sep 2017 22:52:26 +0200","X-Google-Sender-Auth":"5paTLAYr-MhdgCIcI1DQIdEMlRQ","Message-ID":"<CAK8P3a1Ym1UxbFyeUBrSBeHnoQh9NtBn5r6iVEjU_1ki_p3W5A@mail.gmail.com>","Subject":"Re: [patch v7 2/4] drivers: jtag: Add Aspeed SoC 24xx and 25xx\n\tfamilies JTAG master driver","To":"Oleksandr Shamray <oleksandrs@mellanox.com>","Cc":"gregkh <gregkh@linuxfoundation.org>, Linux Kernel Mailing List\n\t<linux-kernel@vger.kernel.org>, Linux ARM\n\t<linux-arm-kernel@lists.infradead.org>, devicetree@vger.kernel.org,\n\tOpenBMC Maillist <openbmc@lists.ozlabs.org>, \n\tJoel Stanley <joel@jms.id.au>, =?utf-8?b?SmnFmcOtIFDDrXJrbw==?=\n\t<jiri@resnulli.us>,  Tobias Klauser <tklauser@distanz.ch>,\n\tlinux-serial@vger.kernel.org, mec@shout.net, vadimp@maellanox.com, \n\tsystem-sw-low-level@mellanox.com, Rob Herring <robh+dt@kernel.org>, \n\topenocd-devel-owner@lists.sourceforge.net, Linux API\n\t<linux-api@vger.kernel.org>, David Miller <davem@davemloft.net>, \n\tMauro Carvalho Chehab\n\t<mchehab@kernel.org>, Jiri Pirko <jiri@mellanox.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":1765059,"web_url":"http://patchwork.ozlabs.org/comment/1765059/","msgid":"<CACPK8XeV9aBY+avimjiOsKZgzj-C6MTeaR0tJC-Tu+zWiAoWPw@mail.gmail.com>","list_archive_url":null,"date":"2017-09-08T03:36:57","subject":"Re: [patch v7 2/4] drivers: jtag: Add Aspeed SoC 24xx and 25xx\n\tfamilies JTAG master driver","submitter":{"id":48628,"url":"http://patchwork.ozlabs.org/api/people/48628/","name":"Joel Stanley","email":"joel@jms.id.au"},"content":"Hello Oleksandr,\n\nOn Sat, Sep 2, 2017 at 1:36 AM, Oleksandr Shamray\n<oleksandrs@mellanox.com> wrote:\n> Driver adds support of Aspeed 2500/2400 series SOC JTAG master controller.\n\nLooks good. I have some small comments. The most important is the\ncompatible string.\n\n\n> --- a/drivers/jtag/Kconfig\n> +++ b/drivers/jtag/Kconfig\n> @@ -14,3 +14,16 @@ menuconfig JTAG\n>\n>           To compile this driver as a module, choose M here: the module will\n>           be called jtag.\n> +\n> +menuconfig JTAG_ASPEED\n> +       tristate \"Aspeed SoC JTAG controller support\"\n> +       depends on JTAG && HAS_IOMEM\n\nYou could add this if you want:\n\n depends ARCH_ASPEED || COMPILE_TEST\n\n> +       ---help---\n> +         This provides a support for Aspeed JTAG device, equipped on\n> +         Aspeed SoC 24xx and 25xx families. Drivers allows programming\n> +         of hardware devices, connected to SoC through the JTAG interface.\n> +\n\n> +\n> +static char *end_status_str[] = {\"idle\", \"ir pause\", \"drpause\"};\n> +\n> +static u32 aspeed_jtag_read(struct aspeed_jtag *aspeed_jtag, u32 reg)\n> +{\n> +       return readl(aspeed_jtag->reg_base + reg);\n> +}\n> +\n> +static void\n> +aspeed_jtag_write(struct aspeed_jtag *aspeed_jtag, u32 val, u32 reg)\n> +{\n> +       writel(val, aspeed_jtag->reg_base + reg);\n> +}\n> +\n> +static int aspeed_jtag_freq_set(struct jtag *jtag, __u32 freq)\n\nWhat's the __u32 for (the __ part)?\n\n> +{\n> +       struct aspeed_jtag *aspeed_jtag = jtag_priv(jtag);\n> +       unsigned long apb_frq;\n> +       u32 tck_val;\n> +       u16 div;\n> +\n> +       apb_frq = clk_get_rate(aspeed_jtag->pclk);\n> +       div = (apb_frq % freq == 0) ? (apb_frq / freq) - 1 : (apb_frq / freq);\n> +       tck_val = aspeed_jtag_read(aspeed_jtag, ASPEED_JTAG_TCK);\n> +       aspeed_jtag_write(aspeed_jtag,\n> +                         (tck_val & ASPEED_JTAG_TCK_DIVISOR_MASK) | div,\n> +                         ASPEED_JTAG_TCK);\n> +       return 0;\n> +}\n\n> +\n> +static int aspeed_jtag_xfer(struct jtag *jtag, struct jtag_xfer *xfer)\n> +{\n> +       static const char sm_update_shiftir[] = {1, 1, 0, 0};\n> +       static const char sm_update_shiftdr[] = {1, 0, 0};\n> +       static const char sm_pause_idle[] = {1, 1, 0};\n> +       static const char sm_pause_update[] = {1, 1};\n\nNit: I was confused by the char, perhaps u8?\n\n> +int aspeed_jtag_init(struct platform_device *pdev,\n> +                    struct aspeed_jtag *aspeed_jtag)\n> +{\n> +       struct resource *res;\n> +       int err;\n> +\n> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n> +       aspeed_jtag->reg_base = devm_ioremap_resource(aspeed_jtag->dev, res);\n> +       if (IS_ERR(aspeed_jtag->reg_base)) {\n> +               err = -ENOMEM;\n> +               goto out_region;\n\nCan you just return here?\n\n> +       }\n> +\n> +       aspeed_jtag->pclk = devm_clk_get(aspeed_jtag->dev, NULL);\n> +       if (IS_ERR(aspeed_jtag->pclk)) {\n> +               dev_err(aspeed_jtag->dev, \"devm_clk_get failed\\n\");\n> +               return PTR_ERR(aspeed_jtag->pclk);\n> +       }\n> +\n> +       clk_prepare_enable(aspeed_jtag->pclk);\n> +\n> +       aspeed_jtag->irq = platform_get_irq(pdev, 0);\n> +       if (aspeed_jtag->irq < 0) {\n> +               dev_err(aspeed_jtag->dev, \"no irq specified\\n\");\n> +               err = -ENOENT;\n> +               goto out_region;\n> +       }\n> +\n> +       /* Enable clock */\n> +       aspeed_jtag_write(aspeed_jtag, ASPEED_JTAG_CTL_ENG_EN |\n> +                         ASPEED_JTAG_CTL_ENG_OUT_EN, ASPEED_JTAG_CTRL);\n> +       aspeed_jtag_write(aspeed_jtag, ASPEED_JTAG_SW_MODE_EN |\n> +                         ASPEED_JTAG_SW_MODE_TDIO, ASPEED_JTAG_SW);\n> +\n> +       err = devm_request_irq(aspeed_jtag->dev, aspeed_jtag->irq,\n> +                              aspeed_jtag_interrupt, 0,\n> +                              \"aspeed-jtag\", aspeed_jtag);\n> +       if (err) {\n> +               dev_err(aspeed_jtag->dev, \"aspeed_jtag unable to get IRQ\");\n> +               goto out_region;\n> +       }\n\nCan we grab the IRQ before enabling the clock? If not, we should\ndisable the clock in the error path.\n\n\n> +       dev_dbg(&pdev->dev, \"aspeed_jtag:IRQ %d.\\n\", aspeed_jtag->irq);\n> +\n> +       aspeed_jtag_write(aspeed_jtag, ASPEED_JTAG_ISR_INST_PAUSE |\n> +                         ASPEED_JTAG_ISR_INST_COMPLETE |\n> +                         ASPEED_JTAG_ISR_DATA_PAUSE |\n> +                         ASPEED_JTAG_ISR_DATA_COMPLETE |\n> +                         ASPEED_JTAG_ISR_INST_PAUSE_EN |\n> +                         ASPEED_JTAG_ISR_INST_COMPLETE_EN |\n> +                         ASPEED_JTAG_ISR_DATA_PAUSE_EN |\n> +                         ASPEED_JTAG_ISR_DATA_COMPLETE_EN,\n> +                         ASPEED_JTAG_ISR);\n> +\n> +       aspeed_jtag->flag = 0;\n> +       init_waitqueue_head(&aspeed_jtag->jtag_wq);\n> +       return 0;\n> +\n> +out_region:\n> +       release_mem_region(res->start, resource_size(res));\n\nI don't think this is necessary.\n\n> +       return err;\n> +}\n> +\n> +int aspeed_jtag_deinit(struct platform_device *pdev,\n> +                      struct aspeed_jtag *aspeed_jtag)\n> +{\n> +       aspeed_jtag_write(aspeed_jtag, 0, ASPEED_JTAG_ISR);\n> +       devm_free_irq(aspeed_jtag->dev, aspeed_jtag->irq, aspeed_jtag);\n\nThe IRQ freeing happen automatically thanks to devm.\n\n> +       /* Disabe clock */\n\nDisable\n\n> +       aspeed_jtag_write(aspeed_jtag, 0, ASPEED_JTAG_CTRL);\n> +       clk_disable_unprepare(aspeed_jtag->pclk);\n> +       return 0;\n> +}\n> +\n> +static const struct jtag_ops aspeed_jtag_ops = {\n> +       .freq_get = aspeed_jtag_freq_get,\n> +       .freq_set = aspeed_jtag_freq_set,\n> +       .status_get = aspeed_jtag_status_get,\n> +       .idle = aspeed_jtag_idle,\n> +       .xfer = aspeed_jtag_xfer\n> +};\n> +\n> +static int aspeed_jtag_probe(struct platform_device *pdev)\n> +{\n> +       struct aspeed_jtag *aspeed_jtag;\n> +       struct jtag *jtag;\n> +       int err;\n> +\n> +       if (!of_device_is_compatible(pdev->dev.of_node, \"aspeed,aspeed-jtag\"))\n> +               return -ENOMEM;\n> +\n> +       jtag = jtag_alloc(sizeof(*aspeed_jtag), &aspeed_jtag_ops);\n> +       if (!jtag)\n> +               return -ENODEV;\n> +\n> +       platform_set_drvdata(pdev, jtag);\n> +       aspeed_jtag = jtag_priv(jtag);\n> +       aspeed_jtag->dev = &pdev->dev;\n> +\n> +       /* Initialize device*/\n> +       err = aspeed_jtag_init(pdev, aspeed_jtag);\n> +       if (err)\n> +               goto err_jtag_init;\n> +\n> +       /* Initialize JTAG core structure*/\n> +       err = jtag_register(jtag);\n> +       if (err)\n> +               goto err_jtag_register;\n> +\n> +       return 0;\n> +\n> +err_jtag_register:\n> +       aspeed_jtag_deinit(pdev, aspeed_jtag);\n> +err_jtag_init:\n> +       jtag_free(jtag);\n> +       return err;\n> +}\n> +\n> +static int aspeed_jtag_remove(struct platform_device *pdev)\n> +{\n> +       struct jtag *jtag;\n> +\n> +       jtag = platform_get_drvdata(pdev);\n> +       aspeed_jtag_deinit(pdev, jtag_priv(jtag));\n> +       jtag_unregister(jtag);\n> +       jtag_free(jtag);\n> +       return 0;\n> +}\n> +\n> +static const struct of_device_id aspeed_jtag_of_match[] = {\n> +       { .compatible = \"aspeed,aspeed2400-jtag\", },\n> +       { .compatible = \"aspeed,aspeed2500-jtag\", },\n\nThe convention is to use ast2500 for our compatible strings, so these should be:\n\n aspeed,ast2500-jtag\n aspeed,ast2400-jtag\n\nCheers,\n\nJoel\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=\"HwI2wB+M\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xpNLf2bPYz9t16\n\tfor <incoming-dt@patchwork.ozlabs.org>;\n\tFri,  8 Sep 2017 13:37:46 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932146AbdIHDhX (ORCPT <rfc822; incoming-dt@patchwork.ozlabs.org>);\n\tThu, 7 Sep 2017 23:37:23 -0400","from mail-lf0-f65.google.com ([209.85.215.65]:34007 \"EHLO\n\tmail-lf0-f65.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1753903AbdIHDhU (ORCPT\n\t<rfc822; devicetree@vger.kernel.org>); Thu, 7 Sep 2017 23:37:20 -0400","by mail-lf0-f65.google.com with SMTP id h80so598621lfe.1;\n\tThu, 07 Sep 2017 20:37:19 -0700 (PDT)","by 10.25.79.70 with HTTP; Thu, 7 Sep 2017 20:36:57 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n\th=mime-version:sender:in-reply-to:references:from:date:message-id\n\t:subject:to:cc;\n\tbh=ZvJd0yoNFX6VisP8gcT2i4FIlBdEWUkqNS19LXktIRI=;\n\tb=HwI2wB+MGxh3kWP49IEVEeDPczhdK0JnbOZxQXwzyVcZRYeWaxI8lv10NF/3AUFzUm\n\tFhkmIeqK59rsC5erhHJguRVWYjaXtWuRyiurr0ecMnTgWCFcLXSlYUF2XrVkSG3QNCiq\n\tdDXPqjimZV6wyXn9QGK81SIWQfYuueXwDrSBBjYHr4KqeNIC4Fi1LIuPWQYfDvKc6rPV\n\twq7NmZZZFyXBB9cyC5hCHho+RiBdTdrr2l8Qmi/wp5jJnPz3QARkhQRrMJrKdHLwVteV\n\tSGtcY5a8b8AmMXJvVLYhxJUoAAAC2e6YD+ORsqmKgeCbpdoJfA0r+d96dDhznrxsvuIv\n\tMjag==","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=ZvJd0yoNFX6VisP8gcT2i4FIlBdEWUkqNS19LXktIRI=;\n\tb=iDP6nTST5NAolVU3RBas9ekfr8BKb67pSfqULHaxXDtvvc7XXzNuAbURRRrSYops7I\n\tUUFJ10JsaHjebOfT74Y2rqKOrj9hD0BEY39bbLv0tqKD22sFSUda3mkxonNMKueWNLRC\n\tuynQMnTdc88A3sqFqTLf+qSVGt3PFrV+aAEXFhoL0+gdtKWQa4FB/0aEJww8+ZbRsrJF\n\t05KE3ERggio5GpOxM8vgvyrlZi3zluJ6XXM71tunqBR1n8y1IcZaG4cXQ226hcNn+4nX\n\t+MlUB0i37fMfQzPC7c5HBSghA9fdC4Xca8csJQ4AJGYtC5ZySpfC2F1hAMNfeLjm+P1T\n\t0MWw==","X-Gm-Message-State":"AHPjjUimJBiYCDqX0lFWjKkfTlFcDRqormp2Al388rvFZrK43mD4QiB/\n\tQUam+IS95HTz17npRj+oq6G66FcD0Q==","X-Google-Smtp-Source":"AOwi7QAJA4Xv3ROc23sC0GQWfMPq2QQ6FdfHtzV7F8RMS9ZHAMWQK5Gi7LAMgL80wLHb7BmpxGyvYupoRe+4ux4rnzo=","X-Received":"by 10.46.88.22 with SMTP id m22mr385279ljb.138.1504841838283;\n\tThu, 07 Sep 2017 20:37:18 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<1504281966-6199-3-git-send-email-oleksandrs@mellanox.com>","References":"<1504281966-6199-1-git-send-email-oleksandrs@mellanox.com>\n\t<1504281966-6199-3-git-send-email-oleksandrs@mellanox.com>","From":"Joel Stanley <joel@jms.id.au>","Date":"Fri, 8 Sep 2017 13:06:57 +0930","X-Google-Sender-Auth":"MRHARrM6WB_sqRNjUpVPHhlMXBc","Message-ID":"<CACPK8XeV9aBY+avimjiOsKZgzj-C6MTeaR0tJC-Tu+zWiAoWPw@mail.gmail.com>","Subject":"Re: [patch v7 2/4] drivers: jtag: Add Aspeed SoC 24xx and 25xx\n\tfamilies JTAG master driver","To":"Oleksandr Shamray <oleksandrs@mellanox.com>","Cc":"Greg KH <gregkh@linuxfoundation.org>, Arnd Bergmann <arnd@arndb.de>,\n\tLinux Kernel Mailing List <linux-kernel@vger.kernel.org>,\n\tLinux ARM <linux-arm-kernel@lists.infradead.org>,\n\tdevicetree <devicetree@vger.kernel.org>,\n\tOpenBMC Maillist <openbmc@lists.ozlabs.org>, jiri@resnulli.us,\n\tTobias Klauser <tklauser@distanz.ch>,\n\tlinux-serial@vger.kernel.org, mec@shout.net, vadimp@maellanox.com,\n\tsystem-sw-low-level@mellanox.com, Rob Herring <robh+dt@kernel.org>,\n\topenocd-devel-owner@lists.sourceforge.net, linux-api@vger.kernel.org, \n\t\"David S . Miller\" <davem@davemloft.net>, mchehab@kernel.org,\n\tJiri Pirko <jiri@mellanox.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"}}]