Pārlūkot izejas kodu

qcacmn: Add new QDF API's to handle gpio requirements

Add new QDF APIs to handle gpio, irqf and timer related
handling in TSF feature.

Change-Id: Iff6f85c6debe351c5533906559400b4a51333d4d
CRs-Fixed: 3469020
Roopavathi Lingampalli 2 gadi atpakaļ
vecāks
revīzija
36d5ce6684

+ 114 - 1
qal/inc/qal_vbus_dev.h

@@ -60,6 +60,82 @@ qal_vbus_get_iorsc(int devnum, uint32_t flag, char *devname);
 QDF_STATUS
 qal_vbus_release_iorsc(int devnum);
 
+/**
+ * qal_vbus_allocate_iorsc() - allocate io resource
+ * @pinnum: pin Number
+ * @label: pin name string
+ *
+ * This function will allocate the io resource for a device
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS
+qal_vbus_allocate_iorsc(unsigned int pinnum, const char *label);
+
+/**
+ * qal_vbus_iorsc_dir_output() - set pin dirction to output
+ * @pin: pin Number
+ * @val: value
+ *
+ * This function set the gpio pin direction to output
+ *
+ * Return: 0 on success, error no on failure
+ */
+QDF_STATUS
+qal_vbus_iorsc_dir_output(unsigned int pin, int val);
+
+/**
+ * qal_vbus_iorsc_set_value() - set pin direction
+ * @pin: pin Number
+ * @val: value
+ *
+ * This function set the gpio pin direction based on value
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS
+qal_vbus_iorsc_set_value(unsigned int pin, int val);
+
+/**
+ * qal_vbus_iorsc_toirq() - set irq number to gpio
+ * @pin: pin Number
+ *
+ * This function set the irq number to gpio pin
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS
+qal_vbus_iorsc_toirq(unsigned int pin);
+
+/**
+ * qal_vbus_request_irq() - set interrupt handler
+ * @irqnum: irq Number
+ * @handler: function handler to be called
+ * @flags: irq flags
+ * @dev_name: device name
+ * @ctx: pointer to device context
+ * This function set up the handling of the interrupt
+ *
+ * Return: QDF_STATUS_SUCCESS on success, Error code on failure
+ */
+QDF_STATUS
+qal_vbus_request_irq(unsigned int irqnum,
+		     irqreturn_t (*handler)(int irq, void *arg),
+		     unsigned long flags, const char *dev_name,
+		     void *ctx);
+
+/**
+ * __qal_vbus_free_irq() - free irq
+ * @irqnum: irq Number
+ * @ctx: pointer to device context
+ *
+ * This function free the irq number set to gpio pin
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+static inline QDF_STATUS
+__qal_vbus_free_irq(unsigned int irqnum, void *ctx);
+
 /**
  * qal_vbus_enable_devclk() - enable device clock
  * @clk: Device clock
@@ -220,12 +296,50 @@ qal_vbus_get_iorsc(int devnum, uint32_t flag, char *devname)
 	return __qal_vbus_get_iorsc(devnum, flag, devname);
 }
 
+static inline QDF_STATUS
+qal_vbus_allocate_iorsc(unsigned int pinnum, const char *label)
+{
+	return __qal_vbus_allocate_iorsc(pinnum, label);
+}
+
+static inline QDF_STATUS
+qal_vbus_iorsc_dir_output(unsigned int pin, int val)
+{
+	return __qal_vbus_iorsc_dir_output(pin, val);
+}
+
+static inline QDF_STATUS
+qal_vbus_iorsc_set_value(unsigned int pin, int val)
+{
+	return __qal_vbus_iorsc_set_value(pin, val);
+}
+
 static inline QDF_STATUS
 qal_vbus_release_iorsc(int devnum)
 {
 	return __qal_vbus_release_iorsc(devnum);
 }
 
+static inline QDF_STATUS
+qal_vbus_iorsc_toirq(unsigned int pin)
+{
+	return __qal_vbus_iorsc_toirq(pin);
+}
+
+static inline QDF_STATUS
+qal_vbus_request_irq(unsigned int irqnum,
+		     irqreturn_t (*handler)(int irq, void *arg),
+		     unsigned long flags, const char *dev_name, void *ctx)
+{
+	return __qal_vbus_request_irq(irqnum, handler, flags, dev_name, ctx);
+}
+
+static inline QDF_STATUS
+qal_vbus_free_irq(unsigned int irqnum, void *ctx)
+{
+	return __qal_vbus_free_irq(irqnum, ctx);
+}
+
 static inline QDF_STATUS
 qal_vbus_enable_devclk(struct qdf_dev_clk *clk)
 {
@@ -310,5 +424,4 @@ qal_vbus_rcu_read_unlock(void)
 	return __qal_vbus_rcu_read_unlock();
 }
 #endif
-
 #endif  /* __QAL_VBUS_DEV_H */

+ 112 - 0
qal/linux/src/i_qal_vbus_dev.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -76,6 +77,117 @@ __qal_vbus_release_iorsc(int devnum)
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * __qal_vbus_allocate_iorsc() - allocate io resource
+ * @pinnum: pin Number
+ * @label: name of pin
+ *
+ * This function will allocate io resource
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+static inline QDF_STATUS
+__qal_vbus_allocate_iorsc(unsigned int pinnum, const char *label)
+{
+	int ret;
+
+	ret = gpio_request(pinnum, label);
+
+	return qdf_status_from_os_return(ret);
+}
+
+/**
+ * __qal_vbus_iorsc_dir_output() - set pin dirction to output
+ * @pin: pin Number
+ * @val: value
+ *
+ * This function set the gpio pin direction to output
+ *
+ * Return: 0 on success, error no on failure
+ */
+static inline QDF_STATUS
+__qal_vbus_iorsc_dir_output(unsigned int pin, int val)
+{
+	int ret;
+
+	ret = gpio_direction_output(pin, val);
+
+	return qdf_status_from_os_return(ret);
+}
+
+/**
+ * __qal_vbus_iorsc_set_value() - set pin direction
+ * @pin: pin Number
+ * @val: value
+ *
+ * This function set the gpio pin direction based on value
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+static inline QDF_STATUS
+__qal_vbus_iorsc_set_value(unsigned int pin, int val)
+{
+	gpio_set_value(pin, val);
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * __qal_vbus_iorsc_toirq() - set irq number to gpio
+ * @pin: pin Number
+ *
+ * This function set the irq number to gpio pin
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+static inline QDF_STATUS
+__qal_vbus_iorsc_toirq(unsigned int pin)
+{
+	int ret;
+
+	ret = gpio_to_irq(pin);
+
+	return qdf_status_from_os_return(ret);
+}
+
+/**
+ * __qal_vbus_request_irq() - set interrupt handler
+ * @irqnum: irq Number
+ * @handler: function handler to be called
+ * @flags: irq flags
+ * @dev_name: device name
+ * @ctx: pointer to device context
+ *
+ * This function set up the handling of the interrupt
+ *
+ * Return: QDF_STATUS_SUCCESS on success, Error code on failure
+ */
+static inline QDF_STATUS
+__qal_vbus_request_irq(unsigned int irqnum,
+		       irqreturn_t (*handler)(int irq, void *arg),
+		       unsigned long flags, const char *dev_name, void *ctx)
+{
+	int ret;
+
+	ret = request_irq(irqnum, handler, flags, dev_name, ctx);
+	return qdf_status_from_os_return(ret);
+}
+
+/**
+ * __qal_vbus_free_irq() - free irq
+ * @irqnum: irq Number
+ * @ctx: pointer to device context
+ *
+ * This function free the irq number set to gpio pin
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+static inline QDF_STATUS
+__qal_vbus_free_irq(unsigned int irqnum, void *ctx)
+{
+	free_irq(irqnum, ctx);
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * __qal_vbus_enable_devclk() - enable device clock
  * @clk: Device clock

+ 6 - 0
qdf/inc/qdf_irq.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -49,4 +50,9 @@
 #define QDF_IRQ_IS_POLLED		__QDF_IRQ_IS_POLLED
 #define QDF_IRQ_DISABLE_UNLAZY		__QDF_IRQ_DISABLE_UNLAZY
 
+#define QDF_IRQF_SHARED			__QDF_IRQF_SHARED
+#define QDF_IRQF_TRIGGER_RISING		__QDF_IRQF_TRIGGER_RISING
+#define QDF_IRQ_NONE			__QDF_IRQ_NONE
+#define QDF_IRQ_HANDLED			__QDF_IRQ_HANDLED
+
 #endif /* __QDF_IRQ_H */

+ 67 - 11
qdf/inc/qdf_time.h

@@ -102,7 +102,31 @@ int64_t qdf_ktime_to_us(qdf_ktime_t ktime);
 int64_t qdf_ktime_to_ns(qdf_ktime_t ktime);
 
 /**
- * qdf_system_ticks() - Count the number of ticks elapsed from the time when
+ * qdf_time_ktime_set() - Set a ktime_t variable from a seconds/nanoseconds
+ * value
+ * @secs: seconds to set
+ * @nsecs: nanoseconds to set
+ *
+ * Return: The qdf_ktime_t representation of the value.
+ */
+qdf_ktime_t qdf_time_ktime_set(const s64 secs, const unsigned long nsecs);
+
+/**
+ * qdf_ktime_get_real_ns() - Gets the current time in ns using UTC
+ *
+ * Return: qdf_ktime_t in nano sec
+ */
+qdf_ktime_t qdf_ktime_get_real_ns(void);
+
+/**
+ * qdf_ktime_get_ns() - Gets the current time nano seconds
+ *
+ * Return: qdf_ktime_t in nano sec
+ */
+qdf_ktime_t qdf_ktime_get_ns(void);
+
+/**
+ * qdf_system_ticks - Count the number of ticks elapsed from the time when
  * the system booted
  *
  * Return: ticks
@@ -283,50 +307,80 @@ void qdf_time_ktime_get_real_time(qdf_timespec_t *ts);
  * Return: current time in nanosec units.
  */
 unsigned long long qdf_time_sched_clock(void);
-#else
 
+/**
+ * qdf_usleep_range - introduce sleep with min and max time
+ * @min: Minimum time in usecs to sleep
+ * @max: Maximum time in usecs to sleep
+ *
+ * Return: none
+ */
+void qdf_usleep_range(unsigned long min, unsigned long max);
+
+/**
+ *  qdf_ktime_compare - compare two qdf_ktime_t objects
+ *  @ktime1: time as qdf_ktime_t object
+ *  @ktime2: time as qdf_ktime_t object
+ *
+ *  Return:
+ * * ktime1  < ktime2 - return <0
+ * * ktime1 == ktime2 - return 0
+ * * ktime1  > ktime2 - return >0
+ */
+int qdf_ktime_compare(qdf_ktime_t ktime1, qdf_ktime_t ktime2);
+
+#else
 static inline qdf_ktime_t qdf_ns_to_ktime(uint64_t ns)
 {
 	return __qdf_ns_to_ktime(ns);
 }
 
-
 static inline qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
 {
 	return __qdf_ktime_add(ktime1, ktime2);
 }
 
-
 static inline qdf_ktime_t qdf_ktime_get(void)
 {
 	return __qdf_ktime_get();
 }
 
-
 static inline qdf_ktime_t qdf_ktime_real_get(void)
 {
 	return __qdf_ktime_real_get();
 }
 
+static inline qdf_ktime_t qdf_ktime_get_real_ns(void)
+{
+	return __qdf_ktime_get_real_ns();
+}
+
+static inline uint64_t qdf_ktime_get_ns(void)
+{
+	return __qdf_ktime_get_ns();
+}
+
+static inline qdf_ktime_t qdf_ktime_compare(qdf_ktime_t ktime1,
+					    qdf_ktime_t ktime2)
+{
+	return __qdf_ktime_compare(ktime1, ktime2);
+}
 
 static inline qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns)
 {
 	return __qdf_ktime_add_ns(ktime, ns);
 }
 
-
 static inline int64_t qdf_ktime_to_ms(qdf_ktime_t ktime)
 {
 	return __qdf_ktime_to_ms(ktime);
 }
 
-
 static inline int64_t qdf_ktime_to_us(qdf_ktime_t ktime)
 {
 	return __qdf_time_ktime_to_us(ktime);
 }
 
-
 static inline int64_t qdf_ktime_to_ns(qdf_ktime_t ktime)
 {
 	return __qdf_ktime_to_ns(ktime);
@@ -338,7 +392,6 @@ static inline qdf_time_t qdf_system_ticks(void)
 }
 
 #define qdf_system_ticks_per_sec __qdf_system_ticks_per_sec
-
 static inline uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks)
 {
 	return __qdf_system_ticks_to_msecs(clock_ticks);
@@ -354,7 +407,6 @@ static inline qdf_time_t qdf_get_system_uptime(void)
 	return __qdf_get_system_uptime();
 }
 
-
 static inline uint64_t qdf_get_bootbased_boottime_ns(void)
 {
 	return __qdf_get_bootbased_boottime_ns();
@@ -510,6 +562,10 @@ static inline unsigned long long qdf_time_sched_clock(void)
 {
 	return __qdf_time_sched_clock();
 }
-#endif
 
+static inline void qdf_usleep_range(unsigned long min, unsigned long max)
+{
+	__qdf_usleep_range(min, max);
+}
+#endif
 #endif

+ 3 - 0
qdf/inc/qdf_types.h

@@ -57,6 +57,9 @@ typedef struct qdf_sglist {
 
 #define QDF_MAX_SCATTER __QDF_MAX_SCATTER
 #define QDF_NSEC_PER_MSEC __QDF_NSEC_PER_MSEC
+#define QDF_NSEC_PER_USEC __QDF_NSEC_PER_USEC
+#define QDF_USEC_PER_MSEC __QDF_USEC_PER_MSEC
+#define QDF_NSEC_PER_SEC __QDF_NSEC_PER_SEC
 
 /**
  * QDF_SWAP_U16 - swap input u16 value

+ 6 - 0
qdf/linux/src/i_qdf_irq.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -25,6 +26,7 @@
 #define _I_QDF_IRQ_H
 
 #include <linux/irq.h>
+#include <linux/irqreturn.h>
 
 #define __QDF_IRQ_TYPE_NONE		IRQ_TYPE_NONE
 #define __QDF_IRQ_TYPE_EDGE_RISING	IRQ_TYPE_EDGE_RISING
@@ -48,5 +50,9 @@
 #define __QDF_IRQ_PER_CPU_DEVID		IRQ_PER_CPU_DEVID
 #define __QDF_IRQ_IS_POLLED		IRQ_IS_POLLED
 #define __QDF_IRQ_DISABLE_UNLAZY	IRQ_DISABLE_UNLAZY
+#define __QDF_IRQF_SHARED		IRQF_SHARED
+#define __QDF_IRQF_TRIGGER_RISING	IRQF_TRIGGER_RISING
+#define __QDF_IRQ_NONE			IRQ_NONE
+#define __QDF_IRQ_HANDLED		IRQ_HANDLED
 
 #endif /* _I_QDF_IRQ_H */

+ 39 - 3
qdf/linux/src/i_qdf_time.h

@@ -103,6 +103,41 @@ static inline ktime_t __qdf_ktime_real_get(void)
 	return ktime_get_real();
 }
 
+/**
+ * __qdf_ktime_get_ns() - Gets the current time nano seconds
+ *
+ * Return: ktime in nano sec
+ */
+static inline ktime_t __qdf_ktime_get_ns(void)
+{
+	return ktime_get_ns();
+}
+
+/**
+ * __qdf_ktime_get_real_ns() - Gets the current time in ns using UTC
+ *
+ * Return: ktime in nano sec
+ */
+static inline ktime_t __qdf_ktime_get_real_ns(void)
+{
+	return ktime_get_real_ns();
+}
+
+/**
+ * __qdf_ktime_compare - compare two qdf_ktime_t objects
+ * @ktime1: time as qdf_ktime_t object
+ * @ktime2: time as qdf_ktime_t object
+ *
+ * Return:
+ * * ktime1  < ktime2 - return <0
+ * * ktime1 == ktime2 - return 0
+ * * ktime1  > ktime2 - return >0
+ */
+static inline int __qdf_ktime_compare(ktime_t ktime1, ktime_t ktime2)
+{
+	return ktime_compare(ktime1, ktime2);
+}
+
 /**
  * __qdf_ktime_add_ns() - Adds ktime object and nanoseconds value and
  *                        returns the ktime object
@@ -138,7 +173,6 @@ static inline int64_t __qdf_ktime_to_ms(ktime_t ktime)
 	return ktime_to_ms(ktime);
 }
 
-
 /**
  * __qdf_system_ticks() - get system ticks
  *
@@ -150,7 +184,6 @@ static inline __qdf_time_t __qdf_system_ticks(void)
 }
 
 #define __qdf_system_ticks_per_sec HZ
-
 /**
  * __qdf_system_ticks_to_msecs() - convert system ticks into milli seconds
  * @ticks: System ticks
@@ -304,7 +337,6 @@ static inline uint64_t __qdf_get_monotonic_boottime(void)
 }
 
 #if defined (MSM_PLATFORM)
-
 /**
  * __qdf_get_log_timestamp() - get msm timer ticks
  *
@@ -474,4 +506,8 @@ static inline void __qdf_time_ktime_get_real_time(__qdf_timespec_t *ts)
 }
 #endif
 
+static inline void __qdf_usleep_range(unsigned long min, unsigned long max)
+{
+	usleep_range(min, max);
+}
 #endif

+ 3 - 0
qdf/linux/src/i_qdf_types.h

@@ -142,6 +142,9 @@ typedef unsigned long __sgtable_t;
  */
 #define __QDF_MAX_SCATTER        1
 #define __QDF_NSEC_PER_MSEC NSEC_PER_MSEC
+#define __QDF_NSEC_PER_USEC NSEC_PER_USEC
+#define __QDF_USEC_PER_MSEC USEC_PER_MSEC
+#define __QDF_NSEC_PER_SEC NSEC_PER_SEC
 
 #if defined(__LITTLE_ENDIAN_BITFIELD)
 #define QDF_LITTLE_ENDIAN_MACHINE

+ 35 - 0
qdf/linux/src/qdf_time.c

@@ -82,6 +82,13 @@ int64_t qdf_ktime_to_ns(qdf_ktime_t ktime)
 
 qdf_export_symbol(qdf_ktime_to_ns);
 
+qdf_ktime_t qdf_time_ktime_set(const s64 secs, const unsigned long nsecs)
+{
+	return __qdf_time_ktime_set(secs, nsecs);
+}
+
+qdf_export_symbol(qdf_time_ktime_set);
+
 qdf_time_t qdf_system_ticks(void)
 {
 	return __qdf_system_ticks();
@@ -249,3 +256,31 @@ unsigned long long qdf_time_sched_clock(void)
 }
 
 qdf_export_symbol(qdf_time_sched_clock);
+
+void qdf_usleep_range(unsigned long min, unsigned long max)
+{
+	__qdf_usleep_range(min, max);
+}
+
+qdf_export_symbol(qdf_usleep_range);
+
+qdf_ktime_t qdf_ktime_get_ns(void)
+{
+	return __qdf_ktime_get_ns();
+}
+
+qdf_export_symbol(qdf_ktime_get_ns);
+
+qdf_ktime_t qdf_ktime_get_real_ns(void)
+{
+	return __qdf_ktime_get_real_ns();
+}
+
+qdf_export_symbol(qdf_ktime_get_real_ns);
+
+int qdf_ktime_compare(qdf_ktime_t ktime1, qdf_ktime_t ktime2)
+{
+	return __qdf_ktime_compare(ktime1, ktime2);
+}
+
+qdf_export_symbol(qdf_ktime_compare);