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>
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+
4347static 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
286293static 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 ];
0 commit comments