55
66#include <linux/clk.h>
77#include <linux/delay.h>
8+ #include <linux/interconnect.h>
89#include <linux/irq.h>
910#include <linux/irqchip.h>
1011#include <linux/irqdesc.h>
2526#define UBWC_CTRL_2 0x150
2627#define UBWC_PREDICTION_MODE 0x154
2728
29+ #define MIN_IB_BW 400000000UL /* Min ib vote 400MB */
30+
2831struct msm_mdss {
2932 struct device * dev ;
3033
@@ -36,8 +39,47 @@ struct msm_mdss {
3639 unsigned long enabled_mask ;
3740 struct irq_domain * domain ;
3841 } irq_controller ;
42+ struct icc_path * path [2 ];
43+ u32 num_paths ;
3944};
4045
46+ static int msm_mdss_parse_data_bus_icc_path (struct device * dev ,
47+ struct msm_mdss * msm_mdss )
48+ {
49+ struct icc_path * path0 = of_icc_get (dev , "mdp0-mem" );
50+ struct icc_path * path1 = of_icc_get (dev , "mdp1-mem" );
51+
52+ if (IS_ERR_OR_NULL (path0 ))
53+ return PTR_ERR_OR_ZERO (path0 );
54+
55+ msm_mdss -> path [0 ] = path0 ;
56+ msm_mdss -> num_paths = 1 ;
57+
58+ if (!IS_ERR_OR_NULL (path1 )) {
59+ msm_mdss -> path [1 ] = path1 ;
60+ msm_mdss -> num_paths ++ ;
61+ }
62+
63+ return 0 ;
64+ }
65+
66+ static void msm_mdss_put_icc_path (void * data )
67+ {
68+ struct msm_mdss * msm_mdss = data ;
69+ int i ;
70+
71+ for (i = 0 ; i < msm_mdss -> num_paths ; i ++ )
72+ icc_put (msm_mdss -> path [i ]);
73+ }
74+
75+ static void msm_mdss_icc_request_bw (struct msm_mdss * msm_mdss , unsigned long bw )
76+ {
77+ int i ;
78+
79+ for (i = 0 ; i < msm_mdss -> num_paths ; i ++ )
80+ icc_set_bw (msm_mdss -> path [i ], 0 , Bps_to_icc (bw ));
81+ }
82+
4183static void msm_mdss_irq (struct irq_desc * desc )
4284{
4385 struct msm_mdss * msm_mdss = irq_desc_get_handler_data (desc );
@@ -136,6 +178,13 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
136178{
137179 int ret ;
138180
181+ /*
182+ * Several components have AXI clocks that can only be turned on if
183+ * the interconnect is enabled (non-zero bandwidth). Let's make sure
184+ * that the interconnects are at least at a minimum amount.
185+ */
186+ msm_mdss_icc_request_bw (msm_mdss , MIN_IB_BW );
187+
139188 ret = clk_bulk_prepare_enable (msm_mdss -> num_clocks , msm_mdss -> clocks );
140189 if (ret ) {
141190 dev_err (msm_mdss -> dev , "clock enable failed, ret:%d\n" , ret );
@@ -178,6 +227,7 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)
178227static int msm_mdss_disable (struct msm_mdss * msm_mdss )
179228{
180229 clk_bulk_disable_unprepare (msm_mdss -> num_clocks , msm_mdss -> clocks );
230+ msm_mdss_icc_request_bw (msm_mdss , 0 );
181231
182232 return 0 ;
183233}
@@ -271,6 +321,13 @@ static struct msm_mdss *msm_mdss_init(struct platform_device *pdev, bool is_mdp5
271321
272322 dev_dbg (& pdev -> dev , "mapped mdss address space @%pK\n" , msm_mdss -> mmio );
273323
324+ ret = msm_mdss_parse_data_bus_icc_path (& pdev -> dev , msm_mdss );
325+ if (ret )
326+ return ERR_PTR (ret );
327+ ret = devm_add_action_or_reset (& pdev -> dev , msm_mdss_put_icc_path , msm_mdss );
328+ if (ret )
329+ return ERR_PTR (ret );
330+
274331 if (is_mdp5 )
275332 ret = mdp5_mdss_parse_clock (pdev , & msm_mdss -> clocks );
276333 else
0 commit comments