diff options
| author | Joshua Kinard <kumba@gentoo.org> | 2015-02-16 19:00:26 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-16 20:56:05 -0500 |
| commit | aaaf5fbf56f16c81a653713cc333b18ad6e25ea9 (patch) | |
| tree | 5416188285df8877c1e069f3db9a24541c2b057f /include/linux/rtc | |
| parent | befeb596a7224119b60499eb20c7545f7a73f104 (diff) | |
rtc: add driver for DS1685 family of real time clocks
This adds a driver for the Dallas/Maxim DS1685-family of RTC chips. It
supports the DS1685/DS1687, DS1688/DS1691, DS1689/DS1693, DS17285/DS17287,
DS17485/DS17487, and DS17885/DS17887 RTC chips. These chips are commonly
found in SGI O2 and SGI Octane systems. It was originally derived from a
driver patch submitted by Matthias Fuchs many years ago for use in
EPPC-405-UC modules, which also used these RTCs. In addition to the
time-keeping functions, this RTC also handles the shutdown mechanism of
the O2 and Octane and acts as a partial NVRAM for the boot PROMS in these
systems.
Verified on both an SGI O2 and an SGI Octane.
Signed-off-by: Joshua Kinard <kumba@gentoo.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/rtc')
| -rw-r--r-- | include/linux/rtc/ds1685.h | 375 |
1 files changed, 375 insertions, 0 deletions
diff --git a/include/linux/rtc/ds1685.h b/include/linux/rtc/ds1685.h new file mode 100644 index 000000000000..e6337a56d741 --- /dev/null +++ b/include/linux/rtc/ds1685.h | |||
| @@ -0,0 +1,375 @@ | |||
| 1 | /* | ||
| 2 | * Definitions for the registers, addresses, and platform data of the | ||
| 3 | * DS1685/DS1687-series RTC chips. | ||
| 4 | * | ||
| 5 | * This Driver also works for the DS17X85/DS17X87 RTC chips. Functionally | ||
| 6 | * similar to the DS1685/DS1687, they support a few extra features which | ||
| 7 | * include larger, battery-backed NV-SRAM, burst-mode access, and an RTC | ||
| 8 | * write counter. | ||
| 9 | * | ||
| 10 | * Copyright (C) 2011-2014 Joshua Kinard <kumba@gentoo.org>. | ||
| 11 | * Copyright (C) 2009 Matthias Fuchs <matthias.fuchs@esd-electronics.com>. | ||
| 12 | * | ||
| 13 | * References: | ||
| 14 | * DS1685/DS1687 3V/5V Real-Time Clocks, 19-5215, Rev 4/10. | ||
| 15 | * DS17x85/DS17x87 3V/5V Real-Time Clocks, 19-5222, Rev 4/10. | ||
| 16 | * DS1689/DS1693 3V/5V Serialized Real-Time Clocks, Rev 112105. | ||
| 17 | * Application Note 90, Using the Multiplex Bus RTC Extended Features. | ||
| 18 | * | ||
| 19 | * This program is free software; you can redistribute it and/or modify | ||
| 20 | * it under the terms of the GNU General Public License version 2 as | ||
| 21 | * published by the Free Software Foundation. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef _LINUX_RTC_DS1685_H_ | ||
| 25 | #define _LINUX_RTC_DS1685_H_ | ||
| 26 | |||
| 27 | #include <linux/rtc.h> | ||
| 28 | #include <linux/platform_device.h> | ||
| 29 | #include <linux/workqueue.h> | ||
| 30 | |||
| 31 | /** | ||
| 32 | * struct ds1685_priv - DS1685 private data structure. | ||
| 33 | * @dev: pointer to the rtc_device structure. | ||
| 34 | * @regs: iomapped base address pointer of the RTC registers. | ||
| 35 | * @regstep: padding/step size between registers (optional). | ||
| 36 | * @baseaddr: base address of the RTC device. | ||
| 37 | * @size: resource size. | ||
| 38 | * @lock: private lock variable for spin locking/unlocking. | ||
| 39 | * @work: private workqueue. | ||
| 40 | * @irq: IRQ number assigned to the RTC device. | ||
| 41 | * @prepare_poweroff: pointer to platform pre-poweroff function. | ||
| 42 | * @wake_alarm: pointer to platform wake alarm function. | ||
| 43 | * @post_ram_clear: pointer to platform post ram-clear function. | ||
| 44 | */ | ||
| 45 | struct ds1685_priv { | ||
| 46 | struct rtc_device *dev; | ||
| 47 | void __iomem *regs; | ||
| 48 | u32 regstep; | ||
| 49 | resource_size_t baseaddr; | ||
| 50 | size_t size; | ||
| 51 | spinlock_t lock; | ||
| 52 | struct work_struct work; | ||
| 53 | int irq_num; | ||
| 54 | bool bcd_mode; | ||
| 55 | bool no_irq; | ||
| 56 | bool uie_unsupported; | ||
| 57 | bool alloc_io_resources; | ||
| 58 | u8 (*read)(struct ds1685_priv *, int); | ||
| 59 | void (*write)(struct ds1685_priv *, int, u8); | ||
| 60 | void (*prepare_poweroff)(void); | ||
| 61 | void (*wake_alarm)(void); | ||
| 62 | void (*post_ram_clear)(void); | ||
| 63 | }; | ||
| 64 | |||
| 65 | |||
| 66 | /** | ||
| 67 | * struct ds1685_rtc_platform_data - platform data structure. | ||
| 68 | * @plat_prepare_poweroff: platform-specific pre-poweroff function. | ||
| 69 | * @plat_wake_alarm: platform-specific wake alarm function. | ||
| 70 | * @plat_post_ram_clear: platform-specific post ram-clear function. | ||
| 71 | * | ||
| 72 | * If your platform needs to use a custom padding/step size between | ||
| 73 | * registers, or uses one or more of the extended interrupts and needs special | ||
| 74 | * handling, then include this header file in your platform definition and | ||
| 75 | * set regstep and the plat_* pointers as appropriate. | ||
| 76 | */ | ||
| 77 | struct ds1685_rtc_platform_data { | ||
| 78 | const u32 regstep; | ||
| 79 | const bool bcd_mode; | ||
| 80 | const bool no_irq; | ||
| 81 | const bool uie_unsupported; | ||
| 82 | const bool alloc_io_resources; | ||
| 83 | u8 (*plat_read)(struct ds1685_priv *, int); | ||
| 84 | void (*plat_write)(struct ds1685_priv *, int, u8); | ||
| 85 | void (*plat_prepare_poweroff)(void); | ||
| 86 | void (*plat_wake_alarm)(void); | ||
| 87 | void (*plat_post_ram_clear)(void); | ||
| 88 | }; | ||
| 89 | |||
| 90 | |||
| 91 | /* | ||
| 92 | * Time Registers. | ||
| 93 | */ | ||
| 94 | #define RTC_SECS 0x00 /* Seconds 00-59 */ | ||
| 95 | #define RTC_SECS_ALARM 0x01 /* Alarm Seconds 00-59 */ | ||
| 96 | #define RTC_MINS 0x02 /* Minutes 00-59 */ | ||
| 97 | #define RTC_MINS_ALARM 0x03 /* Alarm Minutes 00-59 */ | ||
| 98 | #define RTC_HRS 0x04 /* Hours 01-12 AM/PM || 00-23 */ | ||
| 99 | #define RTC_HRS_ALARM 0x05 /* Alarm Hours 01-12 AM/PM || 00-23 */ | ||
| 100 | #define RTC_WDAY 0x06 /* Day of Week 01-07 */ | ||
| 101 | #define RTC_MDAY 0x07 /* Day of Month 01-31 */ | ||
| 102 | #define RTC_MONTH 0x08 /* Month 01-12 */ | ||
| 103 | #define RTC_YEAR 0x09 /* Year 00-99 */ | ||
| 104 | #define RTC_CENTURY 0x48 /* Century 00-99 */ | ||
| 105 | #define RTC_MDAY_ALARM 0x49 /* Alarm Day of Month 01-31 */ | ||
| 106 | |||
| 107 | |||
| 108 | /* | ||
| 109 | * Bit masks for the Time registers in BCD Mode (DM = 0). | ||
| 110 | */ | ||
| 111 | #define RTC_SECS_BCD_MASK 0x7f /* - x x x x x x x */ | ||
| 112 | #define RTC_MINS_BCD_MASK 0x7f /* - x x x x x x x */ | ||
| 113 | #define RTC_HRS_12_BCD_MASK 0x1f /* - - - x x x x x */ | ||
| 114 | #define RTC_HRS_24_BCD_MASK 0x3f /* - - x x x x x x */ | ||
| 115 | #define RTC_MDAY_BCD_MASK 0x3f /* - - x x x x x x */ | ||
| 116 | #define RTC_MONTH_BCD_MASK 0x1f /* - - - x x x x x */ | ||
| 117 | #define RTC_YEAR_BCD_MASK 0xff /* x x x x x x x x */ | ||
| 118 | |||
| 119 | /* | ||
| 120 | * Bit masks for the Time registers in BIN Mode (DM = 1). | ||
| 121 | */ | ||
| 122 | #define RTC_SECS_BIN_MASK 0x3f /* - - x x x x x x */ | ||
| 123 | #define RTC_MINS_BIN_MASK 0x3f /* - - x x x x x x */ | ||
| 124 | #define RTC_HRS_12_BIN_MASK 0x0f /* - - - - x x x x */ | ||
| 125 | #define RTC_HRS_24_BIN_MASK 0x1f /* - - - x x x x x */ | ||
| 126 | #define RTC_MDAY_BIN_MASK 0x1f /* - - - x x x x x */ | ||
| 127 | #define RTC_MONTH_BIN_MASK 0x0f /* - - - - x x x x */ | ||
| 128 | #define RTC_YEAR_BIN_MASK 0x7f /* - x x x x x x x */ | ||
| 129 | |||
| 130 | /* | ||
| 131 | * Bit masks common for the Time registers in BCD or BIN Mode. | ||
| 132 | */ | ||
| 133 | #define RTC_WDAY_MASK 0x07 /* - - - - - x x x */ | ||
| 134 | #define RTC_CENTURY_MASK 0xff /* x x x x x x x x */ | ||
| 135 | #define RTC_MDAY_ALARM_MASK 0xff /* x x x x x x x x */ | ||
| 136 | #define RTC_HRS_AMPM_MASK BIT(7) /* Mask for the AM/PM bit */ | ||
| 137 | |||
| 138 | |||
| 139 | |||
| 140 | /* | ||
| 141 | * Control Registers. | ||
| 142 | */ | ||
| 143 | #define RTC_CTRL_A 0x0a /* Control Register A */ | ||
| 144 | #define RTC_CTRL_B 0x0b /* Control Register B */ | ||
| 145 | #define RTC_CTRL_C 0x0c /* Control Register C */ | ||
| 146 | #define RTC_CTRL_D 0x0d /* Control Register D */ | ||
| 147 | #define RTC_EXT_CTRL_4A 0x4a /* Extended Control Register 4A */ | ||
| 148 | #define RTC_EXT_CTRL_4B 0x4b /* Extended Control Register 4B */ | ||
| 149 | |||
| 150 | |||
| 151 | /* | ||
| 152 | * Bit names in Control Register A. | ||
| 153 | */ | ||
| 154 | #define RTC_CTRL_A_UIP BIT(7) /* Update In Progress */ | ||
| 155 | #define RTC_CTRL_A_DV2 BIT(6) /* Countdown Chain */ | ||
| 156 | #define RTC_CTRL_A_DV1 BIT(5) /* Oscillator Enable */ | ||
| 157 | #define RTC_CTRL_A_DV0 BIT(4) /* Bank Select */ | ||
| 158 | #define RTC_CTRL_A_RS2 BIT(2) /* Rate-Selection Bit 2 */ | ||
| 159 | #define RTC_CTRL_A_RS3 BIT(3) /* Rate-Selection Bit 3 */ | ||
| 160 | #define RTC_CTRL_A_RS1 BIT(1) /* Rate-Selection Bit 1 */ | ||
| 161 | #define RTC_CTRL_A_RS0 BIT(0) /* Rate-Selection Bit 0 */ | ||
| 162 | #define RTC_CTRL_A_RS_MASK 0x0f /* RS3 + RS2 + RS1 + RS0 */ | ||
| 163 | |||
| 164 | /* | ||
| 165 | * Bit names in Control Register B. | ||
| 166 | */ | ||
| 167 | #define RTC_CTRL_B_SET BIT(7) /* SET Bit */ | ||
| 168 | #define RTC_CTRL_B_PIE BIT(6) /* Periodic-Interrupt Enable */ | ||
| 169 | #define RTC_CTRL_B_AIE BIT(5) /* Alarm-Interrupt Enable */ | ||
| 170 | #define RTC_CTRL_B_UIE BIT(4) /* Update-Ended Interrupt-Enable */ | ||
| 171 | #define RTC_CTRL_B_SQWE BIT(3) /* Square-Wave Enable */ | ||
| 172 | #define RTC_CTRL_B_DM BIT(2) /* Data Mode */ | ||
| 173 | #define RTC_CTRL_B_2412 BIT(1) /* 12-Hr/24-Hr Mode */ | ||
| 174 | #define RTC_CTRL_B_DSE BIT(0) /* Daylight Savings Enable */ | ||
| 175 | #define RTC_CTRL_B_PAU_MASK 0x70 /* PIE + AIE + UIE */ | ||
| 176 | |||
| 177 | |||
| 178 | /* | ||
| 179 | * Bit names in Control Register C. | ||
| 180 | * | ||
| 181 | * BIT(0), BIT(1), BIT(2), & BIT(3) are unused, always return 0, and cannot | ||
| 182 | * be written to. | ||
| 183 | */ | ||
| 184 | #define RTC_CTRL_C_IRQF BIT(7) /* Interrupt-Request Flag */ | ||
| 185 | #define RTC_CTRL_C_PF BIT(6) /* Periodic-Interrupt Flag */ | ||
| 186 | #define RTC_CTRL_C_AF BIT(5) /* Alarm-Interrupt Flag */ | ||
| 187 | #define RTC_CTRL_C_UF BIT(4) /* Update-Ended Interrupt Flag */ | ||
| 188 | #define RTC_CTRL_C_PAU_MASK 0x70 /* PF + AF + UF */ | ||
