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) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *  linux/arch/m68k/sun3x/time.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *  Sun3x-specific time handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/kd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/kernel_stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/rtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/bcd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <asm/machdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <asm/traps.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <asm/sun3x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <asm/sun3ints.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include "time.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #define M_CONTROL 0xf8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #define M_SEC     0xf9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define M_MIN     0xfa
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define M_HOUR    0xfb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define M_DAY     0xfc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #define M_DATE    0xfd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) #define M_MONTH   0xfe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) #define M_YEAR    0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define C_WRITE   0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define C_READ    0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define C_SIGN    0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define C_CALIB   0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) int sun3x_hwclk(int set, struct rtc_time *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	volatile struct mostek_dt *h =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 		(struct mostek_dt *)(SUN3X_EEPROM+M_CONTROL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	if(set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		h->csr |= C_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		h->sec = bin2bcd(t->tm_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		h->min = bin2bcd(t->tm_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		h->hour = bin2bcd(t->tm_hour);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		h->wday = bin2bcd(t->tm_wday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		h->mday = bin2bcd(t->tm_mday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		h->month = bin2bcd(t->tm_mon + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 		h->year = bin2bcd(t->tm_year % 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 		h->csr &= ~C_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		h->csr |= C_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		t->tm_sec = bcd2bin(h->sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		t->tm_min = bcd2bin(h->min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		t->tm_hour = bcd2bin(h->hour);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		t->tm_wday = bcd2bin(h->wday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		t->tm_mday = bcd2bin(h->mday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 		t->tm_mon = bcd2bin(h->month) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		t->tm_year = bcd2bin(h->year);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 		h->csr &= ~C_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		if (t->tm_year < 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			t->tm_year += 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) static irqreturn_t sun3x_timer_tick(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	irq_handler_t timer_routine = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	/* Clear the pending interrupt - pulse the enable line low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	disable_irq(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	enable_irq(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	timer_routine(0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) void __init sun3x_sched_init(irq_handler_t vector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	sun3_disable_interrupts();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)     /* Pulse enable low to get the clock started */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	sun3_disable_irq(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	sun3_enable_irq(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	sun3_enable_interrupts();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }