cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

da903x.c (13208B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Base driver for Dialog Semiconductor DA9030/DA9034
      4 *
      5 * Copyright (C) 2008 Compulab, Ltd.
      6 *	Mike Rapoport <mike@compulab.co.il>
      7 *
      8 * Copyright (C) 2006-2008 Marvell International Ltd.
      9 *	Eric Miao <eric.miao@marvell.com>
     10 */
     11
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/interrupt.h>
     15#include <linux/platform_device.h>
     16#include <linux/i2c.h>
     17#include <linux/mfd/da903x.h>
     18#include <linux/slab.h>
     19
     20#define DA9030_CHIP_ID		0x00
     21#define DA9030_EVENT_A		0x01
     22#define DA9030_EVENT_B		0x02
     23#define DA9030_EVENT_C		0x03
     24#define DA9030_STATUS		0x04
     25#define DA9030_IRQ_MASK_A	0x05
     26#define DA9030_IRQ_MASK_B	0x06
     27#define DA9030_IRQ_MASK_C	0x07
     28#define DA9030_SYS_CTRL_A	0x08
     29#define DA9030_SYS_CTRL_B	0x09
     30#define DA9030_FAULT_LOG	0x0a
     31
     32#define DA9034_CHIP_ID		0x00
     33#define DA9034_EVENT_A		0x01
     34#define DA9034_EVENT_B		0x02
     35#define DA9034_EVENT_C		0x03
     36#define DA9034_EVENT_D		0x04
     37#define DA9034_STATUS_A		0x05
     38#define DA9034_STATUS_B		0x06
     39#define DA9034_IRQ_MASK_A	0x07
     40#define DA9034_IRQ_MASK_B	0x08
     41#define DA9034_IRQ_MASK_C	0x09
     42#define DA9034_IRQ_MASK_D	0x0a
     43#define DA9034_SYS_CTRL_A	0x0b
     44#define DA9034_SYS_CTRL_B	0x0c
     45#define DA9034_FAULT_LOG	0x0d
     46
     47struct da903x_chip;
     48
     49struct da903x_chip_ops {
     50	int	(*init_chip)(struct da903x_chip *);
     51	int	(*unmask_events)(struct da903x_chip *, unsigned int events);
     52	int	(*mask_events)(struct da903x_chip *, unsigned int events);
     53	int	(*read_events)(struct da903x_chip *, unsigned int *events);
     54	int	(*read_status)(struct da903x_chip *, unsigned int *status);
     55};
     56
     57struct da903x_chip {
     58	struct i2c_client	*client;
     59	struct device		*dev;
     60	const struct da903x_chip_ops *ops;
     61
     62	int			type;
     63	uint32_t		events_mask;
     64
     65	struct mutex		lock;
     66	struct work_struct	irq_work;
     67
     68	struct blocking_notifier_head notifier_list;
     69};
     70
     71static inline int __da903x_read(struct i2c_client *client,
     72				int reg, uint8_t *val)
     73{
     74	int ret;
     75
     76	ret = i2c_smbus_read_byte_data(client, reg);
     77	if (ret < 0) {
     78		dev_err(&client->dev, "failed reading at 0x%02x\n", reg);
     79		return ret;
     80	}
     81
     82	*val = (uint8_t)ret;
     83	return 0;
     84}
     85
     86static inline int __da903x_reads(struct i2c_client *client, int reg,
     87				 int len, uint8_t *val)
     88{
     89	int ret;
     90
     91	ret = i2c_smbus_read_i2c_block_data(client, reg, len, val);
     92	if (ret < 0) {
     93		dev_err(&client->dev, "failed reading from 0x%02x\n", reg);
     94		return ret;
     95	}
     96	return 0;
     97}
     98
     99static inline int __da903x_write(struct i2c_client *client,
    100				 int reg, uint8_t val)
    101{
    102	int ret;
    103
    104	ret = i2c_smbus_write_byte_data(client, reg, val);
    105	if (ret < 0) {
    106		dev_err(&client->dev, "failed writing 0x%02x to 0x%02x\n",
    107				val, reg);
    108		return ret;
    109	}
    110	return 0;
    111}
    112
    113static inline int __da903x_writes(struct i2c_client *client, int reg,
    114				  int len, uint8_t *val)
    115{
    116	int ret;
    117
    118	ret = i2c_smbus_write_i2c_block_data(client, reg, len, val);
    119	if (ret < 0) {
    120		dev_err(&client->dev, "failed writings to 0x%02x\n", reg);
    121		return ret;
    122	}
    123	return 0;
    124}
    125
    126int da903x_register_notifier(struct device *dev, struct notifier_block *nb,
    127				unsigned int events)
    128{
    129	struct da903x_chip *chip = dev_get_drvdata(dev);
    130
    131	chip->ops->unmask_events(chip, events);
    132	return blocking_notifier_chain_register(&chip->notifier_list, nb);
    133}
    134EXPORT_SYMBOL_GPL(da903x_register_notifier);
    135
    136int da903x_unregister_notifier(struct device *dev, struct notifier_block *nb,
    137				unsigned int events)
    138{
    139	struct da903x_chip *chip = dev_get_drvdata(dev);
    140
    141	chip->ops->mask_events(chip, events);
    142	return blocking_notifier_chain_unregister(&chip->notifier_list, nb);
    143}
    144EXPORT_SYMBOL_GPL(da903x_unregister_notifier);
    145
    146int da903x_write(struct device *dev, int reg, uint8_t val)
    147{
    148	return __da903x_write(to_i2c_client(dev), reg, val);
    149}
    150EXPORT_SYMBOL_GPL(da903x_write);
    151
    152int da903x_writes(struct device *dev, int reg, int len, uint8_t *val)
    153{
    154	return __da903x_writes(to_i2c_client(dev), reg, len, val);
    155}
    156EXPORT_SYMBOL_GPL(da903x_writes);
    157
    158int da903x_read(struct device *dev, int reg, uint8_t *val)
    159{
    160	return __da903x_read(to_i2c_client(dev), reg, val);
    161}
    162EXPORT_SYMBOL_GPL(da903x_read);
    163
    164int da903x_reads(struct device *dev, int reg, int len, uint8_t *val)
    165{
    166	return __da903x_reads(to_i2c_client(dev), reg, len, val);
    167}
    168EXPORT_SYMBOL_GPL(da903x_reads);
    169
    170int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask)
    171{
    172	struct da903x_chip *chip = dev_get_drvdata(dev);
    173	uint8_t reg_val;
    174	int ret = 0;
    175
    176	mutex_lock(&chip->lock);
    177
    178	ret = __da903x_read(chip->client, reg, &reg_val);
    179	if (ret)
    180		goto out;
    181
    182	if ((reg_val & bit_mask) != bit_mask) {
    183		reg_val |= bit_mask;
    184		ret = __da903x_write(chip->client, reg, reg_val);
    185	}
    186out:
    187	mutex_unlock(&chip->lock);
    188	return ret;
    189}
    190EXPORT_SYMBOL_GPL(da903x_set_bits);
    191
    192int da903x_clr_bits(struct device *dev, int reg, uint8_t bit_mask)
    193{
    194	struct da903x_chip *chip = dev_get_drvdata(dev);
    195	uint8_t reg_val;
    196	int ret = 0;
    197
    198	mutex_lock(&chip->lock);
    199
    200	ret = __da903x_read(chip->client, reg, &reg_val);
    201	if (ret)
    202		goto out;
    203
    204	if (reg_val & bit_mask) {
    205		reg_val &= ~bit_mask;
    206		ret = __da903x_write(chip->client, reg, reg_val);
    207	}
    208out:
    209	mutex_unlock(&chip->lock);
    210	return ret;
    211}
    212EXPORT_SYMBOL_GPL(da903x_clr_bits);
    213
    214int da903x_update(struct device *dev, int reg, uint8_t val, uint8_t mask)
    215{
    216	struct da903x_chip *chip = dev_get_drvdata(dev);
    217	uint8_t reg_val;
    218	int ret = 0;
    219
    220	mutex_lock(&chip->lock);
    221
    222	ret = __da903x_read(chip->client, reg, &reg_val);
    223	if (ret)
    224		goto out;
    225
    226	if ((reg_val & mask) != val) {
    227		reg_val = (reg_val & ~mask) | val;
    228		ret = __da903x_write(chip->client, reg, reg_val);
    229	}
    230out:
    231	mutex_unlock(&chip->lock);
    232	return ret;
    233}
    234EXPORT_SYMBOL_GPL(da903x_update);
    235
    236int da903x_query_status(struct device *dev, unsigned int sbits)
    237{
    238	struct da903x_chip *chip = dev_get_drvdata(dev);
    239	unsigned int status = 0;
    240
    241	chip->ops->read_status(chip, &status);
    242	return ((status & sbits) == sbits);
    243}
    244EXPORT_SYMBOL(da903x_query_status);
    245
    246static int da9030_init_chip(struct da903x_chip *chip)
    247{
    248	uint8_t chip_id;
    249	int err;
    250
    251	err = __da903x_read(chip->client, DA9030_CHIP_ID, &chip_id);
    252	if (err)
    253		return err;
    254
    255	err = __da903x_write(chip->client, DA9030_SYS_CTRL_A, 0xE8);
    256	if (err)
    257		return err;
    258
    259	dev_info(chip->dev, "DA9030 (CHIP ID: 0x%02x) detected\n", chip_id);
    260	return 0;
    261}
    262
    263static int da9030_unmask_events(struct da903x_chip *chip, unsigned int events)
    264{
    265	uint8_t v[3];
    266
    267	chip->events_mask &= ~events;
    268
    269	v[0] = (chip->events_mask & 0xff);
    270	v[1] = (chip->events_mask >> 8) & 0xff;
    271	v[2] = (chip->events_mask >> 16) & 0xff;
    272
    273	return __da903x_writes(chip->client, DA9030_IRQ_MASK_A, 3, v);
    274}
    275
    276static int da9030_mask_events(struct da903x_chip *chip, unsigned int events)
    277{
    278	uint8_t v[3];
    279
    280	chip->events_mask |= events;
    281
    282	v[0] = (chip->events_mask & 0xff);
    283	v[1] = (chip->events_mask >> 8) & 0xff;
    284	v[2] = (chip->events_mask >> 16) & 0xff;
    285
    286	return __da903x_writes(chip->client, DA9030_IRQ_MASK_A, 3, v);
    287}
    288
    289static int da9030_read_events(struct da903x_chip *chip, unsigned int *events)
    290{
    291	uint8_t v[3] = {0, 0, 0};
    292	int ret;
    293
    294	ret = __da903x_reads(chip->client, DA9030_EVENT_A, 3, v);
    295	if (ret < 0)
    296		return ret;
    297
    298	*events = (v[2] << 16) | (v[1] << 8) | v[0];
    299	return 0;
    300}
    301
    302static int da9030_read_status(struct da903x_chip *chip, unsigned int *status)
    303{
    304	return __da903x_read(chip->client, DA9030_STATUS, (uint8_t *)status);
    305}
    306
    307static int da9034_init_chip(struct da903x_chip *chip)
    308{
    309	uint8_t chip_id;
    310	int err;
    311
    312	err = __da903x_read(chip->client, DA9034_CHIP_ID, &chip_id);
    313	if (err)
    314		return err;
    315
    316	err = __da903x_write(chip->client, DA9034_SYS_CTRL_A, 0xE8);
    317	if (err)
    318		return err;
    319
    320	/* avoid SRAM power off during sleep*/
    321	__da903x_write(chip->client, 0x10, 0x07);
    322	__da903x_write(chip->client, 0x11, 0xff);
    323	__da903x_write(chip->client, 0x12, 0xff);
    324
    325	/* Enable the ONKEY power down functionality */
    326	__da903x_write(chip->client, DA9034_SYS_CTRL_B, 0x20);
    327	__da903x_write(chip->client, DA9034_SYS_CTRL_A, 0x60);
    328
    329	/* workaround to make LEDs work */
    330	__da903x_write(chip->client, 0x90, 0x01);
    331	__da903x_write(chip->client, 0xB0, 0x08);
    332
    333	/* make ADTV1 and SDTV1 effective */
    334	__da903x_write(chip->client, 0x20, 0x00);
    335
    336	dev_info(chip->dev, "DA9034 (CHIP ID: 0x%02x) detected\n", chip_id);
    337	return 0;
    338}
    339
    340static int da9034_unmask_events(struct da903x_chip *chip, unsigned int events)
    341{
    342	uint8_t v[4];
    343
    344	chip->events_mask &= ~events;
    345
    346	v[0] = (chip->events_mask & 0xff);
    347	v[1] = (chip->events_mask >> 8) & 0xff;
    348	v[2] = (chip->events_mask >> 16) & 0xff;
    349	v[3] = (chip->events_mask >> 24) & 0xff;
    350
    351	return __da903x_writes(chip->client, DA9034_IRQ_MASK_A, 4, v);
    352}
    353
    354static int da9034_mask_events(struct da903x_chip *chip, unsigned int events)
    355{
    356	uint8_t v[4];
    357
    358	chip->events_mask |= events;
    359
    360	v[0] = (chip->events_mask & 0xff);
    361	v[1] = (chip->events_mask >> 8) & 0xff;
    362	v[2] = (chip->events_mask >> 16) & 0xff;
    363	v[3] = (chip->events_mask >> 24) & 0xff;
    364
    365	return __da903x_writes(chip->client, DA9034_IRQ_MASK_A, 4, v);
    366}
    367
    368static int da9034_read_events(struct da903x_chip *chip, unsigned int *events)
    369{
    370	uint8_t v[4] = {0, 0, 0, 0};
    371	int ret;
    372
    373	ret = __da903x_reads(chip->client, DA9034_EVENT_A, 4, v);
    374	if (ret < 0)
    375		return ret;
    376
    377	*events = (v[3] << 24) | (v[2] << 16) | (v[1] << 8) | v[0];
    378	return 0;
    379}
    380
    381static int da9034_read_status(struct da903x_chip *chip, unsigned int *status)
    382{
    383	uint8_t v[2] = {0, 0};
    384	int ret = 0;
    385
    386	ret = __da903x_reads(chip->client, DA9034_STATUS_A, 2, v);
    387	if (ret)
    388		return ret;
    389
    390	*status = (v[1] << 8) | v[0];
    391	return 0;
    392}
    393
    394static void da903x_irq_work(struct work_struct *work)
    395{
    396	struct da903x_chip *chip =
    397		container_of(work, struct da903x_chip, irq_work);
    398	unsigned int events = 0;
    399
    400	while (1) {
    401		if (chip->ops->read_events(chip, &events))
    402			break;
    403
    404		events &= ~chip->events_mask;
    405		if (events == 0)
    406			break;
    407
    408		blocking_notifier_call_chain(
    409				&chip->notifier_list, events, NULL);
    410	}
    411	enable_irq(chip->client->irq);
    412}
    413
    414static irqreturn_t da903x_irq_handler(int irq, void *data)
    415{
    416	struct da903x_chip *chip = data;
    417
    418	disable_irq_nosync(irq);
    419	(void)schedule_work(&chip->irq_work);
    420
    421	return IRQ_HANDLED;
    422}
    423
    424static const struct da903x_chip_ops da903x_ops[] = {
    425	[0] = {
    426		.init_chip	= da9030_init_chip,
    427		.unmask_events	= da9030_unmask_events,
    428		.mask_events	= da9030_mask_events,
    429		.read_events	= da9030_read_events,
    430		.read_status	= da9030_read_status,
    431	},
    432	[1] = {
    433		.init_chip	= da9034_init_chip,
    434		.unmask_events	= da9034_unmask_events,
    435		.mask_events	= da9034_mask_events,
    436		.read_events	= da9034_read_events,
    437		.read_status	= da9034_read_status,
    438	}
    439};
    440
    441static const struct i2c_device_id da903x_id_table[] = {
    442	{ "da9030", 0 },
    443	{ "da9034", 1 },
    444	{ },
    445};
    446MODULE_DEVICE_TABLE(i2c, da903x_id_table);
    447
    448static int __remove_subdev(struct device *dev, void *unused)
    449{
    450	platform_device_unregister(to_platform_device(dev));
    451	return 0;
    452}
    453
    454static int da903x_remove_subdevs(struct da903x_chip *chip)
    455{
    456	return device_for_each_child(chip->dev, NULL, __remove_subdev);
    457}
    458
    459static int da903x_add_subdevs(struct da903x_chip *chip,
    460					struct da903x_platform_data *pdata)
    461{
    462	struct da903x_subdev_info *subdev;
    463	struct platform_device *pdev;
    464	int i, ret = 0;
    465
    466	for (i = 0; i < pdata->num_subdevs; i++) {
    467		subdev = &pdata->subdevs[i];
    468
    469		pdev = platform_device_alloc(subdev->name, subdev->id);
    470		if (!pdev) {
    471			ret = -ENOMEM;
    472			goto failed;
    473		}
    474
    475		pdev->dev.parent = chip->dev;
    476		pdev->dev.platform_data = subdev->platform_data;
    477
    478		ret = platform_device_add(pdev);
    479		if (ret) {
    480			platform_device_put(pdev);
    481			goto failed;
    482		}
    483	}
    484	return 0;
    485
    486failed:
    487	da903x_remove_subdevs(chip);
    488	return ret;
    489}
    490
    491static int da903x_probe(struct i2c_client *client,
    492				  const struct i2c_device_id *id)
    493{
    494	struct da903x_platform_data *pdata = dev_get_platdata(&client->dev);
    495	struct da903x_chip *chip;
    496	unsigned int tmp;
    497	int ret;
    498
    499	chip = devm_kzalloc(&client->dev, sizeof(struct da903x_chip),
    500				GFP_KERNEL);
    501	if (chip == NULL)
    502		return -ENOMEM;
    503
    504	chip->client = client;
    505	chip->dev = &client->dev;
    506	chip->ops = &da903x_ops[id->driver_data];
    507
    508	mutex_init(&chip->lock);
    509	INIT_WORK(&chip->irq_work, da903x_irq_work);
    510	BLOCKING_INIT_NOTIFIER_HEAD(&chip->notifier_list);
    511
    512	i2c_set_clientdata(client, chip);
    513
    514	ret = chip->ops->init_chip(chip);
    515	if (ret)
    516		return ret;
    517
    518	/* mask and clear all IRQs */
    519	chip->events_mask = 0xffffffff;
    520	chip->ops->mask_events(chip, chip->events_mask);
    521	chip->ops->read_events(chip, &tmp);
    522
    523	ret = devm_request_irq(&client->dev, client->irq, da903x_irq_handler,
    524			IRQF_TRIGGER_FALLING,
    525			"da903x", chip);
    526	if (ret) {
    527		dev_err(&client->dev, "failed to request irq %d\n",
    528				client->irq);
    529		return ret;
    530	}
    531
    532	return da903x_add_subdevs(chip, pdata);
    533}
    534
    535static int da903x_remove(struct i2c_client *client)
    536{
    537	struct da903x_chip *chip = i2c_get_clientdata(client);
    538
    539	da903x_remove_subdevs(chip);
    540	return 0;
    541}
    542
    543static struct i2c_driver da903x_driver = {
    544	.driver	= {
    545		.name	= "da903x",
    546	},
    547	.probe		= da903x_probe,
    548	.remove		= da903x_remove,
    549	.id_table	= da903x_id_table,
    550};
    551
    552static int __init da903x_init(void)
    553{
    554	return i2c_add_driver(&da903x_driver);
    555}
    556subsys_initcall(da903x_init);
    557
    558static void __exit da903x_exit(void)
    559{
    560	i2c_del_driver(&da903x_driver);
    561}
    562module_exit(da903x_exit);
    563
    564MODULE_DESCRIPTION("PMIC Driver for Dialog Semiconductor DA9034");
    565MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>");
    566MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
    567MODULE_LICENSE("GPL v2");