]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
soc: qcom: smd: Make callback pass channel reference
authorBjorn Andersson <bjorn.andersson@linaro.org>
Tue, 29 Mar 2016 04:35:22 +0000 (21:35 -0700)
committerNicolas Dechesne <nicolas.dechesne@linaro.org>
Tue, 21 Jun 2016 08:02:15 +0000 (11:02 +0300)
By passing the smd channel reference to the callback, rather than the
smd device, we can open additional smd channels from sub-devices of smd
devices.

Also updates the two smd clients today found in mainline.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Andy Gross <andy.gross@linaro.org>
(cherry picked from commit b853cb9628bfbcc4017da46d5f5b46e3eba9d8c6)

drivers/soc/qcom/smd-rpm.c
drivers/soc/qcom/smd.c
drivers/soc/qcom/wcnss_ctrl.c
include/linux/soc/qcom/smd.h

index af3152c733998935bbda347def7b204ecff2772a..abb32001ff3a82dd444b2d0ec156235fdd58eeac 100644 (file)
@@ -33,6 +33,7 @@
  */
 struct qcom_smd_rpm {
        struct qcom_smd_channel *rpm_channel;
+       struct device *dev;
 
        struct completion ack;
        struct mutex lock;
@@ -149,14 +150,14 @@ out:
 }
 EXPORT_SYMBOL(qcom_rpm_smd_write);
 
-static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev,
+static int qcom_smd_rpm_callback(struct qcom_smd_channel *channel,
                                 const void *data,
                                 size_t count)
 {
        const struct qcom_rpm_header *hdr = data;
        size_t hdr_length = le32_to_cpu(hdr->length);
        const struct qcom_rpm_message *msg;
-       struct qcom_smd_rpm *rpm = dev_get_drvdata(&qsdev->dev);
+       struct qcom_smd_rpm *rpm = qcom_smd_get_drvdata(channel);
        const u8 *buf = data + sizeof(struct qcom_rpm_header);
        const u8 *end = buf + hdr_length;
        char msgbuf[32];
@@ -165,7 +166,7 @@ static int qcom_smd_rpm_callback(struct qcom_smd_device *qsdev,
 
        if (le32_to_cpu(hdr->service_type) != RPM_SERVICE_TYPE_REQUEST ||
            hdr_length < sizeof(struct qcom_rpm_message)) {
-               dev_err(&qsdev->dev, "invalid request\n");
+               dev_err(rpm->dev, "invalid request\n");
                return 0;
        }
 
@@ -206,7 +207,9 @@ static int qcom_smd_rpm_probe(struct qcom_smd_device *sdev)
        mutex_init(&rpm->lock);
        init_completion(&rpm->ack);
 
+       rpm->dev = &sdev->dev;
        rpm->rpm_channel = sdev->channel;
+       qcom_smd_set_drvdata(sdev->channel, rpm);
 
        dev_set_drvdata(&sdev->dev, rpm);
 
index 1ef645a785404bf5d1829816b7ac03dd66865c2b..05cb3003193114207963a67888de5cda86d1883c 100644 (file)
@@ -135,7 +135,6 @@ struct qcom_smd_edge {
        struct work_struct state_work;
 };
 
-
 /**
  * struct qcom_smd - smd struct
  * @dev:       device struct
@@ -453,7 +452,6 @@ static void qcom_smd_channel_advance(struct qcom_smd_channel *channel,
  */
 static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel)
 {
-       struct qcom_smd_device *qsdev = channel->qsdev;
        unsigned tail;
        size_t len;
        void *ptr;
@@ -473,7 +471,7 @@ static int qcom_smd_channel_recv_single(struct qcom_smd_channel *channel)
                len = channel->pkt_size;
        }
 
-       ret = channel->cb(qsdev, ptr, len);
+       ret = channel->cb(channel, ptr, len);
        if (ret < 0)
                return ret;
 
@@ -975,6 +973,18 @@ int qcom_smd_driver_register(struct qcom_smd_driver *qsdrv)
 }
 EXPORT_SYMBOL(qcom_smd_driver_register);
 
+void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel)
+{
+       return channel->drvdata;
+}
+EXPORT_SYMBOL(qcom_smd_get_drvdata);
+
+void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data)
+{
+       channel->drvdata = data;
+}
+EXPORT_SYMBOL(qcom_smd_set_drvdata);
+
 /**
  * qcom_smd_driver_unregister - unregister a smd driver
  * @qsdrv:     qcom_smd_driver struct
@@ -1019,12 +1029,13 @@ qcom_smd_find_channel(struct qcom_smd_edge *edge, const char *name)
  * Returns a channel handle on success, or -EPROBE_DEFER if the channel isn't
  * ready.
  */
-struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev,
+struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *parent,
                                               const char *name,
                                               qcom_smd_cb_t cb)
 {
        struct qcom_smd_channel *channel;
-       struct qcom_smd_edge *edge = sdev->channel->edge;
+       struct qcom_smd_device *sdev = parent->qsdev;
+       struct qcom_smd_edge *edge = parent->edge;
        int ret;
 
        /* Wait up to HZ for the channel to appear */
index fd3cb8cf13f135c025a704ad47ecb176ea39636e..2fc29f4fc5551734f757fe81caf1117100854afc 100644 (file)
@@ -113,17 +113,17 @@ struct wcnss_download_nv_resp {
 
 /**
  * wcnss_ctrl_smd_callback() - handler from SMD responses
- * @qsdev:     smd device handle
+ * @channel:   smd channel handle
  * @data:      pointer to the incoming data packet
  * @count:     size of the incoming data packet
  *
  * Handles any incoming packets from the remote WCNSS_CTRL service.
  */
-static int wcnss_ctrl_smd_callback(struct qcom_smd_device *qsdev,
+static int wcnss_ctrl_smd_callback(struct qcom_smd_channel *channel,
                                   const void *data,
                                   size_t count)
 {
-       struct wcnss_ctrl *wcnss = dev_get_drvdata(&qsdev->dev);
+       struct wcnss_ctrl *wcnss = qcom_smd_get_drvdata(channel);
        const struct wcnss_download_nv_resp *nvresp;
        const struct wcnss_version_resp *version;
        const struct wcnss_msg_hdr *hdr = data;
@@ -303,7 +303,7 @@ static int wcnss_ctrl_probe(struct qcom_smd_device *sdev)
        init_completion(&wcnss->cbc);
        INIT_WORK(&wcnss->probe_work, wcnss_async_probe);
 
-       dev_set_drvdata(&sdev->dev, wcnss);
+       qcom_smd_set_drvdata(sdev->channel, wcnss);
 
        schedule_work(&wcnss->probe_work);
 
index 49764d94ef4f74349737f6e5406f427a92e2b3d1..1df0341a4fd3e93562a88199f45f22a87376689a 100644 (file)
@@ -8,8 +8,6 @@ struct qcom_smd;
 struct qcom_smd_lookup;
 struct qcom_smd_device;
 
-typedef int (*qcom_smd_cb_t)(struct qcom_smd_device *, const void *, size_t);
-
 /*
  * SMD channel states.
  */
@@ -92,6 +90,8 @@ struct qcom_smd_device {
        struct qcom_smd_channel *channel;
 };
 
+typedef int (*qcom_smd_cb_t)(struct qcom_smd_channel *, const void *, size_t);
+
 /**
  * struct qcom_smd_driver - smd driver struct
  * @driver:    underlying device driver
@@ -114,13 +114,16 @@ struct qcom_smd_driver {
 int qcom_smd_driver_register(struct qcom_smd_driver *drv);
 void qcom_smd_driver_unregister(struct qcom_smd_driver *drv);
 
+void *qcom_smd_get_drvdata(struct qcom_smd_channel *channel);
+void qcom_smd_set_drvdata(struct qcom_smd_channel *channel, void *data);
+
 #define module_qcom_smd_driver(__smd_driver) \
        module_driver(__smd_driver, qcom_smd_driver_register, \
                      qcom_smd_driver_unregister)
 
 int qcom_smd_send(struct qcom_smd_channel *channel, const void *data, int len);
 
-struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_device *sdev,
+struct qcom_smd_channel *qcom_smd_open_channel(struct qcom_smd_channel *channel,
                                               const char *name,
                                               qcom_smd_cb_t cb);