Merge tag 'qcom-soc-for-4.7-2' into net-next
authorBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 13 May 2016 21:36:11 +0000 (14:36 -0700)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 13 May 2016 21:42:23 +0000 (14:42 -0700)
This merges the Qualcomm SOC tree with the net-next, solving the
merge conflict in the SMD API between the two.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
1  2 
MAINTAINERS
include/linux/soc/qcom/smd.h
net/qrtr/smd.c

diff --cc MAINTAINERS
Simple merge
index 46a984f5e3a3ae9fd38cab4a7b5fc142420bc385,cb2f81559bc05419a0541edfa7d78d485470c1c6..cbb0f06c41b21866385882d85e6954d70b77b1a4
@@@ -42,38 -44,14 +44,67 @@@ struct qcom_smd_driver 
  
        int (*probe)(struct qcom_smd_device *dev);
        void (*remove)(struct qcom_smd_device *dev);
-       int (*callback)(struct qcom_smd_device *, const void *, size_t);
+       qcom_smd_cb_t callback;
  };
  
 +#if IS_ENABLED(CONFIG_QCOM_SMD)
 +
  int qcom_smd_driver_register(struct qcom_smd_driver *drv);
  void qcom_smd_driver_unregister(struct qcom_smd_driver *drv);
  
++struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *channel,
++                                             const char *name,
++                                             qcom_smd_cb_t cb);
+ void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel);
+ void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data);
 +int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len);
 +
++
 +#else
 +
 +static inline int qcom_smd_driver_register(struct qcom_smd_driver *drv)
 +{
 +      return -ENXIO;
 +}
 +
 +static inline void qcom_smd_driver_unregister(struct qcom_smd_driver *drv)
 +{
 +      /* This shouldn't be possible */
 +      WARN_ON(1);
 +}
 +
++static inline struct qcom_smd_channel *
++qcom_smd_open_channel(struct qcom_smd_channel *channel,
++                    const char *name,
++                    qcom_smd_cb_t cb)
++{
++      /* This shouldn't be possible */
++      WARN_ON(1);
++      return NULL;
++}
++
++void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel)
++{
++      /* This shouldn't be possible */
++      WARN_ON(1);
++      return NULL;
++}
++
++void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data)
++{
++      /* This shouldn't be possible */
++      WARN_ON(1);
++}
++
 +static inline int qcom_smd_send(struct qcom_smd_channel *channel,
 +                              const void *data, int len)
 +{
 +      /* This shouldn't be possible */
 +      WARN_ON(1);
 +      return -ENXIO;
 +}
 +
 +#endif
  
  #define module_qcom_smd_driver(__smd_driver) \
        module_driver(__smd_driver, qcom_smd_driver_register, \
diff --cc net/qrtr/smd.c
index 84ebce73aa2323d7631cf1bfdd584ebd9e9a7b2c,0000000000000000000000000000000000000000..0d11132b3370a4024be644dede74a77d188a4f64
mode 100644,000000..100644
--- /dev/null
@@@ -1,117 -1,0 +1,120 @@@
- static int qcom_smd_qrtr_callback(struct qcom_smd_device *sdev,
 +/*
 + * Copyright (c) 2015, Sony Mobile Communications Inc.
 + * Copyright (c) 2013, The Linux Foundation. All rights reserved.
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 and
 + * only version 2 as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + */
 +
 +#include <linux/module.h>
 +#include <linux/skbuff.h>
 +#include <linux/soc/qcom/smd.h>
 +
 +#include "qrtr.h"
 +
 +struct qrtr_smd_dev {
 +      struct qrtr_endpoint ep;
 +      struct qcom_smd_channel *channel;
++      struct device *dev;
 +};
 +
 +/* from smd to qrtr */
-       struct qrtr_smd_dev *qdev = dev_get_drvdata(&sdev->dev);
++static int qcom_smd_qrtr_callback(struct qcom_smd_channel *channel,
 +                                const void *data, size_t len)
 +{
-               dev_err(&sdev->dev, "invalid ipcrouter packet\n");
++      struct qrtr_smd_dev *qdev = qcom_smd_get_drvdata(channel);
 +      int rc;
 +
 +      if (!qdev)
 +              return -EAGAIN;
 +
 +      rc = qrtr_endpoint_post(&qdev->ep, data, len);
 +      if (rc == -EINVAL) {
++              dev_err(qdev->dev, "invalid ipcrouter packet\n");
 +              /* return 0 to let smd drop the packet */
 +              rc = 0;
 +      }
 +
 +      return rc;
 +}
 +
 +/* from qrtr to smd */
 +static int qcom_smd_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb)
 +{
 +      struct qrtr_smd_dev *qdev = container_of(ep, struct qrtr_smd_dev, ep);
 +      int rc;
 +
 +      rc = skb_linearize(skb);
 +      if (rc)
 +              goto out;
 +
 +      rc = qcom_smd_send(qdev->channel, skb->data, skb->len);
 +
 +out:
 +      if (rc)
 +              kfree_skb(skb);
 +      else
 +              consume_skb(skb);
 +      return rc;
 +}
 +
 +static int qcom_smd_qrtr_probe(struct qcom_smd_device *sdev)
 +{
 +      struct qrtr_smd_dev *qdev;
 +      int rc;
 +
 +      qdev = devm_kzalloc(&sdev->dev, sizeof(*qdev), GFP_KERNEL);
 +      if (!qdev)
 +              return -ENOMEM;
 +
 +      qdev->channel = sdev->channel;
++      qdev->dev = &sdev->dev;
 +      qdev->ep.xmit = qcom_smd_qrtr_send;
 +
 +      rc = qrtr_endpoint_register(&qdev->ep, QRTR_EP_NID_AUTO);
 +      if (rc)
 +              return rc;
 +
++      qcom_smd_set_drvdata(sdev->channel, qdev);
 +      dev_set_drvdata(&sdev->dev, qdev);
 +
 +      dev_dbg(&sdev->dev, "Qualcomm SMD QRTR driver probed\n");
 +
 +      return 0;
 +}
 +
 +static void qcom_smd_qrtr_remove(struct qcom_smd_device *sdev)
 +{
 +      struct qrtr_smd_dev *qdev = dev_get_drvdata(&sdev->dev);
 +
 +      qrtr_endpoint_unregister(&qdev->ep);
 +
 +      dev_set_drvdata(&sdev->dev, NULL);
 +}
 +
 +static const struct qcom_smd_id qcom_smd_qrtr_smd_match[] = {
 +      { "IPCRTR" },
 +      {}
 +};
 +
 +static struct qcom_smd_driver qcom_smd_qrtr_driver = {
 +      .probe = qcom_smd_qrtr_probe,
 +      .remove = qcom_smd_qrtr_remove,
 +      .callback = qcom_smd_qrtr_callback,
 +      .smd_match_table = qcom_smd_qrtr_smd_match,
 +      .driver = {
 +              .name = "qcom_smd_qrtr",
 +              .owner = THIS_MODULE,
 +      },
 +};
 +
 +module_qcom_smd_driver(qcom_smd_qrtr_driver);
 +
 +MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver");
 +MODULE_LICENSE("GPL v2");