fimc-is: Get rid of companion platform driver
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Thu, 5 Apr 2018 15:04:55 +0000 (17:04 +0200)
committerJunghoon Kim <jhoon20.kim@samsung.com>
Thu, 14 Feb 2019 05:57:25 +0000 (14:57 +0900)
Change-Id: I2d9d6c690b867234ec8918747eec88d8593e44f1
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c
drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.h
drivers/media/platform/exynos/fimc-is/fimc-is-companion.c
drivers/media/platform/exynos/fimc-is/fimc-is-core.c
drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c
drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h

index e41bdb7..617cb0e 100644 (file)
@@ -148,24 +148,20 @@ p_err:
        return ret;
 }
 
-int fimc_is_companion_parse_dt(struct platform_device *pdev)
+int fimc_is_companion_parse_dt(struct device *dev)
 {
-       int ret = 0;
        struct exynos_platform_fimc_is_sensor *pdata;
        struct device_node *dnode;
-       struct device *dev;
+       int ret = 0;
 
-       BUG_ON(!pdev);
-       BUG_ON(!pdev->dev.of_node);
+       if (WARN_ON(!dev->of_node))
+               return -EINVAL;
 
-       dev = &pdev->dev;
        dnode = dev->of_node;
 
-       pdata = kzalloc(sizeof(struct exynos_platform_fimc_is_sensor), GFP_KERNEL);
-       if (!pdata) {
-               pr_err("%s: no memory for platform data\n", __func__);
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
                return -ENOMEM;
-       }
 
        pdata->gpio_cfg = exynos_fimc_is_sensor_pins_cfg;
        pdata->iclk_cfg = exynos_fimc_is_companion_iclk_cfg;
@@ -177,13 +173,13 @@ int fimc_is_companion_parse_dt(struct platform_device *pdev)
        ret = of_property_read_u32(dnode, "scenario", &pdata->scenario);
        if (ret) {
                err("scenario read failed(%d)", ret);
-               goto p_err;
+               return ret;
        }
 
        ret = of_property_read_u32(dnode, "mclk_ch", &pdata->mclk_ch);
        if (ret) {
                err("mclk_ch read failed(%d)", ret);
-               goto p_err;
+               return ret;
        }
 
        pdata->companion_use_pmic = of_property_read_bool(dnode, "companion_use_pmic");
@@ -194,7 +190,7 @@ int fimc_is_companion_parse_dt(struct platform_device *pdev)
        ret = of_property_read_u32(dnode, "sensor_id", &pdata->sensor_id);
        if (ret) {
                err("sensor_id read failed(%d)", ret);
-               goto p_err;
+               return ret;
        }
 
        dev->platform_data = pdata;
@@ -206,18 +202,12 @@ int fimc_is_companion_parse_dt(struct platform_device *pdev)
        pdata->pinctrl = devm_pinctrl_get(dev);
        if (IS_ERR(pdata->pinctrl)) {
                err("devm_pinctrl_get failed");
-               goto p_err;
        } else {
                ret = get_pin_lookup_state(dev, pdata);
-               if (ret < 0) {
+               if (ret < 0)
                        err("fimc_is_get_pin_lookup_state failed");
-                       goto p_err;
-               }
        }
 
        return ret;
-p_err:
-       kfree(pdata);
-       return ret;
 }
 
index f3746c7..0ab5649 100644 (file)
 #ifndef FIMC_IS_COMPANION_DT_H
 #define FIMC_IS_COMPANION_DT_H
 
+struct device;
+struct platform_device;
+
 int fimc_is_sensor_parse_dt_with_companion(struct platform_device *pdev);
-int fimc_is_companion_parse_dt(struct platform_device *pdev);
+int fimc_is_companion_parse_dt(struct device *dev);
 #endif
 
index 61259d8..bb1e0e4 100644 (file)
@@ -209,7 +209,7 @@ static int fimc_is_comp_i2c_write(struct i2c_client *client ,u16 addr, u16 data)
 
 static int fimc_is_comp_single_write(struct fimc_is_core *core , u16 addr, u16 data)
 {
-       struct i2c_client *client = core->client0;
+       struct i2c_client *client = core->companion->i2c_client;
        int ret;
 
        /* interrupt on */
index 805ff9c..61c9a66 100644 (file)
@@ -1302,66 +1302,6 @@ static const struct dev_pm_ops fimc_is_pm_ops = {
        .runtime_resume         = fimc_is_runtime_resume,
 };
 
-static int fimc_is_i2c0_probe(struct i2c_client *client,
-                                 const struct i2c_device_id *id)
-{
-       struct fimc_is_core *core;
-       static bool probe_retried = false;
-
-       if (!fimc_is_dev)
-               goto probe_defer;
-
-       core = dev_get_drvdata(fimc_is_dev);
-       if (!core)
-               goto probe_defer;
-
-       core->client0 = client;
-
-       pr_info("%s %s: fimc_is_i2c0 driver probed!\n",
-               dev_driver_string(&client->dev), dev_name(&client->dev));
-
-       return 0;
-
-probe_defer:
-       if (probe_retried) {
-               err("probe has already been retried!!");
-               BUG();
-       }
-
-       probe_retried = true;
-       err("core device is not yet probed");
-       return -EPROBE_DEFER;
-}
-
-static int fimc_is_i2c0_remove(struct i2c_client *client)
-{
-       return 0;
-}
-
-static struct of_device_id fimc_is_i2c0_dt_ids[] = {
-       { .compatible = "samsung,fimc_is_i2c0",},
-       {},
-};
-MODULE_DEVICE_TABLE(of, fimc_is_i2c0_dt_ids);
-
-static const struct i2c_device_id fimc_is_i2c0_id[] = {
-       {"fimc_is_i2c0", 0},
-       {}
-};
-MODULE_DEVICE_TABLE(i2c, fimc_is_i2c0_id);
-
-static struct i2c_driver fimc_is_i2c0_driver = {
-       .driver = {
-               .name = "fimc_is_i2c0",
-               .owner  = THIS_MODULE,
-               .of_match_table = fimc_is_i2c0_dt_ids,
-       },
-       .probe = fimc_is_i2c0_probe,
-       .remove = fimc_is_i2c0_remove,
-       .id_table = fimc_is_i2c0_id,
-};
-module_i2c_driver(fimc_is_i2c0_driver);
-
 static int of_fimc_is_spi_dt(struct device *dev, struct fimc_is_spi_gpio *spi_gpio, struct fimc_is_core *core)
 {
        struct device_node *np;
index e35e612..3577b2a 100644 (file)
 #include <linux/errno.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
-#include <linux/platform_device.h>
 #include <linux/slab.h>
-#include <asm/cacheflush.h>
-#include <asm/pgtable.h>
 #include <linux/firmware.h>
-#include <linux/dma-mapping.h>
-#include <linux/scatterlist.h>
 #include <linux/videodev2.h>
 #include <linux/videodev2_exynos_camera.h>
 #include <linux/v4l2-mediabus.h>
 #include <linux/bug.h>
 #include <linux/i2c.h>
 
-
 #include "fimc-is-video.h"
 #include "fimc-is-dt.h"
 #include "fimc-is-device-companion.h"
 #include "fimc-is-sec-define.h"
 #include "fimc-is-device-ois.h"
 #include "fimc-is-companion-dt.h"
+
 extern int fimc_is_comp_video_probe(void *data);
 
 int fimc_is_companion_wait(struct fimc_is_device_companion *device)
@@ -438,119 +433,23 @@ p_err:
        return ret;
 }
 
-static int fimc_is_companion_probe(struct platform_device *pdev)
-{
-       int ret = 0;
-       struct fimc_is_core *core;
-       struct fimc_is_device_companion *device;
-       void *pdata;
-
-       BUG_ON(!pdev);
-
-       if (fimc_is_dev == NULL) {
-               warn("fimc_is_dev is not yet probed");
-               pdev->dev.init_name = FIMC_IS_COMPANION_DEV_NAME;
-               return -EPROBE_DEFER;
-       }
-
-       core = dev_get_drvdata(fimc_is_dev);
-       if (!core) {
-               err("core is NULL");
-               return -EINVAL;
-       }
-
-       device = kzalloc(sizeof(struct fimc_is_device_companion), GFP_KERNEL);
-       if (!device)
-               return -ENOMEM;
-
-       init_waitqueue_head(&device->init_wait_queue);
-
-       device->companion_status = FIMC_IS_COMPANION_IDLE;
-
-       ret = fimc_is_companion_parse_dt(pdev);
-       if (ret) {
-               err("parsing device tree failed(%d)", ret);
-               goto p_err;
-       }
-
-       pdata = dev_get_platdata(&pdev->dev);
-       if (!pdata) {
-               err("pdata is NULL");
-               ret = -EINVAL;
-               goto p_err;
-       }
-
-       device->dev = &pdev->dev;
-       device->private_data = core;
-       device->regs = core->regs;
-       device->pdata = pdata;
-       platform_set_drvdata(pdev, device);
-       device_init_wakeup(&pdev->dev, true);
-       core->companion = device;
-       core->pin_ois_en = device->pdata->pin_ois_en;
-
-       /* init state */
-       clear_bit(FIMC_IS_COMPANION_OPEN, &device->state);
-       clear_bit(FIMC_IS_COMPANION_MCLK_ON, &device->state);
-       clear_bit(FIMC_IS_COMPANION_ICLK_ON, &device->state);
-       clear_bit(FIMC_IS_COMPANION_GPIO_ON, &device->state);
-
-       device->v4l2_dev = &core->v4l2_dev;
-
-       ret = fimc_is_mem_probe(&device->mem, core->pdev);
-       if (ret) {
-               err("fimc_is_mem_probe failed(%d)", ret);
-               goto p_err;
-       }
-
-       ret = fimc_is_comp_video_probe(device);
-       if (ret) {
-               err("fimc_is_companion_video_probe failed(%d)", ret);
-               goto p_err;
-       }
-
-       pm_runtime_enable(&pdev->dev);
-
-       info("[COMP:D] %s(%d)\n", __func__, ret);
-
-       return ret;
-
-p_err:
-       kfree(device);
-       return ret;
-}
-
-static int fimc_is_companion_remove(struct platform_device *pdev)
-{
-       int ret = 0;
-
-       info("%s\n", __func__);
-
-       return ret;
-}
-
 static int fimc_is_companion_suspend(struct device *dev)
 {
-       int ret = 0;
-
        info("%s\n", __func__);
 
-       return ret;
+       return 0;
 }
 
 static int fimc_is_companion_resume(struct device *dev)
 {
-       int ret = 0;
-
        info("%s\n", __func__);
 
-       return ret;
+       return 0;
 }
 
 int fimc_is_companion_runtime_suspend(struct device *dev)
 {
        int ret = 0;
-       struct platform_device *pdev = to_platform_device(dev);
        struct fimc_is_device_companion *device;
        struct fimc_is_core *core;
 
@@ -561,7 +460,7 @@ int fimc_is_companion_runtime_suspend(struct device *dev)
                err("core is NULL");
                return -EINVAL;
        }
-       device = platform_get_drvdata(pdev);
+       device = dev_get_drvdata(dev);
        if (!device) {
                err("device is NULL");
                ret = -EINVAL;
@@ -597,17 +496,16 @@ err_dev_null:
 
 int fimc_is_companion_runtime_resume(struct device *dev)
 {
-       int ret = 0;
-       struct platform_device *pdev = to_platform_device(dev);
        struct fimc_is_device_companion *device;
        struct fimc_is_core *core;
+       int ret = 0;
 
        core = dev_get_drvdata(fimc_is_dev);
        if (!core) {
                err("core is NULL");
                return -EINVAL;
        }
-       device = platform_get_drvdata(pdev);
+       device = dev_get_drvdata(dev);
        if (!device) {
                err("device is NULL");
                return -EINVAL;
@@ -645,26 +543,106 @@ static const struct dev_pm_ops fimc_is_companion_pm_ops = {
        .runtime_resume         = fimc_is_companion_runtime_resume,
 };
 
-static const struct of_device_id exynos_fimc_is_companion_match[] = {
-       {
-               .compatible = "samsung,exynos5-fimc-is-companion",
-       },
-       {},
-};
-MODULE_DEVICE_TABLE(of, exynos_fimc_is_companion_match);
+static int fimc_is_companion_probe(struct i2c_client *client)
+{
+       static bool probe_retried = false;
+       struct device *dev = &client->dev;
+       struct fimc_is_device_companion *device;
+       struct fimc_is_core *core;
+       int ret;
 
-static struct platform_driver fimc_is_companion_driver = {
-       .probe  = fimc_is_companion_probe,
-       .remove = fimc_is_companion_remove,
-       .driver = {
-               .name   = FIMC_IS_COMPANION_DEV_NAME,
-               .owner  = THIS_MODULE,
-               .pm     = &fimc_is_companion_pm_ops,
-               .of_match_table = exynos_fimc_is_companion_match,
+       if (!fimc_is_dev)
+               goto probe_defer;
+
+       core = dev_get_drvdata(fimc_is_dev);
+       if (!core)
+               goto probe_defer;
+
+       device = devm_kzalloc(dev, sizeof(*device), GFP_KERNEL);
+       if (!device)
+               return -ENOMEM;
+
+       init_waitqueue_head(&device->init_wait_queue);
+
+       device->companion_status = FIMC_IS_COMPANION_IDLE;
+
+       ret = fimc_is_companion_parse_dt(dev);
+       if (ret) {
+               err("parsing device tree failed(%d)", ret);
+               goto probe_defer;
        }
+
+       device->dev = dev;
+       device->i2c_client = client;
+       device->private_data = core;
+       device->regs = core->regs;
+       device->pdata = dev_get_platdata(dev);
+       dev_set_drvdata(dev, device);
+       device_init_wakeup(dev, true);
+       core->companion = device;
+       core->pin_ois_en = device->pdata->pin_ois_en;
+
+       /* init state */
+       clear_bit(FIMC_IS_COMPANION_OPEN, &device->state);
+       clear_bit(FIMC_IS_COMPANION_MCLK_ON, &device->state);
+       clear_bit(FIMC_IS_COMPANION_ICLK_ON, &device->state);
+       clear_bit(FIMC_IS_COMPANION_GPIO_ON, &device->state);
+
+       device->v4l2_dev = &core->v4l2_dev;
+
+       ret = fimc_is_mem_probe(&device->mem, core->pdev);
+       if (ret) {
+               err("fimc_is_mem_probe failed(%d)", ret);
+               goto probe_defer;
+       }
+
+       ret = fimc_is_comp_video_probe(device);
+       if (ret) {
+               err("fimc_is_companion_video_probe failed(%d)", ret);
+               goto probe_defer;
+       }
+
+       pm_runtime_enable(dev);
+
+       info("[COMP:D] %s(%d)\n", __func__, ret);
+
+       pr_info("%s %s: fimc_is_i2c0 driver probed!\n",
+               dev_driver_string(&client->dev), dev_name(&client->dev));
+
+       return 0;
+
+probe_defer:
+       if (probe_retried) {
+               err("probe has already been retried!!");
+               BUG();
+       }
+
+       probe_retried = true;
+       err("core device is not yet probed");
+       return -EPROBE_DEFER;
+}
+
+static int fimc_is_companion_remove(struct i2c_client *client)
+{
+       return 0;
+}
+
+static struct of_device_id fimc_is_companion_of_match[] = {
+       { .compatible = "samsung,s5c73c1" },
+       { },
 };
+MODULE_DEVICE_TABLE(of, fimc_is_i2c0_dt_ids);
 
-module_platform_driver(fimc_is_companion_driver);
+static struct i2c_driver fimc_is_i2c0_driver = {
+       .driver = {
+               .name = "fimc-is-companion",
+               .of_match_table = fimc_is_companion_of_match,
+               .pm = &fimc_is_companion_pm_ops,
+       },
+       .probe_new = fimc_is_companion_probe,
+       .remove = fimc_is_companion_remove,
+};
+module_i2c_driver(fimc_is_i2c0_driver);
 
 MODULE_AUTHOR("Wooki Min<wooki.min@samsung.com>");
 MODULE_DESCRIPTION("Exynos FIMC_IS_COMPANION driver");
index d767e6e..9b62883 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "exynos-fimc-is-sensor.h"
 #include <linux/interrupt.h>
+#include <linux/i2c.h>
 #include "fimc-is-video.h"
 
 struct fimc_is_video_ctx;
@@ -36,6 +37,7 @@ enum fimc_is_companion_status {
 struct fimc_is_device_companion {
        struct v4l2_device                              *v4l2_dev;
        struct device                                   *dev;
+       struct i2c_client                               *i2c_client;
        void __iomem                                    *regs;
        struct fimc_is_mem                              mem;