forked from mirrors/linux
		
	pwm: dwc: Add 16 channel support for Intel Elkhart Lake
Intel Elkhart Lake PSE includes two instances of PWM as a single PCI function with 8 channels each. Add support for the remaining channels. Signed-off-by: Raag Jadav <raag.jadav@intel.com> Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Tested-by: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com> Link: https://lore.kernel.org/r/20240219033835.11369-4-raag.jadav@intel.com Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
This commit is contained in:
		
							parent
							
								
									144a0008b3
								
							
						
					
					
						commit
						ebf2c89eb9
					
				
					 2 changed files with 34 additions and 9 deletions
				
			
		|  | @ -25,17 +25,32 @@ | |||
| 
 | ||||
| #include "pwm-dwc.h" | ||||
| 
 | ||||
| static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id) | ||||
| /* Elkhart Lake */ | ||||
| static const struct dwc_pwm_info ehl_pwm_info = { | ||||
| 	.nr = 2, | ||||
| 	.size = 0x1000, | ||||
| }; | ||||
| 
 | ||||
| static int dwc_pwm_init_one(struct device *dev, void __iomem *base, unsigned int offset) | ||||
| { | ||||
| 	struct device *dev = &pci->dev; | ||||
| 	struct pwm_chip *chip; | ||||
| 	struct dwc_pwm *dwc; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	chip = dwc_pwm_alloc(dev); | ||||
| 	if (IS_ERR(chip)) | ||||
| 		return PTR_ERR(chip); | ||||
| 
 | ||||
| 	dwc = to_dwc_pwm(chip); | ||||
| 	dwc->base = base + offset; | ||||
| 
 | ||||
| 	return devm_pwmchip_add(dev, chip); | ||||
| } | ||||
| 
 | ||||
| static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id) | ||||
| { | ||||
| 	const struct dwc_pwm_info *info; | ||||
| 	struct device *dev = &pci->dev; | ||||
| 	int i, ret; | ||||
| 
 | ||||
| 	ret = pcim_enable_device(pci); | ||||
| 	if (ret) { | ||||
|  | @ -51,12 +66,17 @@ static int dwc_pwm_probe(struct pci_dev *pci, const struct pci_device_id *id) | |||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	/* No need to check for failure, pcim_iomap_regions() does it for us. */ | ||||
| 	dwc->base = pcim_iomap_table(pci)[0]; | ||||
| 	info = (const struct dwc_pwm_info *)id->driver_data; | ||||
| 
 | ||||
| 	ret = devm_pwmchip_add(dev, chip); | ||||
| 	for (i = 0; i < info->nr; i++) { | ||||
| 		/*
 | ||||
| 		 * No need to check for pcim_iomap_table() failure, | ||||
| 		 * pcim_iomap_regions() already does it for us. | ||||
| 		 */ | ||||
| 		ret = dwc_pwm_init_one(dev, pcim_iomap_table(pci)[0], i * info->size); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	pm_runtime_put(dev); | ||||
| 	pm_runtime_allow(dev); | ||||
|  | @ -108,7 +128,7 @@ static int dwc_pwm_resume(struct device *dev) | |||
| static DEFINE_SIMPLE_DEV_PM_OPS(dwc_pwm_pm_ops, dwc_pwm_suspend, dwc_pwm_resume); | ||||
| 
 | ||||
| static const struct pci_device_id dwc_pwm_id_table[] = { | ||||
| 	{ PCI_VDEVICE(INTEL, 0x4bb7) }, /* Elkhart Lake */ | ||||
| 	{ PCI_VDEVICE(INTEL, 0x4bb7), (kernel_ulong_t)&ehl_pwm_info }, | ||||
| 	{  }	/* Terminating Entry */ | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(pci, dwc_pwm_id_table); | ||||
|  |  | |||
|  | @ -33,6 +33,11 @@ MODULE_IMPORT_NS(dwc_pwm); | |||
| #define DWC_TIM_CTRL_INT_MASK	BIT(2) | ||||
| #define DWC_TIM_CTRL_PWM	BIT(3) | ||||
| 
 | ||||
| struct dwc_pwm_info { | ||||
| 	unsigned int nr; | ||||
| 	unsigned int size; | ||||
| }; | ||||
| 
 | ||||
| struct dwc_pwm_ctx { | ||||
| 	u32 cnt; | ||||
| 	u32 cnt2; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Raag Jadav
						Raag Jadav