mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	This adds PWM support for Xilinx LogiCORE IP AXI soft timers commonly found on Xilinx FPGAs. At the moment clock control is very basic: we just enable the clock during probe and pin the frequency. In the future, someone could add support for disabling the clock when not in use. Some common code has been specially demarcated. While currently only used by the PWM driver, it is anticipated that it may be split off in the future to be used by the timer driver as well. This driver was written with reference to Xilinx DS764 for v1.03.a [1]. [1] https://www.xilinx.com/support/documentation/ip_documentation/axi_timer/v1_03_a/axi_timer_ds764.pdf Signed-off-by: Sean Anderson <sean.anderson@seco.com> Acked-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0+ */
 | 
						|
/*
 | 
						|
 * Copyright (C) 2021 Sean Anderson <sean.anderson@seco.com>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef XILINX_TIMER_H
 | 
						|
#define XILINX_TIMER_H
 | 
						|
 | 
						|
#include <linux/compiler.h>
 | 
						|
 | 
						|
#define TCSR0	0x00
 | 
						|
#define TLR0	0x04
 | 
						|
#define TCR0	0x08
 | 
						|
#define TCSR1	0x10
 | 
						|
#define TLR1	0x14
 | 
						|
#define TCR1	0x18
 | 
						|
 | 
						|
#define TCSR_MDT	BIT(0)
 | 
						|
#define TCSR_UDT	BIT(1)
 | 
						|
#define TCSR_GENT	BIT(2)
 | 
						|
#define TCSR_CAPT	BIT(3)
 | 
						|
#define TCSR_ARHT	BIT(4)
 | 
						|
#define TCSR_LOAD	BIT(5)
 | 
						|
#define TCSR_ENIT	BIT(6)
 | 
						|
#define TCSR_ENT	BIT(7)
 | 
						|
#define TCSR_TINT	BIT(8)
 | 
						|
#define TCSR_PWMA	BIT(9)
 | 
						|
#define TCSR_ENALL	BIT(10)
 | 
						|
#define TCSR_CASC	BIT(11)
 | 
						|
 | 
						|
struct clk;
 | 
						|
struct device_node;
 | 
						|
struct regmap;
 | 
						|
 | 
						|
/**
 | 
						|
 * struct xilinx_timer_priv - Private data for Xilinx AXI timer drivers
 | 
						|
 * @map: Regmap of the device, possibly with an offset
 | 
						|
 * @clk: Parent clock
 | 
						|
 * @max: Maximum value of the counters
 | 
						|
 */
 | 
						|
struct xilinx_timer_priv {
 | 
						|
	struct regmap *map;
 | 
						|
	struct clk *clk;
 | 
						|
	u32 max;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * xilinx_timer_tlr_cycles() - Calculate the TLR for a period specified
 | 
						|
 *                             in clock cycles
 | 
						|
 * @priv: The timer's private data
 | 
						|
 * @tcsr: The value of the TCSR register for this counter
 | 
						|
 * @cycles: The number of cycles in this period
 | 
						|
 *
 | 
						|
 * Callers of this function MUST ensure that @cycles is representable as
 | 
						|
 * a TLR.
 | 
						|
 *
 | 
						|
 * Return: The calculated value for TLR
 | 
						|
 */
 | 
						|
u32 xilinx_timer_tlr_cycles(struct xilinx_timer_priv *priv, u32 tcsr,
 | 
						|
			    u64 cycles);
 | 
						|
 | 
						|
/**
 | 
						|
 * xilinx_timer_get_period() - Get the current period of a counter
 | 
						|
 * @priv: The timer's private data
 | 
						|
 * @tlr: The value of TLR for this counter
 | 
						|
 * @tcsr: The value of TCSR for this counter
 | 
						|
 *
 | 
						|
 * Return: The period, in ns
 | 
						|
 */
 | 
						|
unsigned int xilinx_timer_get_period(struct xilinx_timer_priv *priv,
 | 
						|
				     u32 tlr, u32 tcsr);
 | 
						|
 | 
						|
#endif /* XILINX_TIMER_H */
 |