@@ -31,26 +31,34 @@ static const struct dwc_pwm_info ehl_pwm_info = {
31
31
.size = 0x1000 ,
32
32
};
33
33
34
- static int dwc_pwm_init_one (struct device * dev , void __iomem * base , unsigned int offset )
34
+ static int dwc_pwm_init_one (struct device * dev , struct dwc_pwm_drvdata * ddata , unsigned int idx )
35
35
{
36
36
struct pwm_chip * chip ;
37
37
struct dwc_pwm * dwc ;
38
+ int ret ;
38
39
39
40
chip = dwc_pwm_alloc (dev );
40
41
if (IS_ERR (chip ))
41
42
return PTR_ERR (chip );
42
43
43
44
dwc = to_dwc_pwm (chip );
44
- dwc -> base = base + offset ;
45
+ dwc -> base = ddata -> io_base + ( ddata -> info -> size * idx ) ;
45
46
46
- return devm_pwmchip_add (dev , chip );
47
+ ret = devm_pwmchip_add (dev , chip );
48
+ if (ret )
49
+ return ret ;
50
+
51
+ ddata -> chips [idx ] = chip ;
52
+ return 0 ;
47
53
}
48
54
49
55
static int dwc_pwm_probe (struct pci_dev * pci , const struct pci_device_id * id )
50
56
{
51
57
const struct dwc_pwm_info * info ;
52
58
struct device * dev = & pci -> dev ;
53
- int i , ret ;
59
+ struct dwc_pwm_drvdata * ddata ;
60
+ unsigned int idx ;
61
+ int ret ;
54
62
55
63
ret = pcim_enable_device (pci );
56
64
if (ret )
@@ -63,17 +71,25 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
63
71
return dev_err_probe (dev , ret , "Failed to iomap PCI BAR\n" );
64
72
65
73
info = (const struct dwc_pwm_info * )id -> driver_data ;
66
-
67
- for (i = 0 ; i < info -> nr ; i ++ ) {
68
- /*
69
- * No need to check for pcim_iomap_table() failure,
70
- * pcim_iomap_regions() already does it for us.
71
- */
72
- ret = dwc_pwm_init_one (dev , pcim_iomap_table (pci )[0 ], i * info -> size );
74
+ ddata = devm_kzalloc (dev , struct_size (ddata , chips , info -> nr ), GFP_KERNEL );
75
+ if (!ddata )
76
+ return - ENOMEM ;
77
+
78
+ /*
79
+ * No need to check for pcim_iomap_table() failure,
80
+ * pcim_iomap_regions() already does it for us.
81
+ */
82
+ ddata -> io_base = pcim_iomap_table (pci )[0 ];
83
+ ddata -> info = info ;
84
+
85
+ for (idx = 0 ; idx < ddata -> info -> nr ; idx ++ ) {
86
+ ret = dwc_pwm_init_one (dev , ddata , idx );
73
87
if (ret )
74
88
return ret ;
75
89
}
76
90
91
+ dev_set_drvdata (dev , ddata );
92
+
77
93
pm_runtime_put (dev );
78
94
pm_runtime_allow (dev );
79
95
@@ -88,34 +104,44 @@ static void dwc_pwm_remove(struct pci_dev *pci)
88
104
89
105
static int dwc_pwm_suspend (struct device * dev )
90
106
{
91
- struct pwm_chip * chip = dev_get_drvdata (dev );
92
- struct dwc_pwm * dwc = to_dwc_pwm (chip );
93
- int i ;
94
-
95
- for (i = 0 ; i < DWC_TIMERS_TOTAL ; i ++ ) {
96
- if (chip -> pwms [i ].state .enabled ) {
97
- dev_err (dev , "PWM %u in use by consumer (%s)\n" ,
98
- i , chip -> pwms [i ].label );
99
- return - EBUSY ;
107
+ struct dwc_pwm_drvdata * ddata = dev_get_drvdata (dev );
108
+ unsigned int idx ;
109
+
110
+ for (idx = 0 ; idx < ddata -> info -> nr ; idx ++ ) {
111
+ struct pwm_chip * chip = ddata -> chips [idx ];
112
+ struct dwc_pwm * dwc = to_dwc_pwm (chip );
113
+ unsigned int i ;
114
+
115
+ for (i = 0 ; i < DWC_TIMERS_TOTAL ; i ++ ) {
116
+ if (chip -> pwms [i ].state .enabled ) {
117
+ dev_err (dev , "PWM %u in use by consumer (%s)\n" ,
118
+ i , chip -> pwms [i ].label );
119
+ return - EBUSY ;
120
+ }
121
+ dwc -> ctx [i ].cnt = dwc_pwm_readl (dwc , DWC_TIM_LD_CNT (i ));
122
+ dwc -> ctx [i ].cnt2 = dwc_pwm_readl (dwc , DWC_TIM_LD_CNT2 (i ));
123
+ dwc -> ctx [i ].ctrl = dwc_pwm_readl (dwc , DWC_TIM_CTRL (i ));
100
124
}
101
- dwc -> ctx [i ].cnt = dwc_pwm_readl (dwc , DWC_TIM_LD_CNT (i ));
102
- dwc -> ctx [i ].cnt2 = dwc_pwm_readl (dwc , DWC_TIM_LD_CNT2 (i ));
103
- dwc -> ctx [i ].ctrl = dwc_pwm_readl (dwc , DWC_TIM_CTRL (i ));
104
125
}
105
126
106
127
return 0 ;
107
128
}
108
129
109
130
static int dwc_pwm_resume (struct device * dev )
110
131
{
111
- struct pwm_chip * chip = dev_get_drvdata (dev );
112
- struct dwc_pwm * dwc = to_dwc_pwm (chip );
113
- int i ;
114
-
115
- for (i = 0 ; i < DWC_TIMERS_TOTAL ; i ++ ) {
116
- dwc_pwm_writel (dwc , dwc -> ctx [i ].cnt , DWC_TIM_LD_CNT (i ));
117
- dwc_pwm_writel (dwc , dwc -> ctx [i ].cnt2 , DWC_TIM_LD_CNT2 (i ));
118
- dwc_pwm_writel (dwc , dwc -> ctx [i ].ctrl , DWC_TIM_CTRL (i ));
132
+ struct dwc_pwm_drvdata * ddata = dev_get_drvdata (dev );
133
+ unsigned int idx ;
134
+
135
+ for (idx = 0 ; idx < ddata -> info -> nr ; idx ++ ) {
136
+ struct pwm_chip * chip = ddata -> chips [idx ];
137
+ struct dwc_pwm * dwc = to_dwc_pwm (chip );
138
+ unsigned int i ;
139
+
140
+ for (i = 0 ; i < DWC_TIMERS_TOTAL ; i ++ ) {
141
+ dwc_pwm_writel (dwc , dwc -> ctx [i ].cnt , DWC_TIM_LD_CNT (i ));
142
+ dwc_pwm_writel (dwc , dwc -> ctx [i ].cnt2 , DWC_TIM_LD_CNT2 (i ));
143
+ dwc_pwm_writel (dwc , dwc -> ctx [i ].ctrl , DWC_TIM_CTRL (i ));
144
+ }
119
145
}
120
146
121
147
return 0 ;
0 commit comments