| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2007-2009 ST-Ericsson AB | 
 | 3 |  * License terms: GNU General Public License (GPL) version 2 | 
 | 4 |  * AB3100 core access functions | 
 | 5 |  * Author: Linus Walleij <linus.walleij@stericsson.com> | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 6 |  * | 
 | 7 |  * ABX500 core access functions. | 
 | 8 |  * The abx500 interface is used for the Analog Baseband chip | 
| Linus Walleij | 8959e74 | 2011-09-26 11:45:30 +0200 | [diff] [blame] | 9 |  * ab3100, ab5500, and ab8500. | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 10 |  * | 
 | 11 |  * Author: Mattias Wallin <mattias.wallin@stericsson.com> | 
 | 12 |  * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> | 
 | 13 |  * Author: Bengt Jonsson <bengt.g.jonsson@stericsson.com> | 
 | 14 |  * Author: Rickard Andersson <rickard.andersson@stericsson.com> | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 15 |  */ | 
 | 16 |  | 
 | 17 | #include <linux/device.h> | 
| Linus Walleij | d619bc1 | 2009-09-09 11:31:00 +0200 | [diff] [blame] | 18 | #include <linux/regulator/machine.h> | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 19 |  | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 20 | #ifndef MFD_ABX500_H | 
 | 21 | #define MFD_ABX500_H | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 22 |  | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 23 | #define AB3100_P1A	0xc0 | 
 | 24 | #define AB3100_P1B	0xc1 | 
 | 25 | #define AB3100_P1C	0xc2 | 
 | 26 | #define AB3100_P1D	0xc3 | 
 | 27 | #define AB3100_P1E	0xc4 | 
 | 28 | #define AB3100_P1F	0xc5 | 
 | 29 | #define AB3100_P1G	0xc6 | 
 | 30 | #define AB3100_R2A	0xc7 | 
 | 31 | #define AB3100_R2B	0xc8 | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 32 | #define AB5500_1_0	0x20 | 
| Mattias Wallin | 3d5e2ca | 2011-09-22 08:22:18 +0200 | [diff] [blame] | 33 | #define AB5500_1_1	0x21 | 
 | 34 | #define AB5500_2_0	0x24 | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 35 |  | 
| Linus Walleij | 863dde5 | 2011-05-08 00:54:45 +0200 | [diff] [blame] | 36 | /* AB8500 CIDs*/ | 
| Linus Walleij | 863dde5 | 2011-05-08 00:54:45 +0200 | [diff] [blame] | 37 | #define AB8500_CUT1P0	0x10 | 
 | 38 | #define AB8500_CUT1P1	0x11 | 
 | 39 | #define AB8500_CUT2P0	0x20 | 
 | 40 | #define AB8500_CUT3P0	0x30 | 
| Linus Walleij | b958f7a | 2011-10-30 23:50:36 +0100 | [diff] [blame] | 41 | #define AB8500_CUT3P3	0x33 | 
| Linus Walleij | 863dde5 | 2011-05-08 00:54:45 +0200 | [diff] [blame] | 42 |  | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 43 | /* | 
 | 44 |  * AB3100, EVENTA1, A2 and A3 event register flags | 
 | 45 |  * these are catenated into a single 32-bit flag in the code | 
 | 46 |  * for event notification broadcasts. | 
 | 47 |  */ | 
 | 48 | #define AB3100_EVENTA1_ONSWA				(0x01<<16) | 
 | 49 | #define AB3100_EVENTA1_ONSWB				(0x02<<16) | 
 | 50 | #define AB3100_EVENTA1_ONSWC				(0x04<<16) | 
 | 51 | #define AB3100_EVENTA1_DCIO				(0x08<<16) | 
 | 52 | #define AB3100_EVENTA1_OVER_TEMP			(0x10<<16) | 
 | 53 | #define AB3100_EVENTA1_SIM_OFF				(0x20<<16) | 
 | 54 | #define AB3100_EVENTA1_VBUS				(0x40<<16) | 
 | 55 | #define AB3100_EVENTA1_VSET_USB				(0x80<<16) | 
 | 56 |  | 
 | 57 | #define AB3100_EVENTA2_READY_TX				(0x01<<8) | 
 | 58 | #define AB3100_EVENTA2_READY_RX				(0x02<<8) | 
 | 59 | #define AB3100_EVENTA2_OVERRUN_ERROR			(0x04<<8) | 
 | 60 | #define AB3100_EVENTA2_FRAMING_ERROR			(0x08<<8) | 
 | 61 | #define AB3100_EVENTA2_CHARG_OVERCURRENT		(0x10<<8) | 
 | 62 | #define AB3100_EVENTA2_MIDR				(0x20<<8) | 
 | 63 | #define AB3100_EVENTA2_BATTERY_REM			(0x40<<8) | 
 | 64 | #define AB3100_EVENTA2_ALARM				(0x80<<8) | 
 | 65 |  | 
 | 66 | #define AB3100_EVENTA3_ADC_TRIG5			(0x01) | 
 | 67 | #define AB3100_EVENTA3_ADC_TRIG4			(0x02) | 
 | 68 | #define AB3100_EVENTA3_ADC_TRIG3			(0x04) | 
 | 69 | #define AB3100_EVENTA3_ADC_TRIG2			(0x08) | 
 | 70 | #define AB3100_EVENTA3_ADC_TRIGVBAT			(0x10) | 
 | 71 | #define AB3100_EVENTA3_ADC_TRIGVTX			(0x20) | 
 | 72 | #define AB3100_EVENTA3_ADC_TRIG1			(0x40) | 
 | 73 | #define AB3100_EVENTA3_ADC_TRIG0			(0x80) | 
 | 74 |  | 
 | 75 | /* AB3100, STR register flags */ | 
 | 76 | #define AB3100_STR_ONSWA				(0x01) | 
 | 77 | #define AB3100_STR_ONSWB				(0x02) | 
 | 78 | #define AB3100_STR_ONSWC				(0x04) | 
 | 79 | #define AB3100_STR_DCIO					(0x08) | 
 | 80 | #define AB3100_STR_BOOT_MODE				(0x10) | 
 | 81 | #define AB3100_STR_SIM_OFF				(0x20) | 
 | 82 | #define AB3100_STR_BATT_REMOVAL				(0x40) | 
 | 83 | #define AB3100_STR_VBUS					(0x80) | 
 | 84 |  | 
| Linus Walleij | d619bc1 | 2009-09-09 11:31:00 +0200 | [diff] [blame] | 85 | /* | 
 | 86 |  * AB3100 contains 8 regulators, one external regulator controller | 
 | 87 |  * and a buck converter, further the LDO E and buck converter can | 
 | 88 |  * have separate settings if they are in sleep mode, this is | 
 | 89 |  * modeled as a separate regulator. | 
 | 90 |  */ | 
 | 91 | #define AB3100_NUM_REGULATORS				10 | 
 | 92 |  | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 93 | /** | 
 | 94 |  * struct ab3100 | 
 | 95 |  * @access_mutex: lock out concurrent accesses to the AB3100 registers | 
 | 96 |  * @dev: pointer to the containing device | 
 | 97 |  * @i2c_client: I2C client for this chip | 
 | 98 |  * @testreg_client: secondary client for test registers | 
 | 99 |  * @chip_name: name of this chip variant | 
 | 100 |  * @chip_id: 8 bit chip ID for this chip variant | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 101 |  * @event_subscribers: event subscribers are listed here | 
 | 102 |  * @startup_events: a copy of the first reading of the event registers | 
 | 103 |  * @startup_events_read: whether the first events have been read | 
 | 104 |  * | 
 | 105 |  * This struct is PRIVATE and devices using it should NOT | 
 | 106 |  * access ANY fields. It is used as a token for calling the | 
 | 107 |  * AB3100 functions. | 
 | 108 |  */ | 
 | 109 | struct ab3100 { | 
 | 110 | 	struct mutex access_mutex; | 
 | 111 | 	struct device *dev; | 
 | 112 | 	struct i2c_client *i2c_client; | 
 | 113 | 	struct i2c_client *testreg_client; | 
 | 114 | 	char chip_name[32]; | 
 | 115 | 	u8 chip_id; | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 116 | 	struct blocking_notifier_head event_subscribers; | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 117 | 	u8 startup_events[3]; | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 118 | 	bool startup_events_read; | 
 | 119 | }; | 
 | 120 |  | 
| Linus Walleij | d619bc1 | 2009-09-09 11:31:00 +0200 | [diff] [blame] | 121 | /** | 
 | 122 |  * struct ab3100_platform_data | 
 | 123 |  * Data supplied to initialize board connections to the AB3100 | 
 | 124 |  * @reg_constraints: regulator constraints for target board | 
 | 125 |  *     the order of these constraints are: LDO A, C, D, E, | 
 | 126 |  *     F, G, H, K, EXT and BUCK. | 
 | 127 |  * @reg_initvals: initial values for the regulator registers | 
 | 128 |  *     plus two sleep settings for LDO E and the BUCK converter. | 
 | 129 |  *     exactly AB3100_NUM_REGULATORS+2 values must be sent in. | 
 | 130 |  *     Order: LDO A, C, E, E sleep, F, G, H, K, EXT, BUCK, | 
 | 131 |  *     BUCK sleep, LDO D. (LDO D need to be initialized last.) | 
 | 132 |  * @external_voltage: voltage level of the external regulator. | 
 | 133 |  */ | 
 | 134 | struct ab3100_platform_data { | 
 | 135 | 	struct regulator_init_data reg_constraints[AB3100_NUM_REGULATORS]; | 
 | 136 | 	u8 reg_initvals[AB3100_NUM_REGULATORS+2]; | 
 | 137 | 	int external_voltage; | 
 | 138 | }; | 
 | 139 |  | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 140 | int ab3100_event_register(struct ab3100 *ab3100, | 
 | 141 | 			  struct notifier_block *nb); | 
 | 142 | int ab3100_event_unregister(struct ab3100 *ab3100, | 
 | 143 | 			    struct notifier_block *nb); | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 144 |  | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 145 | /** | 
 | 146 |  * struct abx500_init_setting | 
 | 147 |  * Initial value of the registers for driver to use during setup. | 
 | 148 |  */ | 
 | 149 | struct abx500_init_settings { | 
 | 150 | 	u8 bank; | 
 | 151 | 	u8 reg; | 
 | 152 | 	u8 setting; | 
 | 153 | }; | 
 | 154 |  | 
| Mattias Wallin | fa66125 | 2010-05-01 18:26:20 +0200 | [diff] [blame] | 155 | int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg, | 
 | 156 | 	u8 value); | 
 | 157 | int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg, | 
 | 158 | 	u8 *value); | 
 | 159 | int abx500_get_register_page_interruptible(struct device *dev, u8 bank, | 
 | 160 | 	u8 first_reg, u8 *regvals, u8 numregs); | 
 | 161 | int abx500_set_register_page_interruptible(struct device *dev, u8 bank, | 
 | 162 | 	u8 first_reg, u8 *regvals, u8 numregs); | 
 | 163 | /** | 
 | 164 |  * abx500_mask_and_set_register_inerruptible() - Modifies selected bits of a | 
 | 165 |  *	target register | 
 | 166 |  * | 
 | 167 |  * @dev: The AB sub device. | 
 | 168 |  * @bank: The i2c bank number. | 
 | 169 |  * @bitmask: The bit mask to use. | 
 | 170 |  * @bitvalues: The new bit values. | 
 | 171 |  * | 
 | 172 |  * Updates the value of an AB register: | 
 | 173 |  * value -> ((value & ~bitmask) | (bitvalues & bitmask)) | 
 | 174 |  */ | 
 | 175 | int abx500_mask_and_set_register_interruptible(struct device *dev, u8 bank, | 
 | 176 | 	u8 reg, u8 bitmask, u8 bitvalues); | 
 | 177 | int abx500_get_chip_id(struct device *dev); | 
 | 178 | int abx500_event_registers_startup_state_get(struct device *dev, u8 *event); | 
 | 179 | int abx500_startup_irq_enabled(struct device *dev, unsigned int irq); | 
 | 180 |  | 
 | 181 | struct abx500_ops { | 
 | 182 | 	int (*get_chip_id) (struct device *); | 
 | 183 | 	int (*get_register) (struct device *, u8, u8, u8 *); | 
 | 184 | 	int (*set_register) (struct device *, u8, u8, u8); | 
 | 185 | 	int (*get_register_page) (struct device *, u8, u8, u8 *, u8); | 
 | 186 | 	int (*set_register_page) (struct device *, u8, u8, u8 *, u8); | 
 | 187 | 	int (*mask_and_set_register) (struct device *, u8, u8, u8, u8); | 
 | 188 | 	int (*event_registers_startup_state_get) (struct device *, u8 *); | 
 | 189 | 	int (*startup_irq_enabled) (struct device *, unsigned int); | 
 | 190 | }; | 
 | 191 |  | 
 | 192 | int abx500_register_ops(struct device *core_dev, struct abx500_ops *ops); | 
| Mark Brown | c6252e9 | 2010-09-22 14:58:30 +0100 | [diff] [blame] | 193 | void abx500_remove_ops(struct device *dev); | 
| Linus Walleij | 14fa569 | 2009-05-21 23:17:06 +0200 | [diff] [blame] | 194 | #endif |