Skip to content

Commit a5c4a65

Browse files
xuanhao_zhangasus-leslieyu
authored andcommitted
Camera: Use cif_clk_out 24MHz
Change-Id: Ic66a3770ea849a84f7499dd9faa1769ea3d4ddf8
1 parent 43cfd7c commit a5c4a65

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

arch/arm/boot/dts/overlays/camera-ov5647-overlay.dts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
camera0: ov5647@36 {
1313
compatible = "ovti,ov5647";
1414
reg = <0x36>;
15-
clocks = <&ext_cam_clk>;
15+
clocks = <&cru 127>;
16+
pinctrl-names = "rockchip,camera_default";
17+
pinctrl-0 = <&isp_mipi>;
1618
status = "okay";
1719

1820
port {
@@ -26,7 +28,9 @@
2628
camera1: imx219@10 {
2729
compatible = "sony,imx219";
2830
reg = <0x10>;
29-
clocks = <&ext_cam_clk>;
31+
clocks = <&cru 127>;
32+
pinctrl-names = "rockchip,camera_default";
33+
pinctrl-0 = <&isp_mipi>;
3034
status = "disabled";
3135
port {
3236
imx219_out: endpoint {

arch/arm/boot/dts/rk3288-miniarm.dts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,9 @@
517517
camera0: ov5647@36 {
518518
compatible = "ovti,ov5647";
519519
reg = <0x36>;
520-
clocks = <&ext_cam_clk>;
520+
clocks = <&cru SCLK_VIP_OUT>;
521+
pinctrl-names = "rockchip,camera_default";
522+
pinctrl-0 = <&isp_mipi>;
521523
status = "disabled";
522524
port {
523525
ov5647_out: endpoint {
@@ -528,7 +530,9 @@
528530
camera1: imx219@10 {
529531
compatible = "sony,imx219";
530532
reg = <0x10>;
531-
clocks = <&ext_cam_clk>;
533+
clocks = <&cru SCLK_VIP_OUT>;
534+
pinctrl-names = "rockchip,camera_default";
535+
pinctrl-0 = <&isp_mipi>;
532536
status = "okay";
533537
port {
534538
imx219_out: endpoint {

drivers/media/i2c/imx219.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <linux/io.h>
1515
#include <linux/module.h>
1616
#include <linux/of_graph.h>
17+
#include <linux/pinctrl/consumer.h>
1718
#include <linux/slab.h>
1819
#include <linux/videodev2.h>
1920
#include <media/v4l2-ctrls.h>
@@ -40,6 +41,9 @@
4041

4142
#define IMX219_EXP_LINES_MARGIN 4
4243

44+
#define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default"
45+
#define IMX219_XVCLK_FREQ 24000000
46+
4347
static const s64 link_freq_menu_items[] = {
4448
456000000,
4549
};
@@ -281,6 +285,9 @@ struct imx219 {
281285
struct v4l2_ctrl *pixel_rate;
282286
const struct imx219_mode *cur_mode;
283287
u16 cur_vts;
288+
289+
struct pinctrl *pinctrl;
290+
struct pinctrl_state *pins_default;
284291
};
285292

286293
static const struct imx219_mode supported_modes[] = {
@@ -967,6 +974,7 @@ static int imx219_probe(struct i2c_client *client,
967974
struct imx219 *priv;
968975
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
969976
int ret;
977+
u32 clk_freq;
970978

971979
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
972980
dev_warn(&adapter->dev,
@@ -977,12 +985,36 @@ static int imx219_probe(struct i2c_client *client,
977985
if (!priv)
978986
return -ENOMEM;
979987

988+
priv->pinctrl = devm_pinctrl_get(&client->dev);
989+
if (!IS_ERR(priv->pinctrl)) {
990+
priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
991+
OF_CAMERA_PINCTRL_STATE_DEFAULT);
992+
if (IS_ERR(priv->pins_default))
993+
dev_err(&client->dev, "could not get default pinstate\n");
994+
}
995+
996+
if (!IS_ERR_OR_NULL(priv->pins_default)) {
997+
ret = pinctrl_select_state(priv->pinctrl, priv->pins_default);
998+
if (ret < 0)
999+
dev_err(&client->dev, "could not set pins\n");
1000+
}
1001+
9801002
priv->clk = devm_clk_get(&client->dev, NULL);
9811003
if (IS_ERR(priv->clk)) {
9821004
dev_info(&client->dev, "Error %ld getting clock\n",
9831005
PTR_ERR(priv->clk));
9841006
return -EPROBE_DEFER;
9851007
}
1008+
ret = clk_set_rate(priv->clk, IMX219_XVCLK_FREQ);
1009+
if (ret < 0) {
1010+
dev_err(&client->dev, "Failed to set xvclk rate (24MHz)\n");
1011+
return ret;
1012+
}
1013+
clk_freq = clk_get_rate(priv->clk);
1014+
if (clk_freq != IMX219_XVCLK_FREQ) {
1015+
dev_err(&client->dev, "Unsupported clock frequency: %u\n", clk_freq);
1016+
return -EINVAL;
1017+
}
9861018

9871019
/* 1920 * 1080 by default */
9881020
priv->cur_mode = &supported_modes[0];

drivers/media/i2c/ov5647.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <linux/io.h>
2727
#include <linux/module.h>
2828
#include <linux/of_graph.h>
29+
#include <linux/pinctrl/consumer.h>
2930
#include <linux/slab.h>
3031
#include <linux/videodev2.h>
3132
#include <media/v4l2-ctrls.h>
@@ -58,6 +59,8 @@
5859
#define OV5647_ANALOG_GAIN_STEP 0x01
5960
#define OV5647_ANALOG_GAIN_DEFAULT 0x100
6061

62+
#define OF_CAMERA_PINCTRL_STATE_DEFAULT "rockchip,camera_default"
63+
#define OV5647_XVCLK_FREQ 24000000
6164
#define OV5647_LINK_FREQ_150MHZ 150000000
6265
static const s64 link_freq_menu_items[] = {
6366
OV5647_LINK_FREQ_150MHZ
@@ -87,6 +90,9 @@ struct ov5647_state {
8790
struct v4l2_ctrl *anal_gain;
8891

8992
const struct ov5647_mode *cur_mode;
93+
94+
struct pinctrl *pinctrl;
95+
struct pinctrl_state *pins_default;
9096
};
9197

9298
struct ov5647_mode {
@@ -851,15 +857,34 @@ static int ov5647_probe(struct i2c_client *client,
851857
}
852858
}
853859

860+
sensor->pinctrl = devm_pinctrl_get(dev);
861+
if (!IS_ERR(sensor->pinctrl)) {
862+
sensor->pins_default =
863+
pinctrl_lookup_state(sensor->pinctrl,
864+
OF_CAMERA_PINCTRL_STATE_DEFAULT);
865+
if (IS_ERR(sensor->pins_default))
866+
dev_err(dev, "could not get default pinstate\n");
867+
}
868+
if (!IS_ERR_OR_NULL(sensor->pins_default)) {
869+
ret = pinctrl_select_state(sensor->pinctrl,
870+
sensor->pins_default);
871+
if (ret < 0)
872+
dev_err(dev, "could not set pins\n");
873+
}
874+
854875
/* get system clock (xclk) */
855876
sensor->xclk = devm_clk_get(dev, NULL);
856877
if (IS_ERR(sensor->xclk)) {
857878
dev_err(dev, "could not get xclk");
858879
return PTR_ERR(sensor->xclk);
859880
}
860-
881+
ret = clk_set_rate(sensor->xclk, OV5647_XVCLK_FREQ);
882+
if (ret < 0) {
883+
dev_err(dev, "Failed to set xvclk rate (24MHz)\n");
884+
return ret;
885+
}
861886
xclk_freq = clk_get_rate(sensor->xclk);
862-
if (xclk_freq != 25000000) {
887+
if (xclk_freq != OV5647_XVCLK_FREQ) {
863888
dev_err(dev, "Unsupported clock frequency: %u\n", xclk_freq);
864889
return -EINVAL;
865890
}

0 commit comments

Comments
 (0)