mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 836f1d81b54c84f1f5a95af302fc8662a7502d14 Mon Sep 17 00:00:00 2001
 | |
| From: Maxime Ripard <maxime@cerno.tech>
 | |
| Date: Tue, 20 Sep 2022 13:49:10 +0200
 | |
| Subject: [PATCH] firmware: raspberrypi: Provide a helper to query a clock max
 | |
|  rate
 | |
| 
 | |
| The firmware allows to query for its clocks the operating range of a
 | |
| given clock. We'll need this for some drivers (KMS, in particular) to
 | |
| infer the state of some configuration options, so let's create a
 | |
| function to do so.
 | |
| 
 | |
| Acked-by: Stephen Boyd <sboyd@kernel.org>
 | |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
 | |
| Signed-off-by: Maxime Ripard <maxime@cerno.tech>
 | |
| ---
 | |
|  drivers/firmware/raspberrypi.c             | 20 +++++++++++++++++
 | |
|  include/soc/bcm2835/raspberrypi-firmware.h | 26 ++++++++++++++++++++++
 | |
|  2 files changed, 46 insertions(+)
 | |
| 
 | |
| --- a/drivers/firmware/raspberrypi.c
 | |
| +++ b/drivers/firmware/raspberrypi.c
 | |
| @@ -342,6 +342,26 @@ static void rpi_register_clk_driver(stru
 | |
|  						-1, NULL, 0);
 | |
|  }
 | |
|  
 | |
| +unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw, unsigned int id)
 | |
| +{
 | |
| +	struct rpi_firmware_clk_rate_request msg =
 | |
| +		RPI_FIRMWARE_CLK_RATE_REQUEST(id);
 | |
| +	int ret;
 | |
| +
 | |
| +	ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
 | |
| +				    &msg, sizeof(msg));
 | |
| +	if (ret)
 | |
| +		/*
 | |
| +		 * If our firmware doesn't support that operation, or fails, we
 | |
| +		 * assume the maximum clock rate is absolute maximum we can
 | |
| +		 * store over our type.
 | |
| +		 */
 | |
| +		 return UINT_MAX;
 | |
| +
 | |
| +	return le32_to_cpu(msg.rate);
 | |
| +}
 | |
| +EXPORT_SYMBOL_GPL(rpi_firmware_clk_get_max_rate);
 | |
| +
 | |
|  static void rpi_firmware_delete(struct kref *kref)
 | |
|  {
 | |
|  	struct rpi_firmware *fw = container_of(kref, struct rpi_firmware,
 | |
| --- a/include/soc/bcm2835/raspberrypi-firmware.h
 | |
| +++ b/include/soc/bcm2835/raspberrypi-firmware.h
 | |
| @@ -181,12 +181,32 @@ enum rpi_firmware_clk_id {
 | |
|  
 | |
|  #define GET_DISPLAY_SETTINGS_PAYLOAD_SIZE 64
 | |
|  
 | |
| +/**
 | |
| + * struct rpi_firmware_clk_rate_request - Firmware Request for a rate
 | |
| + * @id:	ID of the clock being queried
 | |
| + * @rate: Rate in Hertz. Set by the firmware.
 | |
| + *
 | |
| + * Used by @RPI_FIRMWARE_GET_CLOCK_RATE, @RPI_FIRMWARE_GET_CLOCK_MEASURED,
 | |
| + * @RPI_FIRMWARE_GET_MAX_CLOCK_RATE and @RPI_FIRMWARE_GET_MIN_CLOCK_RATE.
 | |
| + */
 | |
| +struct rpi_firmware_clk_rate_request {
 | |
| +	__le32 id;
 | |
| +	__le32 rate;
 | |
| +} __packed;
 | |
| +
 | |
| +#define RPI_FIRMWARE_CLK_RATE_REQUEST(_id)	\
 | |
| +	{					\
 | |
| +		.id = _id,			\
 | |
| +	}
 | |
| +
 | |
|  #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
 | |
|  int rpi_firmware_property(struct rpi_firmware *fw,
 | |
|  			  u32 tag, void *data, size_t len);
 | |
|  int rpi_firmware_property_list(struct rpi_firmware *fw,
 | |
|  			       void *data, size_t tag_size);
 | |
|  void rpi_firmware_put(struct rpi_firmware *fw);
 | |
| +unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
 | |
| +					   unsigned int id);
 | |
|  struct device_node *rpi_firmware_find_node(void);
 | |
|  struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
 | |
|  struct rpi_firmware *devm_rpi_firmware_get(struct device *dev,
 | |
| @@ -206,6 +226,12 @@ static inline int rpi_firmware_property_
 | |
|  
 | |
|  static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
 | |
|  
 | |
| +static inline unsigned int rpi_firmware_clk_get_max_rate(struct rpi_firmware *fw,
 | |
| +							 unsigned int id)
 | |
| +{
 | |
| +	return UINT_MAX;
 | |
| +}
 | |
| +
 | |
|  static inline struct device_node *rpi_firmware_find_node(void)
 | |
|  {
 | |
|  	return NULL;
 |