blob: 1f3e5e9303d618304fb05bdceae34a1a05314ad9 [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __AML_GLB_TIMER_H__
#define __AML_GLB_TIMER_H__
#include <linux/types.h>
/* used for mipi0~4 */
#define GLBT_MIPI0_SOF 0
#define GLBT_MIPI0_EOF 1
#define GLBT_MIPI1_SOF 2
#define GLBT_MIPI1_EOF 3
#define GLBT_MIPI2_SOF 4
#define GLBT_MIPI2_EOF 5
#define GLBT_MIPI3_SOF 6
#define GLBT_MIPI3_EOF 7
#define GLBT_MIPI4_SOF 8
#define GLBT_MIPI4_EOF 9
/* used for 32 gpio irq lines and need to set pinmux to rt_gpiox*/
#define GLBT_GPIO0_IRQ 10
#define GLBT_GPIO1_IRQ 11
#define GLBT_GPIO2_IRQ 12
#define GLBT_GPIO3_IRQ 13
#define GLBT_GPIO4_IRQ 14
#define GLBT_GPIO5_IRQ 15
#define GLBT_GPIO6_IRQ 16
#define GLBT_GPIO7_IRQ 17
#define GLBT_GPIO8_IRQ 18
#define GLBT_GPIO9_IRQ 19
#define GLBT_GPIO10_IRQ 20
#define GLBT_GPIO11_IRQ 21
#define GLBT_GPIO12_IRQ 22
#define GLBT_GPIO13_IRQ 23
#define GLBT_GPIO14_IRQ 24
#define GLBT_GPIO15_IRQ 25
#define GLBT_GPIO16_IRQ 26
#define GLBT_GPIO17_IRQ 27
#define GLBT_GPIO18_IRQ 28
#define GLBT_GPIO19_IRQ 29
#define GLBT_GPIO20_IRQ 30
#define GLBT_GPIO21_IRQ 31
#define GLBT_GPIO22_IRQ 32
#define GLBT_GPIO23_IRQ 33
#define GLBT_GPIO24_IRQ 34
#define GLBT_GPIO25_IRQ 35
#define GLBT_GPIO26_IRQ 36
#define GLBT_GPIO27_IRQ 37
#define GLBT_GPIO28_IRQ 38
#define GLBT_GPIO29_IRQ 39
#define GLBT_GPIO30_IRQ 40
#define GLBT_GPIO31_IRQ 41
#define SRC_OFFSET(REG, SRCN) ((REG) + (((SRCN) * 0x08) << 2))
struct meson_glb_timer_output_dev;
struct global_timer_output_gpio {
const char *name;
struct device *owner_dev;
struct meson_glb_timer_output_dev *glb_output_dev;
};
/* TRIG_TYPE_** | TRIG_ONE_SHOT */
enum meson_glb_srcsel_flag {
TRIG_TYPE_SW_SET = 0,
TRIG_TYPE_RISING = 1,
TRIG_TYPE_FALLING = 2,
TRIG_TYPE_BOTH = 3,
TRIG_ONE_SHOT = 4,
};
enum meson_glb_srcsel_reg {
TRIG_SRC0_CTRL0 = 0x00 << 2,
TRIG_SRC0_TS_L = 0x01 << 2,
TRIG_SRC0_TS_H = 0x02 << 2,
};
enum meson_glb_outctl_reg {
OUTPUT_CTRL0 = 0x00 << 2,
OUTPUT_PULSE_WDITH = 0x01 << 2,
OUTPUT_INTERVAL = 0x02 << 2,
OUTPUT_STOP_NUM = 0x03 << 2,
OUTPUT_EXPIRES_TS_L = 0x04 << 2,
OUTPUT_EXPIRES_TS_H = 0x05 << 2,
OUTPUT_ST0 = 0x06 << 2,
OUTPUT_ST1 = 0x07 << 2,
};
#ifdef CONFIG_AMLOGIC_GLOBAL_TIMER
int glb_timer_mipi_config(u8 srcn, unsigned int trig);
unsigned long long glb_timer_get_counter(u8 srcn);
u64 meson_global_timer_global_snapshot(void);
int meson_global_timer_reset(void);
u64 ns_to_global_timer_count(u64 time_in_ns);
u64 global_timer_count_to_ns(u64 time_in_global_timer_ticks);
int meson_global_timer_isp_event_snapshot_configure(u8 isp_event_src,
enum meson_glb_srcsel_flag trigger_type);
u64 meson_global_timer_isp_snapshot(u8 isp_event_src);
u64 meson_global_timer_input_gpio_get_snapshot(int id);
int meson_global_timer_input_gpio_get_source_index(int virq);
int meson_global_timer_input_gpio_configure(u8 id,
enum meson_glb_srcsel_flag trigger_type);
unsigned int gpio_irq_get_channel_idx(int irq);
struct global_timer_output_gpio*
global_timer_output_gpio_get_from_index(struct device *dev, int index);
int global_timer_output_start(struct global_timer_output_gpio *gtod,
u64 expires);
int global_timer_output_gpio_setup(struct global_timer_output_gpio *gtod,
bool oneshot, u64 pulse_width, u64 interval,
u8 init_val);
#else
unsigned int gpio_irq_get_channel_idx(int irq);
int glb_timer_mipi_config(u8 srcn, unsigned int trig)
{
return 0;
}
unsigned long long glb_timer_get_counter(u8 srcn)
{
return 0;
}
u64 meson_global_timer_global_snapshot(void)
{
return 0;
}
int meson_global_timer_reset(void)
{
return 0;
}
u64 ns_to_global_timer_count(u64 time_in_ns)
{
return 0;
}
u64 global_timer_count_to_ns(u64 time_in_global_timer_ticks)
{
return 0;
}
int meson_global_timer_isp_event_snapshot_configure(u8 isp_event_src,
enum meson_glb_srcsel_flag trigger_type)
{
return 0;
}
u64 meson_global_timer_isp_snapshot(u8 isp_event_src)
{
return 0;
}
int meson_global_timer_input_gpio_get_source_index(int virq)
{
return 0;
}
u64 meson_global_timer_input_gpio_get_snapshot(int id)
{
return 0;
}
int meson_global_timer_input_gpio_configure(u8 id,
enum meson_glb_srcsel_flag trigger_type)
{
return 0;
}
struct global_timer_output_gpio*
global_timer_output_gpio_get_from_index(struct device *dev, int index)
{
return NULL;
}
int global_timer_output_start(struct global_timer_output_gpio *gtod,
u64 expires)
{
return 0;
}
int global_timer_output_gpio_setup(struct global_timer_output_gpio *gtod,
bool oneshot, u64 pulse_width, u64 interval,
u8 init_val)
{
return 0;
}
#endif
#endif //__AML_GLB_TIMER_H__