Commit c2cae895 authored by Akinobu Mita's avatar Akinobu Mita Committed by Mauro Carvalho Chehab

media: ov772x: support device tree probing

The ov772x driver currently only supports legacy platform data probe.
This change enables device tree probing.

Note that the platform data probe can select auto or manual edge control
mode, but the device tree probling can only select auto edge control mode
for now.

[Sakari Ailus: Remove direct OF dependencies from device ID table]

Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Hans Verkuil <hans.verkuil@cisco.com>
Reviewed-by: default avatarJacopo Mondi <jacopo@jmondi.org>
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 89ce93fd
...@@ -749,13 +749,13 @@ static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl) ...@@ -749,13 +749,13 @@ static int ov772x_s_ctrl(struct v4l2_ctrl *ctrl)
case V4L2_CID_VFLIP: case V4L2_CID_VFLIP:
val = ctrl->val ? VFLIP_IMG : 0x00; val = ctrl->val ? VFLIP_IMG : 0x00;
priv->flag_vflip = ctrl->val; priv->flag_vflip = ctrl->val;
if (priv->info->flags & OV772X_FLAG_VFLIP) if (priv->info && (priv->info->flags & OV772X_FLAG_VFLIP))
val ^= VFLIP_IMG; val ^= VFLIP_IMG;
return ov772x_mask_set(client, COM3, VFLIP_IMG, val); return ov772x_mask_set(client, COM3, VFLIP_IMG, val);
case V4L2_CID_HFLIP: case V4L2_CID_HFLIP:
val = ctrl->val ? HFLIP_IMG : 0x00; val = ctrl->val ? HFLIP_IMG : 0x00;
priv->flag_hflip = ctrl->val; priv->flag_hflip = ctrl->val;
if (priv->info->flags & OV772X_FLAG_HFLIP) if (priv->info && (priv->info->flags & OV772X_FLAG_HFLIP))
val ^= HFLIP_IMG; val ^= HFLIP_IMG;
return ov772x_mask_set(client, COM3, HFLIP_IMG, val); return ov772x_mask_set(client, COM3, HFLIP_IMG, val);
case V4L2_CID_BAND_STOP_FILTER: case V4L2_CID_BAND_STOP_FILTER:
...@@ -914,19 +914,14 @@ static void ov772x_select_params(const struct v4l2_mbus_framefmt *mf, ...@@ -914,19 +914,14 @@ static void ov772x_select_params(const struct v4l2_mbus_framefmt *mf,
*win = ov772x_select_win(mf->width, mf->height); *win = ov772x_select_win(mf->width, mf->height);
} }
static int ov772x_set_params(struct ov772x_priv *priv, static int ov772x_edgectrl(struct ov772x_priv *priv)
const struct ov772x_color_format *cfmt,
const struct ov772x_win_size *win)
{ {
struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev); struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
struct v4l2_fract tpf;
int ret; int ret;
u8 val;
/* Reset hardware. */ if (!priv->info)
ov772x_reset(client); return 0;
/* Edge Ctrl. */
if (priv->info->edgectrl.strength & OV772X_MANUAL_EDGE_CTRL) { if (priv->info->edgectrl.strength & OV772X_MANUAL_EDGE_CTRL) {
/* /*
* Manual Edge Control Mode. * Manual Edge Control Mode.
...@@ -937,19 +932,19 @@ static int ov772x_set_params(struct ov772x_priv *priv, ...@@ -937,19 +932,19 @@ static int ov772x_set_params(struct ov772x_priv *priv,
ret = ov772x_mask_set(client, DSPAUTO, EDGE_ACTRL, 0x00); ret = ov772x_mask_set(client, DSPAUTO, EDGE_ACTRL, 0x00);
if (ret < 0) if (ret < 0)
goto ov772x_set_fmt_error; return ret;
ret = ov772x_mask_set(client, ret = ov772x_mask_set(client,
EDGE_TRSHLD, OV772X_EDGE_THRESHOLD_MASK, EDGE_TRSHLD, OV772X_EDGE_THRESHOLD_MASK,
priv->info->edgectrl.threshold); priv->info->edgectrl.threshold);
if (ret < 0) if (ret < 0)
goto ov772x_set_fmt_error; return ret;
ret = ov772x_mask_set(client, ret = ov772x_mask_set(client,
EDGE_STRNGT, OV772X_EDGE_STRENGTH_MASK, EDGE_STRNGT, OV772X_EDGE_STRENGTH_MASK,
priv->info->edgectrl.strength); priv->info->edgectrl.strength);
if (ret < 0) if (ret < 0)
goto ov772x_set_fmt_error; return ret;
} else if (priv->info->edgectrl.upper > priv->info->edgectrl.lower) { } else if (priv->info->edgectrl.upper > priv->info->edgectrl.lower) {
/* /*
...@@ -961,15 +956,35 @@ static int ov772x_set_params(struct ov772x_priv *priv, ...@@ -961,15 +956,35 @@ static int ov772x_set_params(struct ov772x_priv *priv,
EDGE_UPPER, OV772X_EDGE_UPPER_MASK, EDGE_UPPER, OV772X_EDGE_UPPER_MASK,
priv->info->edgectrl.upper); priv->info->edgectrl.upper);
if (ret < 0) if (ret < 0)
goto ov772x_set_fmt_error; return ret;
ret = ov772x_mask_set(client, ret = ov772x_mask_set(client,
EDGE_LOWER, OV772X_EDGE_LOWER_MASK, EDGE_LOWER, OV772X_EDGE_LOWER_MASK,
priv->info->edgectrl.lower); priv->info->edgectrl.lower);
if (ret < 0) if (ret < 0)
goto ov772x_set_fmt_error; return ret;
} }
return 0;
}
static int ov772x_set_params(struct ov772x_priv *priv,
const struct ov772x_color_format *cfmt,
const struct ov772x_win_size *win)
{
struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
struct v4l2_fract tpf;
int ret;
u8 val;
/* Reset hardware. */
ov772x_reset(client);
/* Edge Ctrl. */
ret = ov772x_edgectrl(priv);
if (ret < 0)
return ret;
/* Format and window size. */ /* Format and window size. */
ret = ov772x_write(client, HSTART, win->rect.left >> 2); ret = ov772x_write(client, HSTART, win->rect.left >> 2);
if (ret < 0) if (ret < 0)
...@@ -1020,9 +1035,9 @@ static int ov772x_set_params(struct ov772x_priv *priv, ...@@ -1020,9 +1035,9 @@ static int ov772x_set_params(struct ov772x_priv *priv,
/* Set COM3. */ /* Set COM3. */
val = cfmt->com3; val = cfmt->com3;
if (priv->info->flags & OV772X_FLAG_VFLIP) if (priv->info && (priv->info->flags & OV772X_FLAG_VFLIP))
val |= VFLIP_IMG; val |= VFLIP_IMG;
if (priv->info->flags & OV772X_FLAG_HFLIP) if (priv->info && (priv->info->flags & OV772X_FLAG_HFLIP))
val |= HFLIP_IMG; val |= HFLIP_IMG;
if (priv->flag_vflip) if (priv->flag_vflip)
val ^= VFLIP_IMG; val ^= VFLIP_IMG;
...@@ -1271,8 +1286,9 @@ static int ov772x_probe(struct i2c_client *client, ...@@ -1271,8 +1286,9 @@ static int ov772x_probe(struct i2c_client *client,
struct i2c_adapter *adapter = client->adapter; struct i2c_adapter *adapter = client->adapter;
int ret; int ret;
if (!client->dev.platform_data) { if (!client->dev.of_node && !client->dev.platform_data) {
dev_err(&client->dev, "Missing ov772x platform data\n"); dev_err(&client->dev,
"Missing ov772x platform data for non-DT device\n");
return -EINVAL; return -EINVAL;
} }
...@@ -1370,9 +1386,17 @@ static const struct i2c_device_id ov772x_id[] = { ...@@ -1370,9 +1386,17 @@ static const struct i2c_device_id ov772x_id[] = {
}; };
MODULE_DEVICE_TABLE(i2c, ov772x_id); MODULE_DEVICE_TABLE(i2c, ov772x_id);
static const struct of_device_id ov772x_of_match[] = {
{ .compatible = "ovti,ov7725", },
{ .compatible = "ovti,ov7720", },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, ov772x_of_match);
static struct i2c_driver ov772x_i2c_driver = { static struct i2c_driver ov772x_i2c_driver = {
.driver = { .driver = {
.name = "ov772x", .name = "ov772x",
.of_match_table = ov772x_of_match,
}, },
.probe = ov772x_probe, .probe = ov772x_probe,
.remove = ov772x_remove, .remove = ov772x_remove,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment