25
25
26
26
#include "pwm-dwc.h"
27
27
28
- static int dwc_pwm_probe (struct pci_dev * pci , const struct pci_device_id * id )
28
+ /* Elkhart Lake */
29
+ static const struct dwc_pwm_info ehl_pwm_info = {
30
+ .nr = 2 ,
31
+ .size = 0x1000 ,
32
+ };
33
+
34
+ static int dwc_pwm_init_one (struct device * dev , void __iomem * base , unsigned int offset )
29
35
{
30
- struct device * dev = & pci -> dev ;
31
36
struct pwm_chip * chip ;
32
37
struct dwc_pwm * dwc ;
33
- int ret ;
34
38
35
39
chip = dwc_pwm_alloc (dev );
36
40
if (IS_ERR (chip ))
37
41
return PTR_ERR (chip );
42
+
38
43
dwc = to_dwc_pwm (chip );
44
+ dwc -> base = base + offset ;
45
+
46
+ return devm_pwmchip_add (dev , chip );
47
+ }
48
+
49
+ static int dwc_pwm_probe (struct pci_dev * pci , const struct pci_device_id * id )
50
+ {
51
+ const struct dwc_pwm_info * info ;
52
+ struct device * dev = & pci -> dev ;
53
+ int i , ret ;
39
54
40
55
ret = pcim_enable_device (pci );
41
56
if (ret ) {
@@ -51,12 +66,17 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id)
51
66
return ret ;
52
67
}
53
68
54
- /* No need to check for failure, pcim_iomap_regions() does it for us. */
55
- dwc -> base = pcim_iomap_table (pci )[0 ];
69
+ info = (const struct dwc_pwm_info * )id -> driver_data ;
56
70
57
- ret = devm_pwmchip_add (dev , chip );
58
- if (ret )
59
- return ret ;
71
+ for (i = 0 ; i < info -> nr ; i ++ ) {
72
+ /*
73
+ * No need to check for pcim_iomap_table() failure,
74
+ * pcim_iomap_regions() already does it for us.
75
+ */
76
+ ret = dwc_pwm_init_one (dev , pcim_iomap_table (pci )[0 ], i * info -> size );
77
+ if (ret )
78
+ return ret ;
79
+ }
60
80
61
81
pm_runtime_put (dev );
62
82
pm_runtime_allow (dev );
@@ -108,7 +128,7 @@ static int dwc_pwm_resume(struct device *dev)
108
128
static DEFINE_SIMPLE_DEV_PM_OPS (dwc_pwm_pm_ops , dwc_pwm_suspend , dwc_pwm_resume ) ;
109
129
110
130
static const struct pci_device_id dwc_pwm_id_table [] = {
111
- { PCI_VDEVICE (INTEL , 0x4bb7 ) }, /* Elkhart Lake */
131
+ { PCI_VDEVICE (INTEL , 0x4bb7 ), ( kernel_ulong_t ) & ehl_pwm_info },
112
132
{ } /* Terminating Entry */
113
133
};
114
134
MODULE_DEVICE_TABLE (pci , dwc_pwm_id_table );
0 commit comments