Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * License.  See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2013 by John Crispin <john@phrozen.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/clockchips.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/clocksource.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/reset.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/of.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/of_irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <asm/mach-ralink/ralink_regs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define SYSTICK_FREQ		(50 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define SYSTICK_CONFIG		0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define SYSTICK_COMPARE		0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #define SYSTICK_COUNT		0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) /* route systick irq to mips irq 7 instead of the r4k-timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define CFG_EXT_STK_EN		0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) /* enable the counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define CFG_CNT_EN		0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) struct systick_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	void __iomem *membase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	struct clock_event_device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	int irq_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	int freq_scale;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) static int systick_set_oneshot(struct clock_event_device *evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static int systick_shutdown(struct clock_event_device *evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) static int systick_next_event(unsigned long delta,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 				struct clock_event_device *evt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	struct systick_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	u32 count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	sdev = container_of(evt, struct systick_device, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	count = ioread32(sdev->membase + SYSTICK_COUNT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	count = (count + delta) % SYSTICK_FREQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	iowrite32(count, sdev->membase + SYSTICK_COMPARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) static void systick_event_handler(struct clock_event_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	/* noting to do here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) static irqreturn_t systick_interrupt(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	struct clock_event_device *dev = (struct clock_event_device *) dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	dev->event_handler(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) static struct systick_device systick = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	.dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		 * cevt-r4k uses 300, make sure systick
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		 * gets used if available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		.rating			= 310,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		.features		= CLOCK_EVT_FEAT_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		.set_next_event		= systick_next_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		.set_state_shutdown	= systick_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		.set_state_oneshot	= systick_set_oneshot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		.event_handler		= systick_event_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) static int systick_shutdown(struct clock_event_device *evt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	struct systick_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	sdev = container_of(evt, struct systick_device, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	if (sdev->irq_requested)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		free_irq(systick.dev.irq, &systick.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	sdev->irq_requested = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	iowrite32(0, systick.membase + SYSTICK_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) static int systick_set_oneshot(struct clock_event_device *evt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	const char *name = systick.dev.name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	struct systick_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	int irq = systick.dev.irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	sdev = container_of(evt, struct systick_device, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	if (!sdev->irq_requested) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		if (request_irq(irq, systick_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 				IRQF_PERCPU | IRQF_TIMER, name, &systick.dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			pr_err("Failed to request irq %d (%s)\n", irq, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	sdev->irq_requested = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	iowrite32(CFG_EXT_STK_EN | CFG_CNT_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		  systick.membase + SYSTICK_CONFIG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int __init ralink_systick_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	systick.membase = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	if (!systick.membase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	systick.dev.name = np->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	clockevents_calc_mult_shift(&systick.dev, SYSTICK_FREQ, 60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	systick.dev.max_delta_ns = clockevent_delta2ns(0x7fff, &systick.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	systick.dev.max_delta_ticks = 0x7fff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	systick.dev.min_delta_ns = clockevent_delta2ns(0x3, &systick.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	systick.dev.min_delta_ticks = 0x3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	systick.dev.irq = irq_of_parse_and_map(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	if (!systick.dev.irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		pr_err("%pOFn: request_irq failed", np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	ret = clocksource_mmio_init(systick.membase + SYSTICK_COUNT, np->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 				    SYSTICK_FREQ, 301, 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 				    clocksource_mmio_readl_up);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	clockevents_register_device(&systick.dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	pr_info("%pOFn: running - mult: %d, shift: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 			np, systick.dev.mult, systick.dev.shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) TIMER_OF_DECLARE(systick, "ralink,cevt-systick", ralink_systick_init);