]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[media] cec: pass parent device in register(), not allocate()
authorHans Verkuil <hans.verkuil@cisco.com>
Fri, 25 Nov 2016 08:23:34 +0000 (06:23 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 29 Nov 2016 14:07:17 +0000 (12:07 -0200)
The cec_allocate_adapter function doesn't need the parent device, only the
cec_register_adapter function needs it.

Drop the cec_devnode parent field, since devnode.dev.parent can be used
instead.

This change makes the framework consistent with other frameworks where the
parent device is not used until the device is registered.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
13 files changed:
Documentation/media/kapi/cec-core.rst
drivers/media/cec/cec-api.c
drivers/media/cec/cec-core.c
drivers/media/i2c/adv7511.c
drivers/media/i2c/adv7604.c
drivers/media/i2c/adv7842.c
drivers/media/platform/vivid/vivid-cec.c
drivers/media/platform/vivid/vivid-cec.h
drivers/media/platform/vivid/vivid-core.c
drivers/media/usb/pulse8-cec/pulse8-cec.c
drivers/staging/media/s5p-cec/s5p_cec.c
drivers/staging/media/st-cec/stih-cec.c
include/media/cec.h

index 8a88dd4ce3d435ec26b2c1cd32dd040231e1d52e..81c6d8e93774a89bd4d1d745b512ea41e7d1a513 100644 (file)
@@ -37,9 +37,8 @@ The struct cec_adapter represents the CEC adapter hardware. It is created by
 calling cec_allocate_adapter() and deleted by calling cec_delete_adapter():
 
 .. c:function::
-   struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
-              void *priv, const char *name, u32 caps, u8 available_las,
-              struct device *parent);
+   struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, void *priv,
+   const char *name, u32 caps, u8 available_las);
 
 .. c:function::
    void cec_delete_adapter(struct cec_adapter *adap);
@@ -66,20 +65,19 @@ available_las:
        the number of simultaneous logical addresses that this
        adapter can handle. Must be 1 <= available_las <= CEC_MAX_LOG_ADDRS.
 
-parent:
-       the parent device.
-
 
 To register the /dev/cecX device node and the remote control device (if
 CEC_CAP_RC is set) you call:
 
 .. c:function::
-       int cec_register_adapter(struct cec_adapter \*adap);
+       int cec_register_adapter(struct cec_adapter *adap, struct device *parent);
+
+where parent is the parent device.
 
 To unregister the devices call:
 
 .. c:function::
-       void cec_unregister_adapter(struct cec_adapter \*adap);
+       void cec_unregister_adapter(struct cec_adapter *adap);
 
 Note: if cec_register_adapter() fails, then call cec_delete_adapter() to
 clean up. But if cec_register_adapter() succeeded, then only call
index 597fbb62d82927bd7b489b34cad8f5d1a778d154..8950b6c9d6a9d5d4caaa253f976d476983ac3c2b 100644 (file)
@@ -88,7 +88,7 @@ static long cec_adap_g_caps(struct cec_adapter *adap,
 {
        struct cec_caps caps = {};
 
-       strlcpy(caps.driver, adap->devnode.parent->driver->name,
+       strlcpy(caps.driver, adap->devnode.dev.parent->driver->name,
                sizeof(caps.driver));
        strlcpy(caps.name, adap->name, sizeof(caps.name));
        caps.available_log_addrs = adap->available_log_addrs;
index b0137e247dc9af7a24d9a0359dfd368f1dfdb659..aca3ab83a8a142af696443857dcc1a8882689ac6 100644 (file)
@@ -132,7 +132,6 @@ static int __must_check cec_devnode_register(struct cec_devnode *devnode,
        devnode->dev.bus = &cec_bus_type;
        devnode->dev.devt = MKDEV(MAJOR(cec_dev_t), minor);
        devnode->dev.release = cec_devnode_release;
-       devnode->dev.parent = devnode->parent;
        dev_set_name(&devnode->dev, "cec%d", devnode->minor);
        device_initialize(&devnode->dev);
 
@@ -198,13 +197,11 @@ static void cec_devnode_unregister(struct cec_devnode *devnode)
 
 struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
                                         void *priv, const char *name, u32 caps,
-                                        u8 available_las, struct device *parent)
+                                        u8 available_las)
 {
        struct cec_adapter *adap;
        int res;
 
-       if (WARN_ON(!parent))
-               return ERR_PTR(-EINVAL);
        if (WARN_ON(!caps))
                return ERR_PTR(-EINVAL);
        if (WARN_ON(!ops))
@@ -214,8 +211,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
        adap = kzalloc(sizeof(*adap), GFP_KERNEL);
        if (!adap)
                return ERR_PTR(-ENOMEM);
-       adap->owner = parent->driver->owner;
-       adap->devnode.parent = parent;
        strlcpy(adap->name, name, sizeof(adap->name));
        adap->phys_addr = CEC_PHYS_ADDR_INVALID;
        adap->log_addrs.cec_version = CEC_OP_CEC_VERSION_2_0;
@@ -264,7 +259,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
        adap->rc->input_id.vendor = 0;
        adap->rc->input_id.product = 0;
        adap->rc->input_id.version = 1;
-       adap->rc->dev.parent = parent;
        adap->rc->driver_type = RC_DRIVER_SCANCODE;
        adap->rc->driver_name = CEC_NAME;
        adap->rc->allowed_protocols = RC_BIT_CEC;
@@ -278,14 +272,22 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
 }
 EXPORT_SYMBOL_GPL(cec_allocate_adapter);
 
-int cec_register_adapter(struct cec_adapter *adap)
+int cec_register_adapter(struct cec_adapter *adap,
+                        struct device *parent)
 {
        int res;
 
        if (IS_ERR_OR_NULL(adap))
                return 0;
 
+       if (WARN_ON(!parent))
+               return -EINVAL;
+
+       adap->owner = parent->driver->owner;
+       adap->devnode.dev.parent = parent;
+
 #if IS_REACHABLE(CONFIG_RC_CORE)
+       adap->rc->dev.parent = parent;
        if (adap->capabilities & CEC_CAP_RC) {
                res = rc_register_device(adap->rc);
 
index 5ba0f21bcfe480288c52172e001f5bf58bd14f1b..8c9e28949ab173d2b74e3d68c9321a18fa3d78a9 100644 (file)
@@ -1732,9 +1732,10 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd)
 static int adv7511_registered(struct v4l2_subdev *sd)
 {
        struct adv7511_state *state = get_adv7511_state(sd);
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
        int err;
 
-       err = cec_register_adapter(state->cec_adap);
+       err = cec_register_adapter(state->cec_adap, &client->dev);
        if (err)
                cec_delete_adapter(state->cec_adap);
        return err;
@@ -1928,7 +1929,7 @@ static int adv7511_probe(struct i2c_client *client, const struct i2c_device_id *
        state->cec_adap = cec_allocate_adapter(&adv7511_cec_adap_ops,
                state, dev_name(&client->dev), CEC_CAP_TRANSMIT |
                CEC_CAP_LOG_ADDRS | CEC_CAP_PASSTHROUGH | CEC_CAP_RC,
-               ADV7511_MAX_ADDRS, &client->dev);
+               ADV7511_MAX_ADDRS);
        err = PTR_ERR_OR_ZERO(state->cec_adap);
        if (err) {
                destroy_workqueue(state->work_queue);
index 5630eb22daaa98c7e31a517d34619b59db07cb43..d0375cac6a058c2d71720022ba283bd55e912bac 100644 (file)
@@ -2631,9 +2631,10 @@ static int adv76xx_subscribe_event(struct v4l2_subdev *sd,
 static int adv76xx_registered(struct v4l2_subdev *sd)
 {
        struct adv76xx_state *state = to_state(sd);
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
        int err;
 
-       err = cec_register_adapter(state->cec_adap);
+       err = cec_register_adapter(state->cec_adap, &client->dev);
        if (err)
                cec_delete_adapter(state->cec_adap);
        return err;
@@ -3511,8 +3512,7 @@ static int adv76xx_probe(struct i2c_client *client,
        state->cec_adap = cec_allocate_adapter(&adv76xx_cec_adap_ops,
                state, dev_name(&client->dev),
                CEC_CAP_TRANSMIT | CEC_CAP_LOG_ADDRS |
-               CEC_CAP_PASSTHROUGH | CEC_CAP_RC, ADV76XX_MAX_ADDRS,
-               &client->dev);
+               CEC_CAP_PASSTHROUGH | CEC_CAP_RC, ADV76XX_MAX_ADDRS);
        err = PTR_ERR_OR_ZERO(state->cec_adap);
        if (err)
                goto err_entity;
index 8c2a52e280af2abbc2e687cc1080212c777ff854..2d61f0cc2b5b0b0db0846ac9801b4aea3fed41c8 100644 (file)
@@ -3250,9 +3250,10 @@ static int adv7842_subscribe_event(struct v4l2_subdev *sd,
 static int adv7842_registered(struct v4l2_subdev *sd)
 {
        struct adv7842_state *state = to_state(sd);
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
        int err;
 
-       err = cec_register_adapter(state->cec_adap);
+       err = cec_register_adapter(state->cec_adap, &client->dev);
        if (err)
                cec_delete_adapter(state->cec_adap);
        return err;
@@ -3568,8 +3569,7 @@ static int adv7842_probe(struct i2c_client *client,
        state->cec_adap = cec_allocate_adapter(&adv7842_cec_adap_ops,
                state, dev_name(&client->dev),
                CEC_CAP_TRANSMIT | CEC_CAP_LOG_ADDRS |
-               CEC_CAP_PASSTHROUGH | CEC_CAP_RC, ADV7842_MAX_ADDRS,
-               &client->dev);
+               CEC_CAP_PASSTHROUGH | CEC_CAP_RC, ADV7842_MAX_ADDRS);
        err = PTR_ERR_OR_ZERO(state->cec_adap);
        if (err)
                goto err_entity;
index f9f878b8e0a71db24d23ab4594172cbc00ce22dd..cb4933592a3cdbba573d80481f8efa7ae76c849e 100644 (file)
@@ -216,7 +216,6 @@ static const struct cec_adap_ops vivid_cec_adap_ops = {
 
 struct cec_adapter *vivid_cec_alloc_adap(struct vivid_dev *dev,
                                         unsigned int idx,
-                                        struct device *parent,
                                         bool is_source)
 {
        char name[sizeof(dev->vid_out_dev.name) + 2];
@@ -227,5 +226,5 @@ struct cec_adapter *vivid_cec_alloc_adap(struct vivid_dev *dev,
                 is_source ? dev->vid_out_dev.name : dev->vid_cap_dev.name,
                 idx);
        return cec_allocate_adapter(&vivid_cec_adap_ops, dev,
-               name, caps, 1, parent);
+               name, caps, 1);
 }
index 97892afa6b3bdbc83b9678a2ae8b4b595b9d0d0c..3926b1422777eaf848595d2ff5b8d4ad1b8c8457 100644 (file)
@@ -20,7 +20,6 @@
 #ifdef CONFIG_VIDEO_VIVID_CEC
 struct cec_adapter *vivid_cec_alloc_adap(struct vivid_dev *dev,
                                         unsigned int idx,
-                                        struct device *parent,
                                         bool is_source);
 void vivid_cec_bus_free_work(struct vivid_dev *dev);
 
index b8ef836766df0530e71339a9cd29dd416ac1bb57..51e37812ec98c63c3855ab41507caf7f2f6295f9 100644 (file)
@@ -1167,12 +1167,12 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                if (in_type_counter[HDMI]) {
                        struct cec_adapter *adap;
 
-                       adap = vivid_cec_alloc_adap(dev, 0, &pdev->dev, false);
+                       adap = vivid_cec_alloc_adap(dev, 0, false);
                        ret = PTR_ERR_OR_ZERO(adap);
                        if (ret < 0)
                                goto unreg_dev;
                        dev->cec_rx_adap = adap;
-                       ret = cec_register_adapter(adap);
+                       ret = cec_register_adapter(adap, &pdev->dev);
                        if (ret < 0) {
                                cec_delete_adapter(adap);
                                dev->cec_rx_adap = NULL;
@@ -1222,13 +1222,12 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                        if (dev->output_type[i] != HDMI)
                                continue;
                        dev->cec_output2bus_map[i] = bus_cnt;
-                       adap = vivid_cec_alloc_adap(dev, bus_cnt,
-                                                    &pdev->dev, true);
+                       adap = vivid_cec_alloc_adap(dev, bus_cnt, true);
                        ret = PTR_ERR_OR_ZERO(adap);
                        if (ret < 0)
                                goto unreg_dev;
                        dev->cec_tx_adap[bus_cnt] = adap;
-                       ret = cec_register_adapter(adap);
+                       ret = cec_register_adapter(adap, &pdev->dev);
                        if (ret < 0) {
                                cec_delete_adapter(adap);
                                dev->cec_tx_adap[bus_cnt] = NULL;
index 9092494bb43ca547d069636c6798be58163b7cdb..7c18daeb0adeb6050a0276313fcd6fd2a59c2b5e 100644 (file)
@@ -659,7 +659,7 @@ static int pulse8_connect(struct serio *serio, struct serio_driver *drv)
 
        pulse8->serio = serio;
        pulse8->adap = cec_allocate_adapter(&pulse8_cec_adap_ops, pulse8,
-               "HDMI CEC", caps, 1, &serio->dev);
+               "HDMI CEC", caps, 1);
        err = PTR_ERR_OR_ZERO(pulse8->adap);
        if (err < 0)
                goto free_device;
@@ -679,7 +679,7 @@ static int pulse8_connect(struct serio *serio, struct serio_driver *drv)
        if (err)
                goto close_serio;
 
-       err = cec_register_adapter(pulse8->adap);
+       err = cec_register_adapter(pulse8->adap, &serio->dev);
        if (err < 0)
                goto close_serio;
 
index 33e435855d6673eaae4e68c63363bfc094b0fe01..2a07968b5ac6f19fb32671b877651ec52e8dd58b 100644 (file)
@@ -203,12 +203,11 @@ static int s5p_cec_probe(struct platform_device *pdev)
        cec->adap = cec_allocate_adapter(&s5p_cec_adap_ops, cec,
                CEC_NAME,
                CEC_CAP_PHYS_ADDR | CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT |
-               CEC_CAP_PASSTHROUGH | CEC_CAP_RC,
-               1, &pdev->dev);
+               CEC_CAP_PASSTHROUGH | CEC_CAP_RC, 1);
        ret = PTR_ERR_OR_ZERO(cec->adap);
        if (ret)
                return ret;
-       ret = cec_register_adapter(cec->adap);
+       ret = cec_register_adapter(cec->adap, &pdev->dev);
        if (ret) {
                cec_delete_adapter(cec->adap);
                return ret;
index eed1fd6bbefa72516f602244aae86e852404f0f7..3c25638a961031205823785bde5bf0d6c8c584e3 100644 (file)
@@ -335,13 +335,12 @@ static int stih_cec_probe(struct platform_device *pdev)
        cec->adap = cec_allocate_adapter(&sti_cec_adap_ops, cec,
                        CEC_NAME,
                        CEC_CAP_LOG_ADDRS | CEC_CAP_PASSTHROUGH |
-                       CEC_CAP_PHYS_ADDR | CEC_CAP_TRANSMIT,
-                       1, &pdev->dev);
+                       CEC_CAP_PHYS_ADDR | CEC_CAP_TRANSMIT, 1);
        ret = PTR_ERR_OR_ZERO(cec->adap);
        if (ret)
                return ret;
 
-       ret = cec_register_adapter(cec->adap);
+       ret = cec_register_adapter(cec->adap, &pdev->dev);
        if (ret) {
                cec_delete_adapter(cec->adap);
                return ret;
index 717eaf552f3d0c860615293bba7ee9dcb0f6a76b..96a0aa770d61ddd843fc418f7ae3df4b4df41f74 100644 (file)
@@ -35,7 +35,6 @@
  * struct cec_devnode - cec device node
  * @dev:       cec device
  * @cdev:      cec character device
- * @parent:    parent device
  * @minor:     device node minor number
  * @registered:        the device was correctly registered
  * @unregistered: the device was unregistered
@@ -51,7 +50,6 @@ struct cec_devnode {
        /* sysfs */
        struct device dev;
        struct cdev cdev;
-       struct device *parent;
 
        /* device info */
        int minor;
@@ -198,9 +196,8 @@ static inline bool cec_is_sink(const struct cec_adapter *adap)
 
 #if IS_ENABLED(CONFIG_MEDIA_CEC_SUPPORT)
 struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
-               void *priv, const char *name, u32 caps, u8 available_las,
-               struct device *parent);
-int cec_register_adapter(struct cec_adapter *adap);
+               void *priv, const char *name, u32 caps, u8 available_las);
+int cec_register_adapter(struct cec_adapter *adap, struct device *parent);
 void cec_unregister_adapter(struct cec_adapter *adap);
 void cec_delete_adapter(struct cec_adapter *adap);
 
@@ -218,7 +215,8 @@ void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg);
 
 #else
 
-static inline int cec_register_adapter(struct cec_adapter *adap)
+static inline int cec_register_adapter(struct cec_adapter *adap,
+                                      struct device *parent)
 {
        return 0;
 }