@@ -1123,6 +1123,25 @@ static ssize_t fimc_md_sysfs_store(struct device *dev,
static DEVICE_ATTR(subdev_conf_mode, S_IWUSR | S_IRUGO,
fimc_md_sysfs_show, fimc_md_sysfs_store);
+static int fimc_md_get_pinctrl(struct fimc_md *fmd)
+{
+ fmd->pinctl = devm_pinctrl_get_select_default(&fmd->pdev->dev);
+ if (IS_ERR(fmd->pinctl))
+ return PTR_ERR(fmd->pinctl);
+
+ fmd->pinctl_state_default = pinctrl_lookup_state(fmd->pinctl,
+ PINCTRL_STATE_DEFAULT);
+ if (IS_ERR(fmd->pinctl_state_default))
+ return PTR_ERR(fmd->pinctl_state_default);
+
+ fmd->pinctl_state_idle = pinctrl_lookup_state(fmd->pinctl,
+ PINCTRL_STATE_INACTIVE);
+ if (IS_ERR(fmd->pinctl_state_idle))
+ return PTR_ERR(fmd->pinctl_state_idle);
+
+ return 0;
+}
+
static int fimc_md_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -1167,6 +1186,12 @@ static int fimc_md_probe(struct platform_device *pdev)
/* Protect the media graph while we're registering entities */
mutex_lock(&fmd->media_dev.graph_mutex);
+ if (dev->of_node) {
+ ret = fimc_md_get_pinctrl(fmd);
+ if (ret < 0)
+ goto err_unlock;
+ }
+
if (fmd->pdev->dev.of_node)
ret = fimc_md_register_of_platform_entities(fmd);
else
@@ -10,6 +10,7 @@
#define FIMC_MDEVICE_H_
#include <linux/clk.h>
+#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/mutex.h>
#include <media/media-device.h>
@@ -25,6 +26,8 @@
#define FIMC_LITE_OF_NODE_NAME "fimc_lite"
#define CSIS_OF_NODE_NAME "csis"
+#define PINCTRL_STATE_INACTIVE "inactive"
+
/* Group IDs of sensor, MIPI-CSIS, FIMC-LITE and the writeback subdevs. */
#define GRP_ID_SENSOR (1 << 8)
#define GRP_ID_FIMC_IS_SENSOR (1 << 9)
@@ -85,6 +88,9 @@ struct fimc_md {
struct media_device media_dev;
struct v4l2_device v4l2_dev;
struct platform_device *pdev;
+ struct pinctrl *pinctl;
+ struct pinctrl_state *pinctl_state_default;
+ struct pinctrl_state *pinctl_state_idle;
bool user_subdev_api;
spinlock_t slock;
};