mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	rockchip: adc: rockchip-saradc: factor out channel_data callback
SARADC v1 and v2 have a different way of reading data, therefore let's abstract this function so that it can be provided from the udevice.data pointer. Cc: Quentin Schulz <foss+uboot@0leil.net> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
This commit is contained in:
		
				
					committed by
					
						 Kever Yang
						Kever Yang
					
				
			
			
				
	
			
			
			
						parent
						
							0707bfdf23
						
					
				
				
					commit
					7da3065afd
				
			| @@ -37,6 +37,7 @@ struct rockchip_saradc_data { | ||||
| 	int				num_bits; | ||||
| 	int				num_channels; | ||||
| 	unsigned long			clk_rate; | ||||
| 	int (*channel_data)(struct udevice *dev, int channel, unsigned int *data); | ||||
| }; | ||||
|  | ||||
| struct rockchip_saradc_priv { | ||||
| @@ -45,16 +46,10 @@ struct rockchip_saradc_priv { | ||||
| 	const struct rockchip_saradc_data	*data; | ||||
| }; | ||||
|  | ||||
| int rockchip_saradc_channel_data(struct udevice *dev, int channel, | ||||
| 				 unsigned int *data) | ||||
| int rockchip_saradc_channel_data_v1(struct udevice *dev, int channel, | ||||
| 				    unsigned int *data) | ||||
| { | ||||
| 	struct rockchip_saradc_priv *priv = dev_get_priv(dev); | ||||
| 	struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev); | ||||
|  | ||||
| 	if (channel != priv->active_channel) { | ||||
| 		pr_err("Requested channel is not active!"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
| 	if ((readl(&priv->regs.v1->ctrl) & SARADC_CTRL_IRQ_STATUS) != | ||||
| 	    SARADC_CTRL_IRQ_STATUS) | ||||
| @@ -62,7 +57,6 @@ int rockchip_saradc_channel_data(struct udevice *dev, int channel, | ||||
|  | ||||
| 	/* Read value */ | ||||
| 	*data = readl(&priv->regs.v1->data); | ||||
| 	*data &= uc_pdata->data_mask; | ||||
|  | ||||
| 	/* Power down adc */ | ||||
| 	writel(0, &priv->regs.v1->ctrl); | ||||
| @@ -70,6 +64,30 @@ int rockchip_saradc_channel_data(struct udevice *dev, int channel, | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int rockchip_saradc_channel_data(struct udevice *dev, int channel, | ||||
| 				 unsigned int *data) | ||||
| { | ||||
| 	struct rockchip_saradc_priv *priv = dev_get_priv(dev); | ||||
| 	struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev); | ||||
| 	int ret; | ||||
|  | ||||
| 	if (channel != priv->active_channel) { | ||||
| 		pr_err("Requested channel is not active!"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
| 	ret = priv->data->channel_data(dev, channel, data); | ||||
| 	if (ret) { | ||||
| 		if (ret != -EBUSY) | ||||
| 			pr_err("Error reading channel data, %d!", ret); | ||||
| 		return ret; | ||||
| 	} | ||||
|  | ||||
| 	*data &= uc_pdata->data_mask; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int rockchip_saradc_start_channel(struct udevice *dev, int channel) | ||||
| { | ||||
| 	struct rockchip_saradc_priv *priv = dev_get_priv(dev); | ||||
| @@ -174,18 +192,21 @@ static const struct rockchip_saradc_data saradc_data = { | ||||
| 	.num_bits = 10, | ||||
| 	.num_channels = 3, | ||||
| 	.clk_rate = 1000000, | ||||
| 	.channel_data = rockchip_saradc_channel_data_v1, | ||||
| }; | ||||
|  | ||||
| static const struct rockchip_saradc_data rk3066_tsadc_data = { | ||||
| 	.num_bits = 12, | ||||
| 	.num_channels = 2, | ||||
| 	.clk_rate = 50000, | ||||
| 	.channel_data = rockchip_saradc_channel_data_v1, | ||||
| }; | ||||
|  | ||||
| static const struct rockchip_saradc_data rk3399_saradc_data = { | ||||
| 	.num_bits = 10, | ||||
| 	.num_channels = 6, | ||||
| 	.clk_rate = 1000000, | ||||
| 	.channel_data = rockchip_saradc_channel_data_v1, | ||||
| }; | ||||
|  | ||||
| static const struct udevice_id rockchip_saradc_ids[] = { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user