From 054823e8c458d0eef3d30e229db22277448f7d29 Mon Sep 17 00:00:00 2001 From: Sylwester Nawrocki Date: Thu, 5 Apr 2018 17:04:55 +0200 Subject: [PATCH] fimc-is: Get rid of companion platform driver Change-Id: I2d9d6c690b867234ec8918747eec88d8593e44f1 Signed-off-by: Sylwester Nawrocki --- .../exynos/fimc-is/fimc-is-companion-dt.c | 30 +-- .../exynos/fimc-is/fimc-is-companion-dt.h | 5 +- .../exynos/fimc-is/fimc-is-companion.c | 2 +- .../platform/exynos/fimc-is/fimc-is-core.c | 60 ----- .../exynos/fimc-is/fimc-is-device-companion.c | 226 ++++++++---------- .../exynos/fimc-is/fimc-is-device-companion.h | 2 + 6 files changed, 119 insertions(+), 206 deletions(-) diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c b/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c index e41bdb7ae920..617cb0e38870 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.c @@ -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; } diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.h b/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.h index f3746c7cc89b..0ab56491079e 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.h +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-companion-dt.h @@ -12,7 +12,10 @@ #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 diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-companion.c b/drivers/media/platform/exynos/fimc-is/fimc-is-companion.c index 61259d8eb5b4..bb1e0e4a0ed9 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-companion.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-companion.c @@ -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 */ diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-core.c b/drivers/media/platform/exynos/fimc-is/fimc-is-core.c index 805ff9c241a3..61c9a660dee3 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-core.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-core.c @@ -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; diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c index e35e61228d52..3577b2a0896a 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.c @@ -16,26 +16,21 @@ #include #include #include -#include #include -#include -#include #include -#include -#include #include #include #include #include #include - #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"); MODULE_DESCRIPTION("Exynos FIMC_IS_COMPANION driver"); diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h index d767e6e2a6e6..9b6288334b6e 100644 --- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h +++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-companion.h @@ -14,6 +14,7 @@ #include "exynos-fimc-is-sensor.h" #include +#include #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; -- 2.34.1