6868#define LANE1_HS_RX_CONTROL 0x54
6969#define LANE2_HS_RX_CONTROL 0x84
7070#define LANE3_HS_RX_CONTROL 0x94
71- #define HS_RX_DATA_LANES_THS_SETTLE__CONTROL 0x75
71+ #define HS_RX_DATA_LANES_THS_SETTLE_CONTROL 0x75
72+
73+ /*
74+ * CSI HOST
75+ */
76+ #define CSIHOST_PHY_TEST_CTRL0 0x30
77+ #define CSIHOST_PHY_TEST_CTRL1 0x34
78+ #define CSIHOST_PHY_SHUTDOWNZ 0x08
79+ #define CSIHOST_DPHY_RSTZ 0x0c
80+
81+ #define PHY_TESTEN_ADDR (0x1 << 16)
82+ #define PHY_TESTEN_DATA (0x0 << 16)
83+ #define PHY_TESTCLK (0x1 << 1)
84+ #define PHY_TESTCLR (0x1 << 0)
85+ #define THS_SETTLE_COUNTER_THRESHOLD 0x04
7286
7387#define HIWORD_UPDATE (val , mask , shift ) \
7488 ((val) << (shift) | (mask) << ((shift) + 16))
@@ -185,6 +199,8 @@ struct hsfreq_range {
185199 u8 cfg_bit ;
186200};
187201
202+ struct mipidphy_priv ;
203+
188204struct dphy_drv_data {
189205 const char * const * clks ;
190206 int num_clks ;
@@ -221,14 +237,17 @@ struct mipidphy_priv {
221237 struct mipidphy_sensor sensors [MAX_DPHY_SENSORS ];
222238 int num_sensors ;
223239 bool is_streaming ;
240+ void __iomem * txrx_base_addr ;
241+ int (* stream_on )(struct mipidphy_priv * priv , struct v4l2_subdev * sd );
224242};
225243
226244static inline struct mipidphy_priv * to_dphy_priv (struct v4l2_subdev * subdev )
227245{
228246 return container_of (subdev , struct mipidphy_priv , sd );
229247}
230248
231- static inline void write_reg (struct mipidphy_priv * priv , int index , u8 value )
249+ static inline void write_grf_reg (struct mipidphy_priv * priv ,
250+ int index , u8 value )
232251{
233252 const struct dphy_reg * reg = & priv -> grf_regs [index ];
234253 unsigned int val = HIWORD_UPDATE (value , reg -> mask , reg -> shift );
@@ -237,21 +256,38 @@ static inline void write_reg(struct mipidphy_priv *priv, int index, u8 value)
237256 regmap_write (priv -> regmap_grf , reg -> offset , val );
238257}
239258
240- static void mipidphy_wr_reg (struct mipidphy_priv * priv ,
241- u8 test_code , u8 test_data )
259+ static void mipidphy0_wr_reg (struct mipidphy_priv * priv ,
260+ u8 test_code , u8 test_data )
242261{
243262 /*
244263 * With the falling edge on TESTCLK, the TESTDIN[7:0] signal content
245264 * is latched internally as the current test code. Test data is
246265 * programmed internally by rising edge on TESTCLK.
247266 */
248- write_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
249- write_reg (priv , GRF_DPHY_RX0_TESTDIN , test_code );
250- write_reg (priv , GRF_DPHY_RX0_TESTEN , 1 );
251- write_reg (priv , GRF_DPHY_RX0_TESTCLK , 0 );
252- write_reg (priv , GRF_DPHY_RX0_TESTEN , 0 );
253- write_reg (priv , GRF_DPHY_RX0_TESTDIN , test_data );
254- write_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
267+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
268+ write_grf_reg (priv , GRF_DPHY_RX0_TESTDIN , test_code );
269+ write_grf_reg (priv , GRF_DPHY_RX0_TESTEN , 1 );
270+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLK , 0 );
271+ write_grf_reg (priv , GRF_DPHY_RX0_TESTEN , 0 );
272+ write_grf_reg (priv , GRF_DPHY_RX0_TESTDIN , test_data );
273+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
274+ }
275+
276+ static void mipidphy1_wr_reg (struct mipidphy_priv * priv , unsigned char addr ,
277+ unsigned char data )
278+ {
279+ /*
280+ * TESTEN =1,TESTDIN=addr
281+ * TESTCLK=0
282+ * TESTEN =0,TESTDIN=data
283+ * TESTCLK=1
284+ */
285+ writel ((PHY_TESTEN_ADDR | addr ),
286+ priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL1 );
287+ writel (0x00 , priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL0 );
288+ writel ((PHY_TESTEN_DATA | data ),
289+ priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL1 );
290+ writel (PHY_TESTCLK , priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL0 );
255291}
256292
257293static struct v4l2_subdev * get_remote_sensor (struct v4l2_subdev * sd )
@@ -316,12 +352,7 @@ static int mipidphy_get_sensor_data_rate(struct v4l2_subdev *sd)
316352static int mipidphy_s_stream_start (struct v4l2_subdev * sd )
317353{
318354 struct mipidphy_priv * priv = to_dphy_priv (sd );
319- const struct dphy_drv_data * drv_data = priv -> drv_data ;
320- const struct hsfreq_range * hsfreq_ranges = drv_data -> hsfreq_ranges ;
321- int num_hsfreq_ranges = drv_data -> num_hsfreq_ranges ;
322- struct v4l2_subdev * sensor_sd = get_remote_sensor (sd );
323- struct mipidphy_sensor * sensor = sd_to_sensor (priv , sensor_sd );
324- int i , ret , hsfreq = 0 ;
355+ int ret = 0 ;
325356
326357 if (priv -> is_streaming )
327358 return 0 ;
@@ -330,44 +361,7 @@ static int mipidphy_s_stream_start(struct v4l2_subdev *sd)
330361 if (ret < 0 )
331362 return ret ;
332363
333- for (i = 0 ; i < num_hsfreq_ranges ; i ++ ) {
334- if (hsfreq_ranges [i ].range_h >= priv -> data_rate_mbps ) {
335- hsfreq = hsfreq_ranges [i ].cfg_bit ;
336- break ;
337- }
338- }
339-
340- write_reg (priv , GRF_DPHY_RX0_FORCERXMODE , 0 );
341- write_reg (priv , GRF_DPHY_RX0_FORCETXSTOPMODE , 0 );
342- /* Disable lan turn around, which is ignored in receive mode */
343- write_reg (priv , GRF_DPHY_RX0_TURNREQUEST , 0 );
344- write_reg (priv , GRF_DPHY_RX0_TURNDISABLE , 0xf );
345-
346- write_reg (priv , GRF_DPHY_RX0_ENABLE , GENMASK (sensor -> lanes - 1 , 0 ));
347-
348- /* dphy start */
349- write_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
350- write_reg (priv , GRF_DPHY_RX0_TESTCLR , 1 );
351- usleep_range (100 , 150 );
352- write_reg (priv , GRF_DPHY_RX0_TESTCLR , 0 );
353- usleep_range (100 , 150 );
354-
355- /* set clock lane */
356- /* HS hsfreq_range & lane 0 settle bypass */
357- mipidphy_wr_reg (priv , CLOCK_LANE_HS_RX_CONTROL , 0 );
358- /* HS RX Control of lane0 */
359- mipidphy_wr_reg (priv , LANE0_HS_RX_CONTROL , hsfreq << 1 );
360- /* HS RX Control of lane1 */
361- mipidphy_wr_reg (priv , LANE1_HS_RX_CONTROL , 0 );
362- /* HS RX Control of lane2 */
363- mipidphy_wr_reg (priv , LANE2_HS_RX_CONTROL , 0 );
364- /* HS RX Control of lane3 */
365- mipidphy_wr_reg (priv , LANE3_HS_RX_CONTROL , 0 );
366- /* HS RX Data Lanes Settle State Time Control */
367- mipidphy_wr_reg (priv , HS_RX_DATA_LANES_THS_SETTLE__CONTROL , 0x04 );
368-
369- /* Normal operation */
370- mipidphy_wr_reg (priv , 0x0 , 0 );
364+ priv -> stream_on (priv , sd );
371365
372366 priv -> is_streaming = true;
373367
@@ -521,6 +515,112 @@ static const char * const rk3288_mipidphy_clks[] = {
521515 "pclk" ,
522516};
523517
518+ static int mipidphy_rx_stream_on (struct mipidphy_priv * priv ,
519+ struct v4l2_subdev * sd )
520+ {
521+ struct v4l2_subdev * sensor_sd = get_remote_sensor (sd );
522+ struct mipidphy_sensor * sensor = sd_to_sensor (priv , sensor_sd );
523+ const struct dphy_drv_data * drv_data = priv -> drv_data ;
524+ const struct hsfreq_range * hsfreq_ranges = drv_data -> hsfreq_ranges ;
525+ int num_hsfreq_ranges = drv_data -> num_hsfreq_ranges ;
526+ int i , hsfreq = 0 ;
527+
528+ for (i = 0 ; i < num_hsfreq_ranges ; i ++ ) {
529+ if (hsfreq_ranges [i ].range_h >= priv -> data_rate_mbps ) {
530+ hsfreq = hsfreq_ranges [i ].cfg_bit ;
531+ break ;
532+ }
533+ }
534+ write_grf_reg (priv , GRF_CON_ISP_DPHY_SEL , 0 );
535+ write_grf_reg (priv , GRF_DPHY_RX0_FORCERXMODE , 0 );
536+ write_grf_reg (priv , GRF_DPHY_RX0_FORCETXSTOPMODE , 0 );
537+ /* Disable lan turn around, which is ignored in receive mode */
538+ write_grf_reg (priv , GRF_DPHY_RX0_TURNREQUEST , 0 );
539+ write_grf_reg (priv , GRF_DPHY_RX0_TURNDISABLE , 0xf );
540+
541+ write_grf_reg (priv , GRF_DPHY_RX0_ENABLE , GENMASK (sensor -> lanes - 1 , 0 ));
542+
543+ /* dphy start */
544+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLK , 1 );
545+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLR , 1 );
546+ usleep_range (100 , 150 );
547+ write_grf_reg (priv , GRF_DPHY_RX0_TESTCLR , 0 );
548+ usleep_range (100 , 150 );
549+
550+ /* set clock lane */
551+ /* HS hsfreq_range & lane 0 settle bypass */
552+ mipidphy0_wr_reg (priv , CLOCK_LANE_HS_RX_CONTROL , 0 );
553+ /* HS RX Control of lane0 */
554+ mipidphy0_wr_reg (priv , LANE0_HS_RX_CONTROL , hsfreq << 1 );
555+ /* HS RX Control of lane1 */
556+ mipidphy0_wr_reg (priv , LANE1_HS_RX_CONTROL , 0 );
557+ /* HS RX Control of lane2 */
558+ mipidphy0_wr_reg (priv , LANE2_HS_RX_CONTROL , 0 );
559+ /* HS RX Control of lane3 */
560+ mipidphy0_wr_reg (priv , LANE3_HS_RX_CONTROL , 0 );
561+ /* HS RX Data Lanes Settle State Time Control */
562+ mipidphy0_wr_reg (priv , HS_RX_DATA_LANES_THS_SETTLE_CONTROL ,
563+ THS_SETTLE_COUNTER_THRESHOLD );
564+
565+ /* Normal operation */
566+ mipidphy0_wr_reg (priv , 0x0 , 0 );
567+
568+ return 0 ;
569+ }
570+
571+ static int mipidphy_txrx_stream_on (struct mipidphy_priv * priv ,
572+ struct v4l2_subdev * sd )
573+ {
574+ struct v4l2_subdev * sensor_sd = get_remote_sensor (sd );
575+ struct mipidphy_sensor * sensor = sd_to_sensor (priv , sensor_sd );
576+ const struct dphy_drv_data * drv_data = priv -> drv_data ;
577+ const struct hsfreq_range * hsfreq_ranges = drv_data -> hsfreq_ranges ;
578+ int num_hsfreq_ranges = drv_data -> num_hsfreq_ranges ;
579+ int i , hsfreq = 0 ;
580+
581+ for (i = 0 ; i < num_hsfreq_ranges ; i ++ ) {
582+ if (hsfreq_ranges [i ].range_h >= priv -> data_rate_mbps ) {
583+ hsfreq = hsfreq_ranges [i ].cfg_bit ;
584+ break ;
585+ }
586+ }
587+ write_grf_reg (priv , GRF_CON_ISP_DPHY_SEL , 1 );
588+ write_grf_reg (priv , GRF_DSI_CSI_TESTBUS_SEL , 1 );
589+ write_grf_reg (priv , GRF_DPHY_RX1_SRC_SEL , 1 );
590+ write_grf_reg (priv , GRF_DPHY_TX1RX1_MASTERSLAVEZ , 0 );
591+ write_grf_reg (priv , GRF_DPHY_TX1RX1_BASEDIR , 1 );
592+ /* Disable lan turn around, which is ignored in receive mode */
593+ write_grf_reg (priv , GRF_DPHY_TX1RX1_FORCERXMODE , 0 );
594+ write_grf_reg (priv , GRF_DPHY_TX1RX1_FORCETXSTOPMODE , 0 );
595+ write_grf_reg (priv , GRF_DPHY_TX1RX1_TURNREQUEST , 0 );
596+ write_grf_reg (priv , GRF_DPHY_TX1RX1_TURNDISABLE , 0xf );
597+ write_grf_reg (priv , GRF_DPHY_TX1RX1_ENABLE ,
598+ GENMASK (sensor -> lanes - 1 , 0 ));
599+ /* dphy start */
600+ writel (0 , priv -> txrx_base_addr + CSIHOST_PHY_SHUTDOWNZ );
601+ writel (0 , priv -> txrx_base_addr + CSIHOST_DPHY_RSTZ );
602+ writel (PHY_TESTCLK , priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL0 );
603+ writel (PHY_TESTCLR , priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL0 );
604+ usleep_range (100 , 150 );
605+ writel (PHY_TESTCLK , priv -> txrx_base_addr + CSIHOST_PHY_TEST_CTRL0 );
606+ usleep_range (100 , 150 );
607+
608+ /* set clock lane */
609+ mipidphy1_wr_reg (priv , CLOCK_LANE_HS_RX_CONTROL , 0 );
610+ mipidphy1_wr_reg (priv , LANE0_HS_RX_CONTROL , hsfreq << 1 );
611+ mipidphy1_wr_reg (priv , LANE1_HS_RX_CONTROL , 0 );
612+ mipidphy1_wr_reg (priv , LANE2_HS_RX_CONTROL , 0 );
613+ mipidphy1_wr_reg (priv , LANE3_HS_RX_CONTROL , 0 );
614+ /* HS RX Data Lanes Settle State Time Control */
615+ mipidphy1_wr_reg (priv , HS_RX_DATA_LANES_THS_SETTLE_CONTROL ,
616+ THS_SETTLE_COUNTER_THRESHOLD );
617+
618+ /* Normal operation */
619+ mipidphy1_wr_reg (priv , 0x0 , 0 );
620+
621+ return 0 ;
622+ }
623+
524624static const struct dphy_drv_data rk3288_mipidphy_drv_data = {
525625 .clks = rk3288_mipidphy_clks ,
526626 .num_clks = ARRAY_SIZE (rk3288_mipidphy_clks ),
@@ -620,8 +720,8 @@ v4l2_async_notifier_operations rockchip_mipidphy_async_ops = {
620720};
621721
622722static int rockchip_mipidphy_fwnode_parse (struct device * dev ,
623- struct v4l2_fwnode_endpoint * vep ,
624- struct v4l2_async_subdev * asd )
723+ struct v4l2_fwnode_endpoint * vep ,
724+ struct v4l2_async_subdev * asd )
625725{
626726 struct sensor_async_subdev * s_asd =
627727 container_of (asd , struct sensor_async_subdev , asd );
@@ -671,7 +771,7 @@ static int rockchip_mipidphy_media_init(struct mipidphy_priv *priv)
671771 MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT ;
672772
673773 ret = media_entity_init (& priv -> sd .entity ,
674- MIPI_DPHY_SY_PADS_NUM , priv -> pads , 0 );
774+ MIPI_DPHY_SY_PADS_NUM , priv -> pads , 0 );
675775 if (ret < 0 )
676776 return ret ;
677777
@@ -704,6 +804,7 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
704804 struct v4l2_subdev * sd ;
705805 struct mipidphy_priv * priv ;
706806 struct regmap * grf ;
807+ struct resource * res ;
707808 const struct of_device_id * of_id ;
708809 const struct dphy_drv_data * drv_data ;
709810 int i , ret ;
@@ -719,8 +820,12 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
719820
720821 grf = syscon_node_to_regmap (dev -> parent -> of_node );
721822 if (IS_ERR (grf )) {
722- dev_err (dev , "Can't find GRF syscon\n" );
723- return - ENODEV ;
823+ grf = syscon_regmap_lookup_by_phandle (dev -> of_node ,
824+ "rockchip,grf" );
825+ if (IS_ERR (grf )) {
826+ dev_err (dev , "Can't find GRF syscon\n" );
827+ return - ENODEV ;
828+ }
724829 }
725830 priv -> regmap_grf = grf ;
726831
@@ -736,6 +841,12 @@ static int rockchip_mipidphy_probe(struct platform_device *pdev)
736841
737842 priv -> grf_regs = drv_data -> regs ;
738843 priv -> drv_data = drv_data ;
844+ priv -> stream_on = mipidphy_txrx_stream_on ;
845+ priv -> txrx_base_addr = NULL ;
846+ res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
847+ priv -> txrx_base_addr = devm_ioremap_resource (dev , res );
848+ if (IS_ERR (priv -> txrx_base_addr ))
849+ priv -> stream_on = mipidphy_rx_stream_on ;
739850
740851 sd = & priv -> sd ;
741852 v4l2_subdev_init (sd , & mipidphy_subdev_ops );
0 commit comments