Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: lochnagar: Add support for the Cirrus Logic Lochnagar

Lochnagar is an evaluation and development board for Cirrus
Logic Smart CODEC and Amp devices. It allows the connection of
most Cirrus Logic devices on mini-cards, as well as allowing
connection of various application processor systems to provide a
full evaluation platform. This driver supports the board
controller chip on the Lochnagar board. Audio system topology,
clocking and power can all be controlled through the Lochnagar
controller chip, allowing the device under test to be used in
a variety of possible use cases.

As the Lochnagar is a fairly complex device this MFD driver
allows the drivers for the various features to be bound
in. Initially clocking, regulator and pinctrl will be added as
these are necessary to configure the system. But in time at least
audio and voltage/current monitoring will also be added.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Charles Keepax and committed by
Lee Jones
422dcafe fdc98f07

+928
+17
MAINTAINERS
··· 3700 3700 S: Maintained 3701 3701 F: drivers/net/ethernet/cirrus/ep93xx_eth.c 3702 3702 3703 + CIRRUS LOGIC LOCHNAGAR DRIVER 3704 + M: Charles Keepax <ckeepax@opensource.cirrus.com> 3705 + M: Richard Fitzgerald <rf@opensource.cirrus.com> 3706 + L: patches@opensource.cirrus.com 3707 + S: Supported 3708 + F: drivers/clk/clk-lochnagar.c 3709 + F: drivers/mfd/lochnagar-i2c.c 3710 + F: drivers/pinctrl/cirrus/pinctrl-lochnagar.c 3711 + F: drivers/regulator/lochnagar-regulator.c 3712 + F: include/dt-bindings/clk/lochnagar.h 3713 + F: include/dt-bindings/pinctrl/lochnagar.h 3714 + F: include/linux/mfd/lochnagar* 3715 + F: Documentation/devicetree/bindings/mfd/cirrus,lochnagar.txt 3716 + F: Documentation/devicetree/bindings/clock/cirrus,lochnagar.txt 3717 + F: Documentation/devicetree/bindings/pinctrl/cirrus,lochnagar.txt 3718 + F: Documentation/devicetree/bindings/regulator/cirrus,lochnagar.txt 3719 + 3703 3720 CISCO FCOE HBA DRIVER 3704 3721 M: Satish Kharat <satishkh@cisco.com> 3705 3722 M: Sesidhar Baddela <sebaddel@cisco.com>
+8
drivers/mfd/Kconfig
··· 1686 1686 VIA VX855/VX875 south bridge. You will need to enable the vx855_spi 1687 1687 and/or vx855_gpio drivers for this to do anything useful. 1688 1688 1689 + config MFD_LOCHNAGAR 1690 + bool "Cirrus Logic Lochnagar Audio Development Board" 1691 + select MFD_CORE 1692 + select REGMAP_I2C 1693 + depends on I2C=y && OF 1694 + help 1695 + Support for Cirrus Logic Lochnagar audio development board. 1696 + 1689 1697 config MFD_ARIZONA 1690 1698 select REGMAP 1691 1699 select REGMAP_IRQ
+2
drivers/mfd/Makefile
··· 37 37 obj-$(CONFIG_MFD_TC6387XB) += tc6387xb.o tmio_core.o 38 38 obj-$(CONFIG_MFD_TC6393XB) += tc6393xb.o tmio_core.o 39 39 40 + obj-$(CONFIG_MFD_LOCHNAGAR) += lochnagar-i2c.o 41 + 40 42 obj-$(CONFIG_MFD_ARIZONA) += arizona-core.o 41 43 obj-$(CONFIG_MFD_ARIZONA) += arizona-irq.o 42 44 obj-$(CONFIG_MFD_ARIZONA_I2C) += arizona-i2c.o
+398
drivers/mfd/lochnagar-i2c.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Lochnagar I2C bus interface 4 + * 5 + * Copyright (c) 2012-2018 Cirrus Logic, Inc. and 6 + * Cirrus Logic International Semiconductor Ltd. 7 + * 8 + * Author: Charles Keepax <ckeepax@opensource.cirrus.com> 9 + */ 10 + 11 + #include <linux/delay.h> 12 + #include <linux/device.h> 13 + #include <linux/err.h> 14 + #include <linux/gpio/consumer.h> 15 + #include <linux/i2c.h> 16 + #include <linux/lockdep.h> 17 + #include <linux/mfd/core.h> 18 + #include <linux/mutex.h> 19 + #include <linux/of.h> 20 + #include <linux/of_platform.h> 21 + #include <linux/regmap.h> 22 + 23 + #include <linux/mfd/lochnagar.h> 24 + #include <linux/mfd/lochnagar1_regs.h> 25 + #include <linux/mfd/lochnagar2_regs.h> 26 + 27 + #define LOCHNAGAR_BOOT_RETRIES 10 28 + #define LOCHNAGAR_BOOT_DELAY_MS 350 29 + 30 + #define LOCHNAGAR_CONFIG_POLL_US 10000 31 + 32 + static bool lochnagar1_readable_register(struct device *dev, unsigned int reg) 33 + { 34 + switch (reg) { 35 + case LOCHNAGAR_SOFTWARE_RESET: 36 + case LOCHNAGAR_FIRMWARE_ID1...LOCHNAGAR_FIRMWARE_ID2: 37 + case LOCHNAGAR1_CDC_AIF1_SEL...LOCHNAGAR1_CDC_AIF3_SEL: 38 + case LOCHNAGAR1_CDC_MCLK1_SEL...LOCHNAGAR1_CDC_MCLK2_SEL: 39 + case LOCHNAGAR1_CDC_AIF_CTRL1...LOCHNAGAR1_CDC_AIF_CTRL2: 40 + case LOCHNAGAR1_EXT_AIF_CTRL: 41 + case LOCHNAGAR1_DSP_AIF1_SEL...LOCHNAGAR1_DSP_AIF2_SEL: 42 + case LOCHNAGAR1_DSP_CLKIN_SEL: 43 + case LOCHNAGAR1_DSP_AIF: 44 + case LOCHNAGAR1_GF_AIF1...LOCHNAGAR1_GF_AIF2: 45 + case LOCHNAGAR1_PSIA_AIF: 46 + case LOCHNAGAR1_PSIA1_SEL...LOCHNAGAR1_PSIA2_SEL: 47 + case LOCHNAGAR1_SPDIF_AIF_SEL: 48 + case LOCHNAGAR1_GF_AIF3_SEL...LOCHNAGAR1_GF_AIF4_SEL: 49 + case LOCHNAGAR1_GF_CLKOUT1_SEL: 50 + case LOCHNAGAR1_GF_AIF1_SEL...LOCHNAGAR1_GF_AIF2_SEL: 51 + case LOCHNAGAR1_GF_GPIO2...LOCHNAGAR1_GF_GPIO7: 52 + case LOCHNAGAR1_RST: 53 + case LOCHNAGAR1_LED1...LOCHNAGAR1_LED2: 54 + case LOCHNAGAR1_I2C_CTRL: 55 + return true; 56 + default: 57 + return false; 58 + } 59 + } 60 + 61 + static const struct regmap_config lochnagar1_i2c_regmap = { 62 + .reg_bits = 8, 63 + .val_bits = 8, 64 + .reg_format_endian = REGMAP_ENDIAN_BIG, 65 + .val_format_endian = REGMAP_ENDIAN_BIG, 66 + 67 + .max_register = 0x50, 68 + .readable_reg = lochnagar1_readable_register, 69 + 70 + .use_single_read = true, 71 + .use_single_write = true, 72 + 73 + .cache_type = REGCACHE_RBTREE, 74 + }; 75 + 76 + static const struct reg_sequence lochnagar1_patch[] = { 77 + { 0x40, 0x0083 }, 78 + { 0x47, 0x0018 }, 79 + { 0x50, 0x0000 }, 80 + }; 81 + 82 + static bool lochnagar2_readable_register(struct device *dev, unsigned int reg) 83 + { 84 + switch (reg) { 85 + case LOCHNAGAR_SOFTWARE_RESET: 86 + case LOCHNAGAR_FIRMWARE_ID1...LOCHNAGAR_FIRMWARE_ID2: 87 + case LOCHNAGAR2_CDC_AIF1_CTRL...LOCHNAGAR2_CDC_AIF3_CTRL: 88 + case LOCHNAGAR2_DSP_AIF1_CTRL...LOCHNAGAR2_DSP_AIF2_CTRL: 89 + case LOCHNAGAR2_PSIA1_CTRL...LOCHNAGAR2_PSIA2_CTRL: 90 + case LOCHNAGAR2_GF_AIF3_CTRL...LOCHNAGAR2_GF_AIF4_CTRL: 91 + case LOCHNAGAR2_GF_AIF1_CTRL...LOCHNAGAR2_GF_AIF2_CTRL: 92 + case LOCHNAGAR2_SPDIF_AIF_CTRL: 93 + case LOCHNAGAR2_USB_AIF1_CTRL...LOCHNAGAR2_USB_AIF2_CTRL: 94 + case LOCHNAGAR2_ADAT_AIF_CTRL: 95 + case LOCHNAGAR2_CDC_MCLK1_CTRL...LOCHNAGAR2_CDC_MCLK2_CTRL: 96 + case LOCHNAGAR2_DSP_CLKIN_CTRL: 97 + case LOCHNAGAR2_PSIA1_MCLK_CTRL...LOCHNAGAR2_PSIA2_MCLK_CTRL: 98 + case LOCHNAGAR2_SPDIF_MCLK_CTRL: 99 + case LOCHNAGAR2_GF_CLKOUT1_CTRL...LOCHNAGAR2_GF_CLKOUT2_CTRL: 100 + case LOCHNAGAR2_ADAT_MCLK_CTRL: 101 + case LOCHNAGAR2_SOUNDCARD_MCLK_CTRL: 102 + case LOCHNAGAR2_GPIO_FPGA_GPIO1...LOCHNAGAR2_GPIO_FPGA_GPIO6: 103 + case LOCHNAGAR2_GPIO_CDC_GPIO1...LOCHNAGAR2_GPIO_CDC_GPIO8: 104 + case LOCHNAGAR2_GPIO_DSP_GPIO1...LOCHNAGAR2_GPIO_DSP_GPIO6: 105 + case LOCHNAGAR2_GPIO_GF_GPIO2...LOCHNAGAR2_GPIO_GF_GPIO7: 106 + case LOCHNAGAR2_GPIO_CDC_AIF1_BCLK...LOCHNAGAR2_GPIO_CDC_AIF3_TXDAT: 107 + case LOCHNAGAR2_GPIO_DSP_AIF1_BCLK...LOCHNAGAR2_GPIO_DSP_AIF2_TXDAT: 108 + case LOCHNAGAR2_GPIO_PSIA1_BCLK...LOCHNAGAR2_GPIO_PSIA2_TXDAT: 109 + case LOCHNAGAR2_GPIO_GF_AIF3_BCLK...LOCHNAGAR2_GPIO_GF_AIF4_TXDAT: 110 + case LOCHNAGAR2_GPIO_GF_AIF1_BCLK...LOCHNAGAR2_GPIO_GF_AIF2_TXDAT: 111 + case LOCHNAGAR2_GPIO_DSP_UART1_RX...LOCHNAGAR2_GPIO_DSP_UART2_TX: 112 + case LOCHNAGAR2_GPIO_GF_UART2_RX...LOCHNAGAR2_GPIO_GF_UART2_TX: 113 + case LOCHNAGAR2_GPIO_USB_UART_RX: 114 + case LOCHNAGAR2_GPIO_CDC_PDMCLK1...LOCHNAGAR2_GPIO_CDC_PDMDAT2: 115 + case LOCHNAGAR2_GPIO_CDC_DMICCLK1...LOCHNAGAR2_GPIO_CDC_DMICDAT4: 116 + case LOCHNAGAR2_GPIO_DSP_DMICCLK1...LOCHNAGAR2_GPIO_DSP_DMICDAT2: 117 + case LOCHNAGAR2_GPIO_I2C2_SCL...LOCHNAGAR2_GPIO_I2C4_SDA: 118 + case LOCHNAGAR2_GPIO_DSP_STANDBY: 119 + case LOCHNAGAR2_GPIO_CDC_MCLK1...LOCHNAGAR2_GPIO_CDC_MCLK2: 120 + case LOCHNAGAR2_GPIO_DSP_CLKIN: 121 + case LOCHNAGAR2_GPIO_PSIA1_MCLK...LOCHNAGAR2_GPIO_PSIA2_MCLK: 122 + case LOCHNAGAR2_GPIO_GF_GPIO1...LOCHNAGAR2_GPIO_GF_GPIO5: 123 + case LOCHNAGAR2_GPIO_DSP_GPIO20: 124 + case LOCHNAGAR2_GPIO_CHANNEL1...LOCHNAGAR2_GPIO_CHANNEL16: 125 + case LOCHNAGAR2_MINICARD_RESETS: 126 + case LOCHNAGAR2_ANALOGUE_PATH_CTRL1...LOCHNAGAR2_ANALOGUE_PATH_CTRL2: 127 + case LOCHNAGAR2_COMMS_CTRL4: 128 + case LOCHNAGAR2_SPDIF_CTRL: 129 + case LOCHNAGAR2_IMON_CTRL1...LOCHNAGAR2_IMON_CTRL4: 130 + case LOCHNAGAR2_IMON_DATA1...LOCHNAGAR2_IMON_DATA2: 131 + case LOCHNAGAR2_POWER_CTRL: 132 + case LOCHNAGAR2_MICVDD_CTRL1: 133 + case LOCHNAGAR2_MICVDD_CTRL2: 134 + case LOCHNAGAR2_VDDCORE_CDC_CTRL1: 135 + case LOCHNAGAR2_VDDCORE_CDC_CTRL2: 136 + case LOCHNAGAR2_SOUNDCARD_AIF_CTRL: 137 + return true; 138 + default: 139 + return false; 140 + } 141 + } 142 + 143 + static bool lochnagar2_volatile_register(struct device *dev, unsigned int reg) 144 + { 145 + switch (reg) { 146 + case LOCHNAGAR2_GPIO_CHANNEL1...LOCHNAGAR2_GPIO_CHANNEL16: 147 + case LOCHNAGAR2_ANALOGUE_PATH_CTRL1: 148 + case LOCHNAGAR2_IMON_CTRL3...LOCHNAGAR2_IMON_CTRL4: 149 + case LOCHNAGAR2_IMON_DATA1...LOCHNAGAR2_IMON_DATA2: 150 + return true; 151 + default: 152 + return false; 153 + } 154 + } 155 + 156 + static const struct regmap_config lochnagar2_i2c_regmap = { 157 + .reg_bits = 16, 158 + .val_bits = 16, 159 + .reg_format_endian = REGMAP_ENDIAN_BIG, 160 + .val_format_endian = REGMAP_ENDIAN_BIG, 161 + 162 + .max_register = 0x1F1F, 163 + .readable_reg = lochnagar2_readable_register, 164 + .volatile_reg = lochnagar2_volatile_register, 165 + 166 + .cache_type = REGCACHE_RBTREE, 167 + }; 168 + 169 + static const struct reg_sequence lochnagar2_patch[] = { 170 + { 0x00EE, 0x0000 }, 171 + }; 172 + 173 + struct lochnagar_config { 174 + int id; 175 + const char * const name; 176 + enum lochnagar_type type; 177 + const struct regmap_config *regmap; 178 + const struct reg_sequence *patch; 179 + int npatch; 180 + }; 181 + 182 + static struct lochnagar_config lochnagar_configs[] = { 183 + { 184 + .id = 0x50, 185 + .name = "lochnagar1", 186 + .type = LOCHNAGAR1, 187 + .regmap = &lochnagar1_i2c_regmap, 188 + .patch = lochnagar1_patch, 189 + .npatch = ARRAY_SIZE(lochnagar1_patch), 190 + }, 191 + { 192 + .id = 0xCB58, 193 + .name = "lochnagar2", 194 + .type = LOCHNAGAR2, 195 + .regmap = &lochnagar2_i2c_regmap, 196 + .patch = lochnagar2_patch, 197 + .npatch = ARRAY_SIZE(lochnagar2_patch), 198 + }, 199 + }; 200 + 201 + static const struct of_device_id lochnagar_of_match[] = { 202 + { .compatible = "cirrus,lochnagar1", .data = &lochnagar_configs[0] }, 203 + { .compatible = "cirrus,lochnagar2", .data = &lochnagar_configs[1] }, 204 + {}, 205 + }; 206 + 207 + static int lochnagar_wait_for_boot(struct regmap *regmap, unsigned int *id) 208 + { 209 + int i, ret; 210 + 211 + for (i = 0; i < LOCHNAGAR_BOOT_RETRIES; ++i) { 212 + msleep(LOCHNAGAR_BOOT_DELAY_MS); 213 + 214 + /* The reset register will return the device ID when read */ 215 + ret = regmap_read(regmap, LOCHNAGAR_SOFTWARE_RESET, id); 216 + if (!ret) 217 + return ret; 218 + } 219 + 220 + return -ETIMEDOUT; 221 + } 222 + 223 + /** 224 + * lochnagar_update_config - Synchronise the boards analogue configuration to 225 + * the hardware. 226 + * 227 + * @lochnagar: A pointer to the primary core data structure. 228 + * 229 + * Return: Zero on success or an appropriate negative error code on failure. 230 + */ 231 + int lochnagar_update_config(struct lochnagar *lochnagar) 232 + { 233 + struct regmap *regmap = lochnagar->regmap; 234 + unsigned int done = LOCHNAGAR2_ANALOGUE_PATH_UPDATE_STS_MASK; 235 + int timeout_ms = LOCHNAGAR_BOOT_DELAY_MS * LOCHNAGAR_BOOT_RETRIES; 236 + unsigned int val = 0; 237 + int ret; 238 + 239 + lockdep_assert_held(&lochnagar->analogue_config_lock); 240 + 241 + if (lochnagar->type != LOCHNAGAR2) 242 + return 0; 243 + 244 + /* 245 + * Toggle the ANALOGUE_PATH_UPDATE bit and wait for the device to 246 + * acknowledge that any outstanding changes to the analogue 247 + * configuration have been applied. 248 + */ 249 + ret = regmap_write(regmap, LOCHNAGAR2_ANALOGUE_PATH_CTRL1, 0); 250 + if (ret < 0) 251 + return ret; 252 + 253 + ret = regmap_write(regmap, LOCHNAGAR2_ANALOGUE_PATH_CTRL1, 254 + LOCHNAGAR2_ANALOGUE_PATH_UPDATE_MASK); 255 + if (ret < 0) 256 + return ret; 257 + 258 + ret = regmap_read_poll_timeout(regmap, 259 + LOCHNAGAR2_ANALOGUE_PATH_CTRL1, val, 260 + (val & done), LOCHNAGAR_CONFIG_POLL_US, 261 + timeout_ms * 1000); 262 + if (ret < 0) 263 + return ret; 264 + 265 + return 0; 266 + } 267 + EXPORT_SYMBOL_GPL(lochnagar_update_config); 268 + 269 + static int lochnagar_i2c_probe(struct i2c_client *i2c) 270 + { 271 + struct device *dev = &i2c->dev; 272 + const struct lochnagar_config *config = NULL; 273 + const struct of_device_id *of_id; 274 + struct lochnagar *lochnagar; 275 + struct gpio_desc *reset, *present; 276 + unsigned int val; 277 + unsigned int firmwareid; 278 + unsigned int devid, rev; 279 + int ret; 280 + 281 + lochnagar = devm_kzalloc(dev, sizeof(*lochnagar), GFP_KERNEL); 282 + if (!lochnagar) 283 + return -ENOMEM; 284 + 285 + of_id = of_match_device(lochnagar_of_match, dev); 286 + if (!of_id) 287 + return -EINVAL; 288 + 289 + config = of_id->data; 290 + 291 + lochnagar->dev = dev; 292 + mutex_init(&lochnagar->analogue_config_lock); 293 + 294 + dev_set_drvdata(dev, lochnagar); 295 + 296 + reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); 297 + if (IS_ERR(reset)) { 298 + ret = PTR_ERR(reset); 299 + dev_err(dev, "Failed to get reset GPIO: %d\n", ret); 300 + return ret; 301 + } 302 + 303 + present = devm_gpiod_get_optional(dev, "present", GPIOD_OUT_HIGH); 304 + if (IS_ERR(present)) { 305 + ret = PTR_ERR(present); 306 + dev_err(dev, "Failed to get present GPIO: %d\n", ret); 307 + return ret; 308 + } 309 + 310 + /* Leave the Lochnagar in reset for a reasonable amount of time */ 311 + msleep(20); 312 + 313 + /* Bring Lochnagar out of reset */ 314 + gpiod_set_value_cansleep(reset, 1); 315 + 316 + /* Identify Lochnagar */ 317 + lochnagar->type = config->type; 318 + 319 + lochnagar->regmap = devm_regmap_init_i2c(i2c, config->regmap); 320 + if (IS_ERR(lochnagar->regmap)) { 321 + ret = PTR_ERR(lochnagar->regmap); 322 + dev_err(dev, "Failed to allocate register map: %d\n", ret); 323 + return ret; 324 + } 325 + 326 + /* Wait for Lochnagar to boot */ 327 + ret = lochnagar_wait_for_boot(lochnagar->regmap, &val); 328 + if (ret < 0) { 329 + dev_err(dev, "Failed to read device ID: %d\n", ret); 330 + return ret; 331 + } 332 + 333 + devid = val & LOCHNAGAR_DEVICE_ID_MASK; 334 + rev = val & LOCHNAGAR_REV_ID_MASK; 335 + 336 + if (devid != config->id) { 337 + dev_err(dev, 338 + "ID does not match %s (expected 0x%x got 0x%x)\n", 339 + config->name, config->id, devid); 340 + return -ENODEV; 341 + } 342 + 343 + /* Identify firmware */ 344 + ret = regmap_read(lochnagar->regmap, LOCHNAGAR_FIRMWARE_ID1, &val); 345 + if (ret < 0) { 346 + dev_err(dev, "Failed to read firmware id 1: %d\n", ret); 347 + return ret; 348 + } 349 + 350 + firmwareid = val; 351 + 352 + ret = regmap_read(lochnagar->regmap, LOCHNAGAR_FIRMWARE_ID2, &val); 353 + if (ret < 0) { 354 + dev_err(dev, "Failed to read firmware id 2: %d\n", ret); 355 + return ret; 356 + } 357 + 358 + firmwareid |= (val << config->regmap->val_bits); 359 + 360 + dev_info(dev, "Found %s (0x%x) revision %u firmware 0x%.6x\n", 361 + config->name, devid, rev + 1, firmwareid); 362 + 363 + ret = regmap_register_patch(lochnagar->regmap, config->patch, 364 + config->npatch); 365 + if (ret < 0) { 366 + dev_err(dev, "Failed to register patch: %d\n", ret); 367 + return ret; 368 + } 369 + 370 + ret = devm_of_platform_populate(dev); 371 + if (ret < 0) { 372 + dev_err(dev, "Failed to populate child nodes: %d\n", ret); 373 + return ret; 374 + } 375 + 376 + return ret; 377 + } 378 + 379 + static struct i2c_driver lochnagar_i2c_driver = { 380 + .driver = { 381 + .name = "lochnagar", 382 + .of_match_table = of_match_ptr(lochnagar_of_match), 383 + .suppress_bind_attrs = true, 384 + }, 385 + .probe_new = lochnagar_i2c_probe, 386 + }; 387 + 388 + static int __init lochnagar_i2c_init(void) 389 + { 390 + int ret; 391 + 392 + ret = i2c_add_driver(&lochnagar_i2c_driver); 393 + if (ret) 394 + pr_err("Failed to register Lochnagar driver: %d\n", ret); 395 + 396 + return ret; 397 + } 398 + subsys_initcall(lochnagar_i2c_init);
+55
include/linux/mfd/lochnagar.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Lochnagar internals 4 + * 5 + * Copyright (c) 2013-2018 Cirrus Logic, Inc. and 6 + * Cirrus Logic International Semiconductor Ltd. 7 + * 8 + * Author: Charles Keepax <ckeepax@opensource.cirrus.com> 9 + */ 10 + 11 + #include <linux/device.h> 12 + #include <linux/mutex.h> 13 + #include <linux/regmap.h> 14 + 15 + #ifndef CIRRUS_LOCHNAGAR_H 16 + #define CIRRUS_LOCHNAGAR_H 17 + 18 + enum lochnagar_type { 19 + LOCHNAGAR1, 20 + LOCHNAGAR2, 21 + }; 22 + 23 + /** 24 + * struct lochnagar - Core data for the Lochnagar audio board driver. 25 + * 26 + * @type: The type of Lochnagar device connected. 27 + * @dev: A pointer to the struct device for the main MFD. 28 + * @regmap: The devices main register map. 29 + * @analogue_config_lock: Lock used to protect updates in the analogue 30 + * configuration as these must not be changed whilst the hardware is processing 31 + * the last update. 32 + */ 33 + struct lochnagar { 34 + enum lochnagar_type type; 35 + struct device *dev; 36 + struct regmap *regmap; 37 + 38 + /* Lock to protect updates to the analogue configuration */ 39 + struct mutex analogue_config_lock; 40 + }; 41 + 42 + /* Register Addresses */ 43 + #define LOCHNAGAR_SOFTWARE_RESET 0x00 44 + #define LOCHNAGAR_FIRMWARE_ID1 0x01 45 + #define LOCHNAGAR_FIRMWARE_ID2 0x02 46 + 47 + /* (0x0000) Software Reset */ 48 + #define LOCHNAGAR_DEVICE_ID_MASK 0xFFFC 49 + #define LOCHNAGAR_DEVICE_ID_SHIFT 2 50 + #define LOCHNAGAR_REV_ID_MASK 0x0003 51 + #define LOCHNAGAR_REV_ID_SHIFT 0 52 + 53 + int lochnagar_update_config(struct lochnagar *lochnagar); 54 + 55 + #endif
+157
include/linux/mfd/lochnagar1_regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Lochnagar1 register definitions 4 + * 5 + * Copyright (c) 2017-2018 Cirrus Logic, Inc. and 6 + * Cirrus Logic International Semiconductor Ltd. 7 + * 8 + * Author: Charles Keepax <ckeepax@opensource.cirrus.com> 9 + */ 10 + 11 + #ifndef LOCHNAGAR1_REGISTERS_H 12 + #define LOCHNAGAR1_REGISTERS_H 13 + 14 + /* Register Addresses */ 15 + #define LOCHNAGAR1_CDC_AIF1_SEL 0x0008 16 + #define LOCHNAGAR1_CDC_AIF2_SEL 0x0009 17 + #define LOCHNAGAR1_CDC_AIF3_SEL 0x000A 18 + #define LOCHNAGAR1_CDC_MCLK1_SEL 0x000B 19 + #define LOCHNAGAR1_CDC_MCLK2_SEL 0x000C 20 + #define LOCHNAGAR1_CDC_AIF_CTRL1 0x000D 21 + #define LOCHNAGAR1_CDC_AIF_CTRL2 0x000E 22 + #define LOCHNAGAR1_EXT_AIF_CTRL 0x000F 23 + #define LOCHNAGAR1_DSP_AIF1_SEL 0x0010 24 + #define LOCHNAGAR1_DSP_AIF2_SEL 0x0011 25 + #define LOCHNAGAR1_DSP_CLKIN_SEL 0x0012 26 + #define LOCHNAGAR1_DSP_AIF 0x0013 27 + #define LOCHNAGAR1_GF_AIF1 0x0014 28 + #define LOCHNAGAR1_GF_AIF2 0x0015 29 + #define LOCHNAGAR1_PSIA_AIF 0x0016 30 + #define LOCHNAGAR1_PSIA1_SEL 0x0017 31 + #define LOCHNAGAR1_PSIA2_SEL 0x0018 32 + #define LOCHNAGAR1_SPDIF_AIF_SEL 0x0019 33 + #define LOCHNAGAR1_GF_AIF3_SEL 0x001C 34 + #define LOCHNAGAR1_GF_AIF4_SEL 0x001D 35 + #define LOCHNAGAR1_GF_CLKOUT1_SEL 0x001E 36 + #define LOCHNAGAR1_GF_AIF1_SEL 0x001F 37 + #define LOCHNAGAR1_GF_AIF2_SEL 0x0020 38 + #define LOCHNAGAR1_GF_GPIO2 0x0026 39 + #define LOCHNAGAR1_GF_GPIO3 0x0027 40 + #define LOCHNAGAR1_GF_GPIO7 0x0028 41 + #define LOCHNAGAR1_RST 0x0029 42 + #define LOCHNAGAR1_LED1 0x002A 43 + #define LOCHNAGAR1_LED2 0x002B 44 + #define LOCHNAGAR1_I2C_CTRL 0x0046 45 + 46 + /* 47 + * (0x0008 - 0x000C, 0x0010 - 0x0012, 0x0017 - 0x0020) 48 + * CDC_AIF1_SEL - GF_AIF2_SEL 49 + */ 50 + #define LOCHNAGAR1_SRC_MASK 0xFF 51 + #define LOCHNAGAR1_SRC_SHIFT 0 52 + 53 + /* (0x000D) CDC_AIF_CTRL1 */ 54 + #define LOCHNAGAR1_CDC_AIF2_LRCLK_DIR_MASK 0x40 55 + #define LOCHNAGAR1_CDC_AIF2_LRCLK_DIR_SHIFT 6 56 + #define LOCHNAGAR1_CDC_AIF2_BCLK_DIR_MASK 0x20 57 + #define LOCHNAGAR1_CDC_AIF2_BCLK_DIR_SHIFT 5 58 + #define LOCHNAGAR1_CDC_AIF2_ENA_MASK 0x10 59 + #define LOCHNAGAR1_CDC_AIF2_ENA_SHIFT 4 60 + #define LOCHNAGAR1_CDC_AIF1_LRCLK_DIR_MASK 0x04 61 + #define LOCHNAGAR1_CDC_AIF1_LRCLK_DIR_SHIFT 2 62 + #define LOCHNAGAR1_CDC_AIF1_BCLK_DIR_MASK 0x02 63 + #define LOCHNAGAR1_CDC_AIF1_BCLK_DIR_SHIFT 1 64 + #define LOCHNAGAR1_CDC_AIF1_ENA_MASK 0x01 65 + #define LOCHNAGAR1_CDC_AIF1_ENA_SHIFT 0 66 + 67 + /* (0x000E) CDC_AIF_CTRL2 */ 68 + #define LOCHNAGAR1_CDC_AIF3_LRCLK_DIR_MASK 0x40 69 + #define LOCHNAGAR1_CDC_AIF3_LRCLK_DIR_SHIFT 6 70 + #define LOCHNAGAR1_CDC_AIF3_BCLK_DIR_MASK 0x20 71 + #define LOCHNAGAR1_CDC_AIF3_BCLK_DIR_SHIFT 5 72 + #define LOCHNAGAR1_CDC_AIF3_ENA_MASK 0x10 73 + #define LOCHNAGAR1_CDC_AIF3_ENA_SHIFT 4 74 + #define LOCHNAGAR1_CDC_MCLK1_ENA_MASK 0x02 75 + #define LOCHNAGAR1_CDC_MCLK1_ENA_SHIFT 1 76 + #define LOCHNAGAR1_CDC_MCLK2_ENA_MASK 0x01 77 + #define LOCHNAGAR1_CDC_MCLK2_ENA_SHIFT 0 78 + 79 + /* (0x000F) EXT_AIF_CTRL */ 80 + #define LOCHNAGAR1_SPDIF_AIF_LRCLK_DIR_MASK 0x20 81 + #define LOCHNAGAR1_SPDIF_AIF_LRCLK_DIR_SHIFT 5 82 + #define LOCHNAGAR1_SPDIF_AIF_BCLK_DIR_MASK 0x10 83 + #define LOCHNAGAR1_SPDIF_AIF_BCLK_DIR_SHIFT 4 84 + #define LOCHNAGAR1_SPDIF_AIF_ENA_MASK 0x08 85 + #define LOCHNAGAR1_SPDIF_AIF_ENA_SHIFT 3 86 + 87 + /* (0x0013) DSP_AIF */ 88 + #define LOCHNAGAR1_DSP_AIF2_LRCLK_DIR_MASK 0x40 89 + #define LOCHNAGAR1_DSP_AIF2_LRCLK_DIR_SHIFT 6 90 + #define LOCHNAGAR1_DSP_AIF2_BCLK_DIR_MASK 0x20 91 + #define LOCHNAGAR1_DSP_AIF2_BCLK_DIR_SHIFT 5 92 + #define LOCHNAGAR1_DSP_AIF2_ENA_MASK 0x10 93 + #define LOCHNAGAR1_DSP_AIF2_ENA_SHIFT 4 94 + #define LOCHNAGAR1_DSP_CLKIN_ENA_MASK 0x08 95 + #define LOCHNAGAR1_DSP_CLKIN_ENA_SHIFT 3 96 + #define LOCHNAGAR1_DSP_AIF1_LRCLK_DIR_MASK 0x04 97 + #define LOCHNAGAR1_DSP_AIF1_LRCLK_DIR_SHIFT 2 98 + #define LOCHNAGAR1_DSP_AIF1_BCLK_DIR_MASK 0x02 99 + #define LOCHNAGAR1_DSP_AIF1_BCLK_DIR_SHIFT 1 100 + #define LOCHNAGAR1_DSP_AIF1_ENA_MASK 0x01 101 + #define LOCHNAGAR1_DSP_AIF1_ENA_SHIFT 0 102 + 103 + /* (0x0014) GF_AIF1 */ 104 + #define LOCHNAGAR1_GF_CLKOUT1_ENA_MASK 0x40 105 + #define LOCHNAGAR1_GF_CLKOUT1_ENA_SHIFT 6 106 + #define LOCHNAGAR1_GF_AIF3_LRCLK_DIR_MASK 0x20 107 + #define LOCHNAGAR1_GF_AIF3_LRCLK_DIR_SHIFT 5 108 + #define LOCHNAGAR1_GF_AIF3_BCLK_DIR_MASK 0x10 109 + #define LOCHNAGAR1_GF_AIF3_BCLK_DIR_SHIFT 4 110 + #define LOCHNAGAR1_GF_AIF3_ENA_MASK 0x08 111 + #define LOCHNAGAR1_GF_AIF3_ENA_SHIFT 3 112 + #define LOCHNAGAR1_GF_AIF1_LRCLK_DIR_MASK 0x04 113 + #define LOCHNAGAR1_GF_AIF1_LRCLK_DIR_SHIFT 2 114 + #define LOCHNAGAR1_GF_AIF1_BCLK_DIR_MASK 0x02 115 + #define LOCHNAGAR1_GF_AIF1_BCLK_DIR_SHIFT 1 116 + #define LOCHNAGAR1_GF_AIF1_ENA_MASK 0x01 117 + #define LOCHNAGAR1_GF_AIF1_ENA_SHIFT 0 118 + 119 + /* (0x0015) GF_AIF2 */ 120 + #define LOCHNAGAR1_GF_AIF4_LRCLK_DIR_MASK 0x20 121 + #define LOCHNAGAR1_GF_AIF4_LRCLK_DIR_SHIFT 5 122 + #define LOCHNAGAR1_GF_AIF4_BCLK_DIR_MASK 0x10 123 + #define LOCHNAGAR1_GF_AIF4_BCLK_DIR_SHIFT 4 124 + #define LOCHNAGAR1_GF_AIF4_ENA_MASK 0x08 125 + #define LOCHNAGAR1_GF_AIF4_ENA_SHIFT 3 126 + #define LOCHNAGAR1_GF_AIF2_LRCLK_DIR_MASK 0x04 127 + #define LOCHNAGAR1_GF_AIF2_LRCLK_DIR_SHIFT 2 128 + #define LOCHNAGAR1_GF_AIF2_BCLK_DIR_MASK 0x02 129 + #define LOCHNAGAR1_GF_AIF2_BCLK_DIR_SHIFT 1 130 + #define LOCHNAGAR1_GF_AIF2_ENA_MASK 0x01 131 + #define LOCHNAGAR1_GF_AIF2_ENA_SHIFT 0 132 + 133 + /* (0x0016) PSIA_AIF */ 134 + #define LOCHNAGAR1_PSIA2_LRCLK_DIR_MASK 0x40 135 + #define LOCHNAGAR1_PSIA2_LRCLK_DIR_SHIFT 6 136 + #define LOCHNAGAR1_PSIA2_BCLK_DIR_MASK 0x20 137 + #define LOCHNAGAR1_PSIA2_BCLK_DIR_SHIFT 5 138 + #define LOCHNAGAR1_PSIA2_ENA_MASK 0x10 139 + #define LOCHNAGAR1_PSIA2_ENA_SHIFT 4 140 + #define LOCHNAGAR1_PSIA1_LRCLK_DIR_MASK 0x04 141 + #define LOCHNAGAR1_PSIA1_LRCLK_DIR_SHIFT 2 142 + #define LOCHNAGAR1_PSIA1_BCLK_DIR_MASK 0x02 143 + #define LOCHNAGAR1_PSIA1_BCLK_DIR_SHIFT 1 144 + #define LOCHNAGAR1_PSIA1_ENA_MASK 0x01 145 + #define LOCHNAGAR1_PSIA1_ENA_SHIFT 0 146 + 147 + /* (0x0029) RST */ 148 + #define LOCHNAGAR1_DSP_RESET_MASK 0x02 149 + #define LOCHNAGAR1_DSP_RESET_SHIFT 1 150 + #define LOCHNAGAR1_CDC_RESET_MASK 0x01 151 + #define LOCHNAGAR1_CDC_RESET_SHIFT 0 152 + 153 + /* (0x0046) I2C_CTRL */ 154 + #define LOCHNAGAR1_CDC_CIF_MODE_MASK 0x01 155 + #define LOCHNAGAR1_CDC_CIF_MODE_SHIFT 0 156 + 157 + #endif
+291
include/linux/mfd/lochnagar2_regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Lochnagar2 register definitions 4 + * 5 + * Copyright (c) 2017-2018 Cirrus Logic, Inc. and 6 + * Cirrus Logic International Semiconductor Ltd. 7 + * 8 + * Author: Charles Keepax <ckeepax@opensource.cirrus.com> 9 + */ 10 + 11 + #ifndef LOCHNAGAR2_REGISTERS_H 12 + #define LOCHNAGAR2_REGISTERS_H 13 + 14 + /* Register Addresses */ 15 + #define LOCHNAGAR2_CDC_AIF1_CTRL 0x000D 16 + #define LOCHNAGAR2_CDC_AIF2_CTRL 0x000E 17 + #define LOCHNAGAR2_CDC_AIF3_CTRL 0x000F 18 + #define LOCHNAGAR2_DSP_AIF1_CTRL 0x0010 19 + #define LOCHNAGAR2_DSP_AIF2_CTRL 0x0011 20 + #define LOCHNAGAR2_PSIA1_CTRL 0x0012 21 + #define LOCHNAGAR2_PSIA2_CTRL 0x0013 22 + #define LOCHNAGAR2_GF_AIF3_CTRL 0x0014 23 + #define LOCHNAGAR2_GF_AIF4_CTRL 0x0015 24 + #define LOCHNAGAR2_GF_AIF1_CTRL 0x0016 25 + #define LOCHNAGAR2_GF_AIF2_CTRL 0x0017 26 + #define LOCHNAGAR2_SPDIF_AIF_CTRL 0x0018 27 + #define LOCHNAGAR2_USB_AIF1_CTRL 0x0019 28 + #define LOCHNAGAR2_USB_AIF2_CTRL 0x001A 29 + #define LOCHNAGAR2_ADAT_AIF_CTRL 0x001B 30 + #define LOCHNAGAR2_CDC_MCLK1_CTRL 0x001E 31 + #define LOCHNAGAR2_CDC_MCLK2_CTRL 0x001F 32 + #define LOCHNAGAR2_DSP_CLKIN_CTRL 0x0020 33 + #define LOCHNAGAR2_PSIA1_MCLK_CTRL 0x0021 34 + #define LOCHNAGAR2_PSIA2_MCLK_CTRL 0x0022 35 + #define LOCHNAGAR2_SPDIF_MCLK_CTRL 0x0023 36 + #define LOCHNAGAR2_GF_CLKOUT1_CTRL 0x0024 37 + #define LOCHNAGAR2_GF_CLKOUT2_CTRL 0x0025 38 + #define LOCHNAGAR2_ADAT_MCLK_CTRL 0x0026 39 + #define LOCHNAGAR2_SOUNDCARD_MCLK_CTRL 0x0027 40 + #define LOCHNAGAR2_GPIO_FPGA_GPIO1 0x0031 41 + #define LOCHNAGAR2_GPIO_FPGA_GPIO2 0x0032 42 + #define LOCHNAGAR2_GPIO_FPGA_GPIO3 0x0033 43 + #define LOCHNAGAR2_GPIO_FPGA_GPIO4 0x0034 44 + #define LOCHNAGAR2_GPIO_FPGA_GPIO5 0x0035 45 + #define LOCHNAGAR2_GPIO_FPGA_GPIO6 0x0036 46 + #define LOCHNAGAR2_GPIO_CDC_GPIO1 0x0037 47 + #define LOCHNAGAR2_GPIO_CDC_GPIO2 0x0038 48 + #define LOCHNAGAR2_GPIO_CDC_GPIO3 0x0039 49 + #define LOCHNAGAR2_GPIO_CDC_GPIO4 0x003A 50 + #define LOCHNAGAR2_GPIO_CDC_GPIO5 0x003B 51 + #define LOCHNAGAR2_GPIO_CDC_GPIO6 0x003C 52 + #define LOCHNAGAR2_GPIO_CDC_GPIO7 0x003D 53 + #define LOCHNAGAR2_GPIO_CDC_GPIO8 0x003E 54 + #define LOCHNAGAR2_GPIO_DSP_GPIO1 0x003F 55 + #define LOCHNAGAR2_GPIO_DSP_GPIO2 0x0040 56 + #define LOCHNAGAR2_GPIO_DSP_GPIO3 0x0041 57 + #define LOCHNAGAR2_GPIO_DSP_GPIO4 0x0042 58 + #define LOCHNAGAR2_GPIO_DSP_GPIO5 0x0043 59 + #define LOCHNAGAR2_GPIO_DSP_GPIO6 0x0044 60 + #define LOCHNAGAR2_GPIO_GF_GPIO2 0x0045 61 + #define LOCHNAGAR2_GPIO_GF_GPIO3 0x0046 62 + #define LOCHNAGAR2_GPIO_GF_GPIO7 0x0047 63 + #define LOCHNAGAR2_GPIO_CDC_AIF1_BCLK 0x0048 64 + #define LOCHNAGAR2_GPIO_CDC_AIF1_RXDAT 0x0049 65 + #define LOCHNAGAR2_GPIO_CDC_AIF1_LRCLK 0x004A 66 + #define LOCHNAGAR2_GPIO_CDC_AIF1_TXDAT 0x004B 67 + #define LOCHNAGAR2_GPIO_CDC_AIF2_BCLK 0x004C 68 + #define LOCHNAGAR2_GPIO_CDC_AIF2_RXDAT 0x004D 69 + #define LOCHNAGAR2_GPIO_CDC_AIF2_LRCLK 0x004E 70 + #define LOCHNAGAR2_GPIO_CDC_AIF2_TXDAT 0x004F 71 + #define LOCHNAGAR2_GPIO_CDC_AIF3_BCLK 0x0050 72 + #define LOCHNAGAR2_GPIO_CDC_AIF3_RXDAT 0x0051 73 + #define LOCHNAGAR2_GPIO_CDC_AIF3_LRCLK 0x0052 74 + #define LOCHNAGAR2_GPIO_CDC_AIF3_TXDAT 0x0053 75 + #define LOCHNAGAR2_GPIO_DSP_AIF1_BCLK 0x0054 76 + #define LOCHNAGAR2_GPIO_DSP_AIF1_RXDAT 0x0055 77 + #define LOCHNAGAR2_GPIO_DSP_AIF1_LRCLK 0x0056 78 + #define LOCHNAGAR2_GPIO_DSP_AIF1_TXDAT 0x0057 79 + #define LOCHNAGAR2_GPIO_DSP_AIF2_BCLK 0x0058 80 + #define LOCHNAGAR2_GPIO_DSP_AIF2_RXDAT 0x0059 81 + #define LOCHNAGAR2_GPIO_DSP_AIF2_LRCLK 0x005A 82 + #define LOCHNAGAR2_GPIO_DSP_AIF2_TXDAT 0x005B 83 + #define LOCHNAGAR2_GPIO_PSIA1_BCLK 0x005C 84 + #define LOCHNAGAR2_GPIO_PSIA1_RXDAT 0x005D 85 + #define LOCHNAGAR2_GPIO_PSIA1_LRCLK 0x005E 86 + #define LOCHNAGAR2_GPIO_PSIA1_TXDAT 0x005F 87 + #define LOCHNAGAR2_GPIO_PSIA2_BCLK 0x0060 88 + #define LOCHNAGAR2_GPIO_PSIA2_RXDAT 0x0061 89 + #define LOCHNAGAR2_GPIO_PSIA2_LRCLK 0x0062 90 + #define LOCHNAGAR2_GPIO_PSIA2_TXDAT 0x0063 91 + #define LOCHNAGAR2_GPIO_GF_AIF3_BCLK 0x0064 92 + #define LOCHNAGAR2_GPIO_GF_AIF3_RXDAT 0x0065 93 + #define LOCHNAGAR2_GPIO_GF_AIF3_LRCLK 0x0066 94 + #define LOCHNAGAR2_GPIO_GF_AIF3_TXDAT 0x0067 95 + #define LOCHNAGAR2_GPIO_GF_AIF4_BCLK 0x0068 96 + #define LOCHNAGAR2_GPIO_GF_AIF4_RXDAT 0x0069 97 + #define LOCHNAGAR2_GPIO_GF_AIF4_LRCLK 0x006A 98 + #define LOCHNAGAR2_GPIO_GF_AIF4_TXDAT 0x006B 99 + #define LOCHNAGAR2_GPIO_GF_AIF1_BCLK 0x006C 100 + #define LOCHNAGAR2_GPIO_GF_AIF1_RXDAT 0x006D 101 + #define LOCHNAGAR2_GPIO_GF_AIF1_LRCLK 0x006E 102 + #define LOCHNAGAR2_GPIO_GF_AIF1_TXDAT 0x006F 103 + #define LOCHNAGAR2_GPIO_GF_AIF2_BCLK 0x0070 104 + #define LOCHNAGAR2_GPIO_GF_AIF2_RXDAT 0x0071 105 + #define LOCHNAGAR2_GPIO_GF_AIF2_LRCLK 0x0072 106 + #define LOCHNAGAR2_GPIO_GF_AIF2_TXDAT 0x0073 107 + #define LOCHNAGAR2_GPIO_DSP_UART1_RX 0x0074 108 + #define LOCHNAGAR2_GPIO_DSP_UART1_TX 0x0075 109 + #define LOCHNAGAR2_GPIO_DSP_UART2_RX 0x0076 110 + #define LOCHNAGAR2_GPIO_DSP_UART2_TX 0x0077 111 + #define LOCHNAGAR2_GPIO_GF_UART2_RX 0x0078 112 + #define LOCHNAGAR2_GPIO_GF_UART2_TX 0x0079 113 + #define LOCHNAGAR2_GPIO_USB_UART_RX 0x007A 114 + #define LOCHNAGAR2_GPIO_CDC_PDMCLK1 0x007C 115 + #define LOCHNAGAR2_GPIO_CDC_PDMDAT1 0x007D 116 + #define LOCHNAGAR2_GPIO_CDC_PDMCLK2 0x007E 117 + #define LOCHNAGAR2_GPIO_CDC_PDMDAT2 0x007F 118 + #define LOCHNAGAR2_GPIO_CDC_DMICCLK1 0x0080 119 + #define LOCHNAGAR2_GPIO_CDC_DMICDAT1 0x0081 120 + #define LOCHNAGAR2_GPIO_CDC_DMICCLK2 0x0082 121 + #define LOCHNAGAR2_GPIO_CDC_DMICDAT2 0x0083 122 + #define LOCHNAGAR2_GPIO_CDC_DMICCLK3 0x0084 123 + #define LOCHNAGAR2_GPIO_CDC_DMICDAT3 0x0085 124 + #define LOCHNAGAR2_GPIO_CDC_DMICCLK4 0x0086 125 + #define LOCHNAGAR2_GPIO_CDC_DMICDAT4 0x0087 126 + #define LOCHNAGAR2_GPIO_DSP_DMICCLK1 0x0088 127 + #define LOCHNAGAR2_GPIO_DSP_DMICDAT1 0x0089 128 + #define LOCHNAGAR2_GPIO_DSP_DMICCLK2 0x008A 129 + #define LOCHNAGAR2_GPIO_DSP_DMICDAT2 0x008B 130 + #define LOCHNAGAR2_GPIO_I2C2_SCL 0x008C 131 + #define LOCHNAGAR2_GPIO_I2C2_SDA 0x008D 132 + #define LOCHNAGAR2_GPIO_I2C3_SCL 0x008E 133 + #define LOCHNAGAR2_GPIO_I2C3_SDA 0x008F 134 + #define LOCHNAGAR2_GPIO_I2C4_SCL 0x0090 135 + #define LOCHNAGAR2_GPIO_I2C4_SDA 0x0091 136 + #define LOCHNAGAR2_GPIO_DSP_STANDBY 0x0092 137 + #define LOCHNAGAR2_GPIO_CDC_MCLK1 0x0093 138 + #define LOCHNAGAR2_GPIO_CDC_MCLK2 0x0094 139 + #define LOCHNAGAR2_GPIO_DSP_CLKIN 0x0095 140 + #define LOCHNAGAR2_GPIO_PSIA1_MCLK 0x0096 141 + #define LOCHNAGAR2_GPIO_PSIA2_MCLK 0x0097 142 + #define LOCHNAGAR2_GPIO_GF_GPIO1 0x0098 143 + #define LOCHNAGAR2_GPIO_GF_GPIO5 0x0099 144 + #define LOCHNAGAR2_GPIO_DSP_GPIO20 0x009A 145 + #define LOCHNAGAR2_GPIO_CHANNEL1 0x00B9 146 + #define LOCHNAGAR2_GPIO_CHANNEL2 0x00BA 147 + #define LOCHNAGAR2_GPIO_CHANNEL3 0x00BB 148 + #define LOCHNAGAR2_GPIO_CHANNEL4 0x00BC 149 + #define LOCHNAGAR2_GPIO_CHANNEL5 0x00BD 150 + #define LOCHNAGAR2_GPIO_CHANNEL6 0x00BE 151 + #define LOCHNAGAR2_GPIO_CHANNEL7 0x00BF 152 + #define LOCHNAGAR2_GPIO_CHANNEL8 0x00C0 153 + #define LOCHNAGAR2_GPIO_CHANNEL9 0x00C1 154 + #define LOCHNAGAR2_GPIO_CHANNEL10 0x00C2 155 + #define LOCHNAGAR2_GPIO_CHANNEL11 0x00C3 156 + #define LOCHNAGAR2_GPIO_CHANNEL12 0x00C4 157 + #define LOCHNAGAR2_GPIO_CHANNEL13 0x00C5 158 + #define LOCHNAGAR2_GPIO_CHANNEL14 0x00C6 159 + #define LOCHNAGAR2_GPIO_CHANNEL15 0x00C7 160 + #define LOCHNAGAR2_GPIO_CHANNEL16 0x00C8 161 + #define LOCHNAGAR2_MINICARD_RESETS 0x00DF 162 + #define LOCHNAGAR2_ANALOGUE_PATH_CTRL1 0x00E3 163 + #define LOCHNAGAR2_ANALOGUE_PATH_CTRL2 0x00E4 164 + #define LOCHNAGAR2_COMMS_CTRL4 0x00F0 165 + #define LOCHNAGAR2_SPDIF_CTRL 0x00FE 166 + #define LOCHNAGAR2_IMON_CTRL1 0x0108 167 + #define LOCHNAGAR2_IMON_CTRL2 0x0109 168 + #define LOCHNAGAR2_IMON_CTRL3 0x010A 169 + #define LOCHNAGAR2_IMON_CTRL4 0x010B 170 + #define LOCHNAGAR2_IMON_DATA1 0x010C 171 + #define LOCHNAGAR2_IMON_DATA2 0x010D 172 + #define LOCHNAGAR2_POWER_CTRL 0x0116 173 + #define LOCHNAGAR2_MICVDD_CTRL1 0x0119 174 + #define LOCHNAGAR2_MICVDD_CTRL2 0x011B 175 + #define LOCHNAGAR2_VDDCORE_CDC_CTRL1 0x011E 176 + #define LOCHNAGAR2_VDDCORE_CDC_CTRL2 0x0120 177 + #define LOCHNAGAR2_SOUNDCARD_AIF_CTRL 0x0180 178 + 179 + /* (0x000D-0x001B, 0x0180) CDC_AIF1_CTRL - SOUNCARD_AIF_CTRL */ 180 + #define LOCHNAGAR2_AIF_ENA_MASK 0x8000 181 + #define LOCHNAGAR2_AIF_ENA_SHIFT 15 182 + #define LOCHNAGAR2_AIF_LRCLK_DIR_MASK 0x4000 183 + #define LOCHNAGAR2_AIF_LRCLK_DIR_SHIFT 14 184 + #define LOCHNAGAR2_AIF_BCLK_DIR_MASK 0x2000 185 + #define LOCHNAGAR2_AIF_BCLK_DIR_SHIFT 13 186 + #define LOCHNAGAR2_AIF_SRC_MASK 0x00FF 187 + #define LOCHNAGAR2_AIF_SRC_SHIFT 0 188 + 189 + /* (0x001E - 0x0027) CDC_MCLK1_CTRL - SOUNDCARD_MCLK_CTRL */ 190 + #define LOCHNAGAR2_CLK_ENA_MASK 0x8000 191 + #define LOCHNAGAR2_CLK_ENA_SHIFT 15 192 + #define LOCHNAGAR2_CLK_SRC_MASK 0x00FF 193 + #define LOCHNAGAR2_CLK_SRC_SHIFT 0 194 + 195 + /* (0x0031 - 0x009A) GPIO_FPGA_GPIO1 - GPIO_DSP_GPIO20 */ 196 + #define LOCHNAGAR2_GPIO_SRC_MASK 0x00FF 197 + #define LOCHNAGAR2_GPIO_SRC_SHIFT 0 198 + 199 + /* (0x00B9 - 0x00C8) GPIO_CHANNEL1 - GPIO_CHANNEL16 */ 200 + #define LOCHNAGAR2_GPIO_CHANNEL_STS_MASK 0x8000 201 + #define LOCHNAGAR2_GPIO_CHANNEL_STS_SHIFT 15 202 + #define LOCHNAGAR2_GPIO_CHANNEL_SRC_MASK 0x00FF 203 + #define LOCHNAGAR2_GPIO_CHANNEL_SRC_SHIFT 0 204 + 205 + /* (0x00DF) MINICARD_RESETS */ 206 + #define LOCHNAGAR2_DSP_RESET_MASK 0x0002 207 + #define LOCHNAGAR2_DSP_RESET_SHIFT 1 208 + #define LOCHNAGAR2_CDC_RESET_MASK 0x0001 209 + #define LOCHNAGAR2_CDC_RESET_SHIFT 0 210 + 211 + /* (0x00E3) ANALOGUE_PATH_CTRL1 */ 212 + #define LOCHNAGAR2_ANALOGUE_PATH_UPDATE_MASK 0x8000 213 + #define LOCHNAGAR2_ANALOGUE_PATH_UPDATE_SHIFT 15 214 + #define LOCHNAGAR2_ANALOGUE_PATH_UPDATE_STS_MASK 0x4000 215 + #define LOCHNAGAR2_ANALOGUE_PATH_UPDATE_STS_SHIFT 14 216 + 217 + /* (0x00E4) ANALOGUE_PATH_CTRL2 */ 218 + #define LOCHNAGAR2_P2_INPUT_BIAS_ENA_MASK 0x0080 219 + #define LOCHNAGAR2_P2_INPUT_BIAS_ENA_SHIFT 7 220 + #define LOCHNAGAR2_P1_INPUT_BIAS_ENA_MASK 0x0040 221 + #define LOCHNAGAR2_P1_INPUT_BIAS_ENA_SHIFT 6 222 + #define LOCHNAGAR2_P2_MICBIAS_SRC_MASK 0x0038 223 + #define LOCHNAGAR2_P2_MICBIAS_SRC_SHIFT 3 224 + #define LOCHNAGAR2_P1_MICBIAS_SRC_MASK 0x0007 225 + #define LOCHNAGAR2_P1_MICBIAS_SRC_SHIFT 0 226 + 227 + /* (0x00F0) COMMS_CTRL4 */ 228 + #define LOCHNAGAR2_CDC_CIF1MODE_MASK 0x0001 229 + #define LOCHNAGAR2_CDC_CIF1MODE_SHIFT 0 230 + 231 + /* (0x00FE) SPDIF_CTRL */ 232 + #define LOCHNAGAR2_SPDIF_HWMODE_MASK 0x0008 233 + #define LOCHNAGAR2_SPDIF_HWMODE_SHIFT 3 234 + #define LOCHNAGAR2_SPDIF_RESET_MASK 0x0001 235 + #define LOCHNAGAR2_SPDIF_RESET_SHIFT 0 236 + 237 + /* (0x0108) IMON_CTRL1 */ 238 + #define LOCHNAGAR2_IMON_ENA_MASK 0x8000 239 + #define LOCHNAGAR2_IMON_ENA_SHIFT 15 240 + #define LOCHNAGAR2_IMON_MEASURED_CHANNELS_MASK 0x03FC 241 + #define LOCHNAGAR2_IMON_MEASURED_CHANNELS_SHIFT 2 242 + #define LOCHNAGAR2_IMON_MODE_SEL_MASK 0x0003 243 + #define LOCHNAGAR2_IMON_MODE_SEL_SHIFT 0 244 + 245 + /* (0x0109) IMON_CTRL2 */ 246 + #define LOCHNAGAR2_IMON_FSR_MASK 0x03FF 247 + #define LOCHNAGAR2_IMON_FSR_SHIFT 0 248 + 249 + /* (0x010A) IMON_CTRL3 */ 250 + #define LOCHNAGAR2_IMON_DONE_MASK 0x0004 251 + #define LOCHNAGAR2_IMON_DONE_SHIFT 2 252 + #define LOCHNAGAR2_IMON_CONFIGURE_MASK 0x0002 253 + #define LOCHNAGAR2_IMON_CONFIGURE_SHIFT 1 254 + #define LOCHNAGAR2_IMON_MEASURE_MASK 0x0001 255 + #define LOCHNAGAR2_IMON_MEASURE_SHIFT 0 256 + 257 + /* (0x010B) IMON_CTRL4 */ 258 + #define LOCHNAGAR2_IMON_DATA_REQ_MASK 0x0080 259 + #define LOCHNAGAR2_IMON_DATA_REQ_SHIFT 7 260 + #define LOCHNAGAR2_IMON_CH_SEL_MASK 0x0070 261 + #define LOCHNAGAR2_IMON_CH_SEL_SHIFT 4 262 + #define LOCHNAGAR2_IMON_DATA_RDY_MASK 0x0008 263 + #define LOCHNAGAR2_IMON_DATA_RDY_SHIFT 3 264 + #define LOCHNAGAR2_IMON_CH_SRC_MASK 0x0007 265 + #define LOCHNAGAR2_IMON_CH_SRC_SHIFT 0 266 + 267 + /* (0x010C, 0x010D) IMON_DATA1, IMON_DATA2 */ 268 + #define LOCHNAGAR2_IMON_DATA_MASK 0xFFFF 269 + #define LOCHNAGAR2_IMON_DATA_SHIFT 0 270 + 271 + /* (0x0116) POWER_CTRL */ 272 + #define LOCHNAGAR2_PWR_ENA_MASK 0x0001 273 + #define LOCHNAGAR2_PWR_ENA_SHIFT 0 274 + 275 + /* (0x0119) MICVDD_CTRL1 */ 276 + #define LOCHNAGAR2_MICVDD_REG_ENA_MASK 0x8000 277 + #define LOCHNAGAR2_MICVDD_REG_ENA_SHIFT 15 278 + 279 + /* (0x011B) MICVDD_CTRL2 */ 280 + #define LOCHNAGAR2_MICVDD_VSEL_MASK 0x001F 281 + #define LOCHNAGAR2_MICVDD_VSEL_SHIFT 0 282 + 283 + /* (0x011E) VDDCORE_CDC_CTRL1 */ 284 + #define LOCHNAGAR2_VDDCORE_CDC_REG_ENA_MASK 0x8000 285 + #define LOCHNAGAR2_VDDCORE_CDC_REG_ENA_SHIFT 15 286 + 287 + /* (0x0120) VDDCORE_CDC_CTRL2 */ 288 + #define LOCHNAGAR2_VDDCORE_CDC_VSEL_MASK 0x007F 289 + #define LOCHNAGAR2_VDDCORE_CDC_VSEL_SHIFT 0 290 + 291 + #endif