Linux Audio

Check our new training course

Loading...
v3.1
 
  1/*
  2 * Copyright (C) ST-Ericsson SA 2010
  3 *
  4 * Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson.
  5 * License Terms: GNU General Public License v2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  6 */
  7
  8#include <linux/seq_file.h>
  9#include <linux/uaccess.h>
 10#include <linux/fs.h>
 
 11#include <linux/debugfs.h>
 12#include <linux/platform_device.h>
 
 
 
 
 13
 14#include <linux/mfd/abx500.h>
 15#include <linux/mfd/ab8500.h>
 
 
 
 
 
 16
 17static u32 debug_bank;
 18static u32 debug_address;
 19
 
 
 
 
 
 
 
 
 
 20/**
 21 * struct ab8500_reg_range
 22 * @first: the first address of the range
 23 * @last: the last address of the range
 24 * @perm: access permissions for the range
 25 */
 26struct ab8500_reg_range {
 27	u8 first;
 28	u8 last;
 29	u8 perm;
 30};
 31
 32/**
 33 * struct ab8500_i2c_ranges
 34 * @num_ranges: the number of ranges in the list
 35 * @bankid: bank identifier
 36 * @range: the list of register ranges
 37 */
 38struct ab8500_i2c_ranges {
 39	u8 num_ranges;
 40	u8 bankid;
 41	const struct ab8500_reg_range *range;
 42};
 43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 44#define AB8500_NAME_STRING "ab8500"
 45#define AB8500_NUM_BANKS 22
 46
 47#define AB8500_REV_REG 0x80
 48
 49static struct ab8500_i2c_ranges debug_ranges[AB8500_NUM_BANKS] = {
 50	[0x0] = {
 
 
 51		.num_ranges = 0,
 52		.range = 0,
 53	},
 54	[AB8500_SYS_CTRL1_BLOCK] = {
 55		.num_ranges = 3,
 56		.range = (struct ab8500_reg_range[]) {
 57			{
 58				.first = 0x00,
 59				.last = 0x02,
 60			},
 61			{
 62				.first = 0x42,
 63				.last = 0x42,
 64			},
 65			{
 66				.first = 0x80,
 67				.last = 0x81,
 68			},
 69		},
 70	},
 71	[AB8500_SYS_CTRL2_BLOCK] = {
 72		.num_ranges = 4,
 73		.range = (struct ab8500_reg_range[]) {
 74			{
 75				.first = 0x00,
 76				.last = 0x0D,
 77			},
 78			{
 79				.first = 0x0F,
 80				.last = 0x17,
 81			},
 82			{
 83				.first = 0x30,
 84				.last = 0x30,
 85			},
 86			{
 87				.first = 0x32,
 88				.last = 0x33,
 89			},
 90		},
 91	},
 92	[AB8500_REGU_CTRL1] = {
 93		.num_ranges = 3,
 94		.range = (struct ab8500_reg_range[]) {
 95			{
 96				.first = 0x00,
 97				.last = 0x00,
 98			},
 99			{
100				.first = 0x03,
101				.last = 0x10,
102			},
103			{
104				.first = 0x80,
105				.last = 0x84,
106			},
107		},
108	},
109	[AB8500_REGU_CTRL2] = {
110		.num_ranges = 5,
111		.range = (struct ab8500_reg_range[]) {
112			{
113				.first = 0x00,
114				.last = 0x15,
115			},
116			{
117				.first = 0x17,
118				.last = 0x19,
119			},
120			{
121				.first = 0x1B,
122				.last = 0x1D,
123			},
124			{
125				.first = 0x1F,
126				.last = 0x22,
127			},
128			{
129				.first = 0x40,
130				.last = 0x44,
131			},
132			/* 0x80-0x8B is SIM registers and should
133			 * not be accessed from here */
 
 
134		},
135	},
136	[AB8500_USB] = {
137		.num_ranges = 2,
138		.range = (struct ab8500_reg_range[]) {
139			{
140				.first = 0x80,
141				.last = 0x83,
142			},
143			{
144				.first = 0x87,
145				.last = 0x8A,
146			},
147		},
148	},
149	[AB8500_TVOUT] = {
150		.num_ranges = 9,
151		.range = (struct ab8500_reg_range[]) {
152			{
153				.first = 0x00,
154				.last = 0x12,
155			},
156			{
157				.first = 0x15,
158				.last = 0x17,
159			},
160			{
161				.first = 0x19,
162				.last = 0x21,
163			},
164			{
165				.first = 0x27,
166				.last = 0x2C,
167			},
168			{
169				.first = 0x41,
170				.last = 0x41,
171			},
172			{
173				.first = 0x45,
174				.last = 0x5B,
175			},
176			{
177				.first = 0x5D,
178				.last = 0x5D,
179			},
180			{
181				.first = 0x69,
182				.last = 0x69,
183			},
184			{
185				.first = 0x80,
186				.last = 0x81,
187			},
188		},
189	},
190	[AB8500_DBI] = {
191		.num_ranges = 0,
192		.range = NULL,
193	},
194	[AB8500_ECI_AV_ACC] = {
195		.num_ranges = 1,
196		.range = (struct ab8500_reg_range[]) {
197			{
198				.first = 0x80,
199				.last = 0x82,
200			},
201		},
202	},
203	[0x9] = {
204		.num_ranges = 0,
205		.range = NULL,
206	},
207	[AB8500_GPADC] = {
208		.num_ranges = 1,
209		.range = (struct ab8500_reg_range[]) {
210			{
211				.first = 0x00,
212				.last = 0x08,
213			},
214		},
215	},
216	[AB8500_CHARGER] = {
217		.num_ranges = 8,
218		.range = (struct ab8500_reg_range[]) {
219			{
220				.first = 0x00,
221				.last = 0x03,
222			},
223			{
224				.first = 0x05,
225				.last = 0x05,
226			},
227			{
228				.first = 0x40,
229				.last = 0x40,
230			},
231			{
232				.first = 0x42,
233				.last = 0x42,
234			},
235			{
236				.first = 0x44,
237				.last = 0x44,
238			},
239			{
240				.first = 0x50,
241				.last = 0x55,
242			},
243			{
244				.first = 0x80,
245				.last = 0x82,
246			},
247			{
248				.first = 0xC0,
249				.last = 0xC2,
250			},
 
 
 
 
251		},
252	},
253	[AB8500_GAS_GAUGE] = {
254		.num_ranges = 3,
255		.range = (struct ab8500_reg_range[]) {
256			{
257				.first = 0x00,
258				.last = 0x00,
259			},
260			{
261				.first = 0x07,
262				.last = 0x0A,
263			},
264			{
265				.first = 0x10,
266				.last = 0x14,
267			},
268		},
269	},
270	[AB8500_AUDIO] = {
271		.num_ranges = 1,
272		.range = (struct ab8500_reg_range[]) {
273			{
274				.first = 0x00,
275				.last = 0x6F,
276			},
277		},
278	},
279	[AB8500_INTERRUPT] = {
280		.num_ranges = 0,
281		.range = NULL,
282	},
283	[AB8500_RTC] = {
284		.num_ranges = 1,
285		.range = (struct ab8500_reg_range[]) {
286			{
287				.first = 0x00,
288				.last = 0x0F,
289			},
290		},
291	},
292	[AB8500_MISC] = {
293		.num_ranges = 8,
294		.range = (struct ab8500_reg_range[]) {
295			{
296				.first = 0x00,
297				.last = 0x05,
298			},
299			{
300				.first = 0x10,
301				.last = 0x15,
302			},
303			{
304				.first = 0x20,
305				.last = 0x25,
306			},
307			{
308				.first = 0x30,
309				.last = 0x35,
310			},
311			{
312				.first = 0x40,
313				.last = 0x45,
314			},
315			{
316				.first = 0x50,
317				.last = 0x50,
318			},
319			{
320				.first = 0x60,
321				.last = 0x67,
322			},
323			{
324				.first = 0x80,
325				.last = 0x80,
326			},
327		},
328	},
329	[0x11] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330		.num_ranges = 0,
331		.range = NULL,
332	},
333	[0x12] = {
334		.num_ranges = 0,
335		.range = NULL,
336	},
337	[0x13] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338		.num_ranges = 0,
339		.range = NULL,
340	},
341	[0x14] = {
342		.num_ranges = 0,
343		.range = NULL,
344	},
345	[AB8500_OTP_EMUL] = {
346		.num_ranges = 1,
347		.range = (struct ab8500_reg_range[]) {
348			{
349				.first = 0x01,
350				.last = 0x0F,
351			},
352		},
353	},
354};
355
356static int ab8500_registers_print(struct seq_file *s, void *p)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357{
358	struct device *dev = s->private;
359	unsigned int i;
360	u32 bank = debug_bank;
 
 
 
 
 
 
 
 
 
361
362	seq_printf(s, AB8500_NAME_STRING " register values:\n");
 
 
 
 
 
 
 
363
364	seq_printf(s, " bank %u:\n", bank);
365	for (i = 0; i < debug_ranges[bank].num_ranges; i++) {
366		u32 reg;
367
368		for (reg = debug_ranges[bank].range[i].first;
369			reg <= debug_ranges[bank].range[i].last;
370			reg++) {
371			u8 value;
372			int err;
373
374			err = abx500_get_register_interruptible(dev,
375				(u8)bank, (u8)reg, &value);
376			if (err < 0) {
377				dev_err(dev, "ab->read fail %d\n", err);
378				return err;
379			}
380
381			err = seq_printf(s, "  [%u/0x%02X]: 0x%02X\n", bank,
382				reg, value);
383			if (err < 0) {
384				dev_err(dev, "seq_printf overflow\n");
385				/* Error is not returned here since
386				 * the output is wanted in any case */
387				return 0;
 
 
 
 
 
388			}
389		}
390	}
 
391	return 0;
392}
393
394static int ab8500_registers_open(struct inode *inode, struct file *file)
395{
396	return single_open(file, ab8500_registers_print, inode->i_private);
 
 
 
 
 
 
 
397}
398
399static const struct file_operations ab8500_registers_fops = {
400	.open = ab8500_registers_open,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
401	.read = seq_read,
402	.llseek = seq_lseek,
403	.release = single_release,
404	.owner = THIS_MODULE,
405};
406
407static int ab8500_bank_print(struct seq_file *s, void *p)
408{
409	return seq_printf(s, "%d\n", debug_bank);
 
410}
411
412static int ab8500_bank_open(struct inode *inode, struct file *file)
413{
414	return single_open(file, ab8500_bank_print, inode->i_private);
415}
416
417static ssize_t ab8500_bank_write(struct file *file,
418	const char __user *user_buf,
419	size_t count, loff_t *ppos)
420{
421	struct device *dev = ((struct seq_file *)(file->private_data))->private;
422	unsigned long user_bank;
423	int err;
424
425	/* Get userspace string and assure termination */
426	err = kstrtoul_from_user(user_buf, count, 0, &user_bank);
427	if (err)
428		return err;
429
430	if (user_bank >= AB8500_NUM_BANKS) {
431		dev_err(dev, "debugfs error input > number of banks\n");
432		return -EINVAL;
433	}
434
435	debug_bank = user_bank;
436
437	return count;
438}
439
440static int ab8500_address_print(struct seq_file *s, void *p)
441{
442	return seq_printf(s, "0x%02X\n", debug_address);
 
443}
444
445static int ab8500_address_open(struct inode *inode, struct file *file)
446{
447	return single_open(file, ab8500_address_print, inode->i_private);
448}
449
450static ssize_t ab8500_address_write(struct file *file,
451	const char __user *user_buf,
452	size_t count, loff_t *ppos)
453{
454	struct device *dev = ((struct seq_file *)(file->private_data))->private;
455	unsigned long user_address;
456	int err;
457
458	/* Get userspace string and assure termination */
459	err = kstrtoul_from_user(user_buf, count, 0, &user_address);
460	if (err)
461		return err;
462
463	if (user_address > 0xff) {
464		dev_err(dev, "debugfs error input > 0xff\n");
465		return -EINVAL;
466	}
467	debug_address = user_address;
 
468	return count;
469}
470
471static int ab8500_val_print(struct seq_file *s, void *p)
472{
473	struct device *dev = s->private;
474	int ret;
475	u8 regvalue;
476
477	ret = abx500_get_register_interruptible(dev,
478		(u8)debug_bank, (u8)debug_address, &regvalue);
479	if (ret < 0) {
480		dev_err(dev, "abx500_get_reg fail %d, %d\n",
481			ret, __LINE__);
482		return -EINVAL;
483	}
484	seq_printf(s, "0x%02X\n", regvalue);
485
486	return 0;
487}
488
489static int ab8500_val_open(struct inode *inode, struct file *file)
490{
491	return single_open(file, ab8500_val_print, inode->i_private);
492}
493
494static ssize_t ab8500_val_write(struct file *file,
495	const char __user *user_buf,
496	size_t count, loff_t *ppos)
497{
498	struct device *dev = ((struct seq_file *)(file->private_data))->private;
499	unsigned long user_val;
500	int err;
501
502	/* Get userspace string and assure termination */
503	err = kstrtoul_from_user(user_buf, count, 0, &user_val);
504	if (err)
505		return err;
506
507	if (user_val > 0xff) {
508		dev_err(dev, "debugfs error input > 0xff\n");
509		return -EINVAL;
510	}
511	err = abx500_set_register_interruptible(dev,
512		(u8)debug_bank, debug_address, (u8)user_val);
513	if (err < 0) {
514		printk(KERN_ERR "abx500_set_reg failed %d, %d", err, __LINE__);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515		return -EINVAL;
516	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
518	return count;
519}
520
 
 
 
 
521static const struct file_operations ab8500_bank_fops = {
522	.open = ab8500_bank_open,
523	.write = ab8500_bank_write,
524	.read = seq_read,
525	.llseek = seq_lseek,
526	.release = single_release,
527	.owner = THIS_MODULE,
528};
529
530static const struct file_operations ab8500_address_fops = {
531	.open = ab8500_address_open,
532	.write = ab8500_address_write,
533	.read = seq_read,
534	.llseek = seq_lseek,
535	.release = single_release,
536	.owner = THIS_MODULE,
537};
538
539static const struct file_operations ab8500_val_fops = {
540	.open = ab8500_val_open,
541	.write = ab8500_val_write,
542	.read = seq_read,
543	.llseek = seq_lseek,
544	.release = single_release,
545	.owner = THIS_MODULE,
546};
547
548static struct dentry *ab8500_dir;
549static struct dentry *ab8500_reg_file;
550static struct dentry *ab8500_bank_file;
551static struct dentry *ab8500_address_file;
552static struct dentry *ab8500_val_file;
 
 
 
553
554static int __devinit ab8500_debug_probe(struct platform_device *plf)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
555{
 
 
 
 
556	debug_bank = AB8500_MISC;
557	debug_address = AB8500_REV_REG & 0x00FF;
558
559	ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL);
560	if (!ab8500_dir)
561		goto exit_no_debugfs;
562
563	ab8500_reg_file = debugfs_create_file("all-bank-registers",
564		S_IRUGO, ab8500_dir, &plf->dev, &ab8500_registers_fops);
565	if (!ab8500_reg_file)
566		goto exit_destroy_dir;
567
568	ab8500_bank_file = debugfs_create_file("register-bank",
569		(S_IRUGO | S_IWUSR), ab8500_dir, &plf->dev, &ab8500_bank_fops);
570	if (!ab8500_bank_file)
571		goto exit_destroy_reg;
572
573	ab8500_address_file = debugfs_create_file("register-address",
574		(S_IRUGO | S_IWUSR), ab8500_dir, &plf->dev,
575		&ab8500_address_fops);
576	if (!ab8500_address_file)
577		goto exit_destroy_bank;
578
579	ab8500_val_file = debugfs_create_file("register-value",
580		(S_IRUGO | S_IWUSR), ab8500_dir, &plf->dev, &ab8500_val_fops);
581	if (!ab8500_val_file)
582		goto exit_destroy_address;
 
583
584	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
586exit_destroy_address:
587	debugfs_remove(ab8500_address_file);
588exit_destroy_bank:
589	debugfs_remove(ab8500_bank_file);
590exit_destroy_reg:
591	debugfs_remove(ab8500_reg_file);
592exit_destroy_dir:
593	debugfs_remove(ab8500_dir);
594exit_no_debugfs:
595	dev_err(&plf->dev, "failed to create debugfs entries.\n");
596	return -ENOMEM;
597}
598
599static int __devexit ab8500_debug_remove(struct platform_device *plf)
600{
601	debugfs_remove(ab8500_val_file);
602	debugfs_remove(ab8500_address_file);
603	debugfs_remove(ab8500_bank_file);
604	debugfs_remove(ab8500_reg_file);
605	debugfs_remove(ab8500_dir);
606
607	return 0;
608}
609
610static struct platform_driver ab8500_debug_driver = {
611	.driver = {
612		.name = "ab8500-debug",
613		.owner = THIS_MODULE,
614	},
615	.probe  = ab8500_debug_probe,
616	.remove = __devexit_p(ab8500_debug_remove)
617};
618
619static int __init ab8500_debug_init(void)
620{
621	return platform_driver_register(&ab8500_debug_driver);
622}
623
624static void __exit ab8500_debug_exit(void)
625{
626	platform_driver_unregister(&ab8500_debug_driver);
627}
628subsys_initcall(ab8500_debug_init);
629module_exit(ab8500_debug_exit);
630
631MODULE_AUTHOR("Mattias WALLIN <mattias.wallin@stericsson.com");
632MODULE_DESCRIPTION("AB8500 DEBUG");
633MODULE_LICENSE("GPL v2");
v5.14.15
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) ST-Ericsson SA 2010
   4 *
   5 * Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson.
   6 */
   7/*
   8 * AB8500 register access
   9 * ======================
  10 *
  11 * read:
  12 * # echo BANK  >  <debugfs>/ab8500/register-bank
  13 * # echo ADDR  >  <debugfs>/ab8500/register-address
  14 * # cat <debugfs>/ab8500/register-value
  15 *
  16 * write:
  17 * # echo BANK  >  <debugfs>/ab8500/register-bank
  18 * # echo ADDR  >  <debugfs>/ab8500/register-address
  19 * # echo VALUE >  <debugfs>/ab8500/register-value
  20 *
  21 * read all registers from a bank:
  22 * # echo BANK  >  <debugfs>/ab8500/register-bank
  23 * # cat <debugfs>/ab8500/all-bank-register
  24 *
  25 * BANK   target AB8500 register bank
  26 * ADDR   target AB8500 register address
  27 * VALUE  decimal or 0x-prefixed hexadecimal
  28 *
  29 *
  30 * User Space notification on AB8500 IRQ
  31 * =====================================
  32 *
  33 * Allows user space entity to be notified when target AB8500 IRQ occurs.
  34 * When subscribed, a sysfs entry is created in ab8500.i2c platform device.
  35 * One can pool this file to get target IRQ occurence information.
  36 *
  37 * subscribe to an AB8500 IRQ:
  38 * # echo IRQ  >  <debugfs>/ab8500/irq-subscribe
  39 *
  40 * unsubscribe from an AB8500 IRQ:
  41 * # echo IRQ  >  <debugfs>/ab8500/irq-unsubscribe
  42 *
  43 *
  44 * AB8500 register formated read/write access
  45 * ==========================================
  46 *
  47 * Read:  read data, data>>SHIFT, data&=MASK, output data
  48 *        [0xABCDEF98] shift=12 mask=0xFFF => 0x00000CDE
  49 * Write: read data, data &= ~(MASK<<SHIFT), data |= (VALUE<<SHIFT), write data
  50 *        [0xABCDEF98] shift=12 mask=0xFFF value=0x123 => [0xAB123F98]
  51 *
  52 * Usage:
  53 * # echo "CMD [OPTIONS] BANK ADRESS [VALUE]" > $debugfs/ab8500/hwreg
  54 *
  55 * CMD      read      read access
  56 *          write     write access
  57 *
  58 * BANK     target reg bank
  59 * ADDRESS  target reg address
  60 * VALUE    (write) value to be updated
  61 *
  62 * OPTIONS
  63 *  -d|-dec            (read) output in decimal
  64 *  -h|-hexa           (read) output in 0x-hexa (default)
  65 *  -l|-w|-b           32bit (default), 16bit or 8bit reg access
  66 *  -m|-mask MASK      0x-hexa mask (default 0xFFFFFFFF)
  67 *  -s|-shift SHIFT    bit shift value (read:left, write:right)
  68 *  -o|-offset OFFSET  address offset to add to ADDRESS value
  69 *
  70 * Warning: bit shift operation is applied to bit-mask.
  71 * Warning: bit shift direction depends on read or right command.
  72 */
  73
  74#include <linux/seq_file.h>
  75#include <linux/uaccess.h>
  76#include <linux/fs.h>
  77#include <linux/init.h>
  78#include <linux/debugfs.h>
  79#include <linux/platform_device.h>
  80#include <linux/interrupt.h>
  81#include <linux/kobject.h>
  82#include <linux/slab.h>
  83#include <linux/irq.h>
  84
  85#include <linux/mfd/abx500.h>
  86#include <linux/mfd/abx500/ab8500.h>
  87
  88#ifdef CONFIG_DEBUG_FS
  89#include <linux/string.h>
  90#include <linux/ctype.h>
  91#endif
  92
  93static u32 debug_bank;
  94static u32 debug_address;
  95
  96static int irq_ab8500;
  97static int irq_first;
  98static int irq_last;
  99static u32 *irq_count;
 100static int num_irqs;
 101
 102static struct device_attribute **dev_attr;
 103static char **event_name;
 104
 105/**
 106 * struct ab8500_reg_range
 107 * @first: the first address of the range
 108 * @last: the last address of the range
 109 * @perm: access permissions for the range
 110 */
 111struct ab8500_reg_range {
 112	u8 first;
 113	u8 last;
 114	u8 perm;
 115};
 116
 117/**
 118 * struct ab8500_prcmu_ranges
 119 * @num_ranges: the number of ranges in the list
 120 * @bankid: bank identifier
 121 * @range: the list of register ranges
 122 */
 123struct ab8500_prcmu_ranges {
 124	u8 num_ranges;
 125	u8 bankid;
 126	const struct ab8500_reg_range *range;
 127};
 128
 129/* hwreg- "mask" and "shift" entries ressources */
 130struct hwreg_cfg {
 131	u32  bank;      /* target bank */
 132	unsigned long addr;      /* target address */
 133	uint fmt;       /* format */
 134	unsigned long mask; /* read/write mask, applied before any bit shift */
 135	long shift;     /* bit shift (read:right shift, write:left shift */
 136};
 137/* fmt bit #0: 0=hexa, 1=dec */
 138#define REG_FMT_DEC(c) ((c)->fmt & 0x1)
 139#define REG_FMT_HEX(c) (!REG_FMT_DEC(c))
 140
 141static struct hwreg_cfg hwreg_cfg = {
 142	.addr = 0,			/* default: invalid phys addr */
 143	.fmt = 0,			/* default: 32bit access, hex output */
 144	.mask = 0xFFFFFFFF,	/* default: no mask */
 145	.shift = 0,			/* default: no bit shift */
 146};
 147
 148#define AB8500_NAME_STRING "ab8500"
 149#define AB8500_NUM_BANKS AB8500_DEBUG_FIELD_LAST
 150
 151#define AB8500_REV_REG 0x80
 152
 153static struct ab8500_prcmu_ranges *debug_ranges;
 154
 155static struct ab8500_prcmu_ranges ab8500_debug_ranges[AB8500_NUM_BANKS] = {
 156	[AB8500_M_FSM_RANK] = {
 157		.num_ranges = 0,
 158		.range = NULL,
 159	},
 160	[AB8500_SYS_CTRL1_BLOCK] = {
 161		.num_ranges = 3,
 162		.range = (struct ab8500_reg_range[]) {
 163			{
 164				.first = 0x00,
 165				.last = 0x02,
 166			},
 167			{
 168				.first = 0x42,
 169				.last = 0x42,
 170			},
 171			{
 172				.first = 0x80,
 173				.last = 0x81,
 174			},
 175		},
 176	},
 177	[AB8500_SYS_CTRL2_BLOCK] = {
 178		.num_ranges = 4,
 179		.range = (struct ab8500_reg_range[]) {
 180			{
 181				.first = 0x00,
 182				.last = 0x0D,
 183			},
 184			{
 185				.first = 0x0F,
 186				.last = 0x17,
 187			},
 188			{
 189				.first = 0x30,
 190				.last = 0x30,
 191			},
 192			{
 193				.first = 0x32,
 194				.last = 0x33,
 195			},
 196		},
 197	},
 198	[AB8500_REGU_CTRL1] = {
 199		.num_ranges = 3,
 200		.range = (struct ab8500_reg_range[]) {
 201			{
 202				.first = 0x00,
 203				.last = 0x00,
 204			},
 205			{
 206				.first = 0x03,
 207				.last = 0x10,
 208			},
 209			{
 210				.first = 0x80,
 211				.last = 0x84,
 212			},
 213		},
 214	},
 215	[AB8500_REGU_CTRL2] = {
 216		.num_ranges = 5,
 217		.range = (struct ab8500_reg_range[]) {
 218			{
 219				.first = 0x00,
 220				.last = 0x15,
 221			},
 222			{
 223				.first = 0x17,
 224				.last = 0x19,
 225			},
 226			{
 227				.first = 0x1B,
 228				.last = 0x1D,
 229			},
 230			{
 231				.first = 0x1F,
 232				.last = 0x22,
 233			},
 234			{
 235				.first = 0x40,
 236				.last = 0x44,
 237			},
 238			/*
 239			 * 0x80-0x8B are SIM registers and should
 240			 * not be accessed from here
 241			 */
 242		},
 243	},
 244	[AB8500_USB] = {
 245		.num_ranges = 2,
 246		.range = (struct ab8500_reg_range[]) {
 247			{
 248				.first = 0x80,
 249				.last = 0x83,
 250			},
 251			{
 252				.first = 0x87,
 253				.last = 0x8A,
 254			},
 255		},
 256	},
 257	[AB8500_TVOUT] = {
 258		.num_ranges = 9,
 259		.range = (struct ab8500_reg_range[]) {
 260			{
 261				.first = 0x00,
 262				.last = 0x12,
 263			},
 264			{
 265				.first = 0x15,
 266				.last = 0x17,
 267			},
 268			{
 269				.first = 0x19,
 270				.last = 0x21,
 271			},
 272			{
 273				.first = 0x27,
 274				.last = 0x2C,
 275			},
 276			{
 277				.first = 0x41,
 278				.last = 0x41,
 279			},
 280			{
 281				.first = 0x45,
 282				.last = 0x5B,
 283			},
 284			{
 285				.first = 0x5D,
 286				.last = 0x5D,
 287			},
 288			{
 289				.first = 0x69,
 290				.last = 0x69,
 291			},
 292			{
 293				.first = 0x80,
 294				.last = 0x81,
 295			},
 296		},
 297	},
 298	[AB8500_DBI] = {
 299		.num_ranges = 0,
 300		.range = NULL,
 301	},
 302	[AB8500_ECI_AV_ACC] = {
 303		.num_ranges = 1,
 304		.range = (struct ab8500_reg_range[]) {
 305			{
 306				.first = 0x80,
 307				.last = 0x82,
 308			},
 309		},
 310	},
 311	[AB8500_RESERVED] = {
 312		.num_ranges = 0,
 313		.range = NULL,
 314	},
 315	[AB8500_GPADC] = {
 316		.num_ranges = 1,
 317		.range = (struct ab8500_reg_range[]) {
 318			{
 319				.first = 0x00,
 320				.last = 0x08,
 321			},
 322		},
 323	},
 324	[AB8500_CHARGER] = {
 325		.num_ranges = 9,
 326		.range = (struct ab8500_reg_range[]) {
 327			{
 328				.first = 0x00,
 329				.last = 0x03,
 330			},
 331			{
 332				.first = 0x05,
 333				.last = 0x05,
 334			},
 335			{
 336				.first = 0x40,
 337				.last = 0x40,
 338			},
 339			{
 340				.first = 0x42,
 341				.last = 0x42,
 342			},
 343			{
 344				.first = 0x44,
 345				.last = 0x44,
 346			},
 347			{
 348				.first = 0x50,
 349				.last = 0x55,
 350			},
 351			{
 352				.first = 0x80,
 353				.last = 0x82,
 354			},
 355			{
 356				.first = 0xC0,
 357				.last = 0xC2,
 358			},
 359			{
 360				.first = 0xf5,
 361				.last = 0xf6,
 362			},
 363		},
 364	},
 365	[AB8500_GAS_GAUGE] = {
 366		.num_ranges = 3,
 367		.range = (struct ab8500_reg_range[]) {
 368			{
 369				.first = 0x00,
 370				.last = 0x00,
 371			},
 372			{
 373				.first = 0x07,
 374				.last = 0x0A,
 375			},
 376			{
 377				.first = 0x10,
 378				.last = 0x14,
 379			},
 380		},
 381	},
 382	[AB8500_AUDIO] = {
 383		.num_ranges = 1,
 384		.range = (struct ab8500_reg_range[]) {
 385			{
 386				.first = 0x00,
 387				.last = 0x6F,
 388			},
 389		},
 390	},
 391	[AB8500_INTERRUPT] = {
 392		.num_ranges = 0,
 393		.range = NULL,
 394	},
 395	[AB8500_RTC] = {
 396		.num_ranges = 1,
 397		.range = (struct ab8500_reg_range[]) {
 398			{
 399				.first = 0x00,
 400				.last = 0x0F,
 401			},
 402		},
 403	},
 404	[AB8500_MISC] = {
 405		.num_ranges = 8,
 406		.range = (struct ab8500_reg_range[]) {
 407			{
 408				.first = 0x00,
 409				.last = 0x05,
 410			},
 411			{
 412				.first = 0x10,
 413				.last = 0x15,
 414			},
 415			{
 416				.first = 0x20,
 417				.last = 0x25,
 418			},
 419			{
 420				.first = 0x30,
 421				.last = 0x35,
 422			},
 423			{
 424				.first = 0x40,
 425				.last = 0x45,
 426			},
 427			{
 428				.first = 0x50,
 429				.last = 0x50,
 430			},
 431			{
 432				.first = 0x60,
 433				.last = 0x67,
 434			},
 435			{
 436				.first = 0x80,
 437				.last = 0x80,
 438			},
 439		},
 440	},
 441	[AB8500_DEVELOPMENT] = {
 442		.num_ranges = 1,
 443		.range = (struct ab8500_reg_range[]) {
 444			{
 445				.first = 0x00,
 446				.last = 0x00,
 447			},
 448		},
 449	},
 450	[AB8500_DEBUG] = {
 451		.num_ranges = 1,
 452		.range = (struct ab8500_reg_range[]) {
 453			{
 454				.first = 0x05,
 455				.last = 0x07,
 456			},
 457		},
 458	},
 459	[AB8500_PROD_TEST] = {
 460		.num_ranges = 0,
 461		.range = NULL,
 462	},
 463	[AB8500_STE_TEST] = {
 464		.num_ranges = 0,
 465		.range = NULL,
 466	},
 467	[AB8500_OTP_EMUL] = {
 468		.num_ranges = 1,
 469		.range = (struct ab8500_reg_range[]) {
 470			{
 471				.first = 0x01,
 472				.last = 0x0F,
 473			},
 474		},
 475	},
 476};
 477
 478static struct ab8500_prcmu_ranges ab8505_debug_ranges[AB8500_NUM_BANKS] = {
 479	[0x0] = {
 480		.num_ranges = 0,
 481		.range = NULL,
 482	},
 483	[AB8500_SYS_CTRL1_BLOCK] = {
 484		.num_ranges = 5,
 485		.range = (struct ab8500_reg_range[]) {
 486			{
 487				.first = 0x00,
 488				.last = 0x04,
 489			},
 490			{
 491				.first = 0x42,
 492				.last = 0x42,
 493			},
 494			{
 495				.first = 0x52,
 496				.last = 0x52,
 497			},
 498			{
 499				.first = 0x54,
 500				.last = 0x57,
 501			},
 502			{
 503				.first = 0x80,
 504				.last = 0x83,
 505			},
 506		},
 507	},
 508	[AB8500_SYS_CTRL2_BLOCK] = {
 509		.num_ranges = 5,
 510		.range = (struct ab8500_reg_range[]) {
 511			{
 512				.first = 0x00,
 513				.last = 0x0D,
 514			},
 515			{
 516				.first = 0x0F,
 517				.last = 0x17,
 518			},
 519			{
 520				.first = 0x20,
 521				.last = 0x20,
 522			},
 523			{
 524				.first = 0x30,
 525				.last = 0x30,
 526			},
 527			{
 528				.first = 0x32,
 529				.last = 0x3A,
 530			},
 531		},
 532	},
 533	[AB8500_REGU_CTRL1] = {
 534		.num_ranges = 3,
 535		.range = (struct ab8500_reg_range[]) {
 536			{
 537				.first = 0x00,
 538				.last = 0x00,
 539			},
 540			{
 541				.first = 0x03,
 542				.last = 0x11,
 543			},
 544			{
 545				.first = 0x80,
 546				.last = 0x86,
 547			},
 548		},
 549	},
 550	[AB8500_REGU_CTRL2] = {
 551		.num_ranges = 6,
 552		.range = (struct ab8500_reg_range[]) {
 553			{
 554				.first = 0x00,
 555				.last = 0x06,
 556			},
 557			{
 558				.first = 0x08,
 559				.last = 0x15,
 560			},
 561			{
 562				.first = 0x17,
 563				.last = 0x19,
 564			},
 565			{
 566				.first = 0x1B,
 567				.last = 0x1D,
 568			},
 569			{
 570				.first = 0x1F,
 571				.last = 0x30,
 572			},
 573			{
 574				.first = 0x40,
 575				.last = 0x48,
 576			},
 577			/*
 578			 * 0x80-0x8B are SIM registers and should
 579			 * not be accessed from here
 580			 */
 581		},
 582	},
 583	[AB8500_USB] = {
 584		.num_ranges = 3,
 585		.range = (struct ab8500_reg_range[]) {
 586			{
 587				.first = 0x80,
 588				.last = 0x83,
 589			},
 590			{
 591				.first = 0x87,
 592				.last = 0x8A,
 593			},
 594			{
 595				.first = 0x91,
 596				.last = 0x94,
 597			},
 598		},
 599	},
 600	[AB8500_TVOUT] = {
 601		.num_ranges = 0,
 602		.range = NULL,
 603	},
 604	[AB8500_DBI] = {
 605		.num_ranges = 0,
 606		.range = NULL,
 607	},
 608	[AB8500_ECI_AV_ACC] = {
 609		.num_ranges = 1,
 610		.range = (struct ab8500_reg_range[]) {
 611			{
 612				.first = 0x80,
 613				.last = 0x82,
 614			},
 615		},
 616	},
 617	[AB8500_RESERVED] = {
 618		.num_ranges = 0,
 619		.range = NULL,
 620	},
 621	[AB8500_GPADC] = {
 622		.num_ranges = 1,
 623		.range = (struct ab8500_reg_range[]) {
 624			{
 625				.first = 0x00,
 626				.last = 0x08,
 627			},
 628		},
 629	},
 630	[AB8500_CHARGER] = {
 631		.num_ranges = 9,
 632		.range = (struct ab8500_reg_range[]) {
 633			{
 634				.first = 0x02,
 635				.last = 0x03,
 636			},
 637			{
 638				.first = 0x05,
 639				.last = 0x05,
 640			},
 641			{
 642				.first = 0x40,
 643				.last = 0x44,
 644			},
 645			{
 646				.first = 0x50,
 647				.last = 0x57,
 648			},
 649			{
 650				.first = 0x60,
 651				.last = 0x60,
 652			},
 653			{
 654				.first = 0xA0,
 655				.last = 0xA7,
 656			},
 657			{
 658				.first = 0xAF,
 659				.last = 0xB2,
 660			},
 661			{
 662				.first = 0xC0,
 663				.last = 0xC2,
 664			},
 665			{
 666				.first = 0xF5,
 667				.last = 0xF5,
 668			},
 669		},
 670	},
 671	[AB8500_GAS_GAUGE] = {
 672		.num_ranges = 3,
 673		.range = (struct ab8500_reg_range[]) {
 674			{
 675				.first = 0x00,
 676				.last = 0x00,
 677			},
 678			{
 679				.first = 0x07,
 680				.last = 0x0A,
 681			},
 682			{
 683				.first = 0x10,
 684				.last = 0x14,
 685			},
 686		},
 687	},
 688	[AB8500_AUDIO] = {
 689		.num_ranges = 1,
 690		.range = (struct ab8500_reg_range[]) {
 691			{
 692				.first = 0x00,
 693				.last = 0x83,
 694			},
 695		},
 696	},
 697	[AB8500_INTERRUPT] = {
 698		.num_ranges = 11,
 699		.range = (struct ab8500_reg_range[]) {
 700			{
 701				.first = 0x00,
 702				.last = 0x04,
 703			},
 704			{
 705				.first = 0x06,
 706				.last = 0x07,
 707			},
 708			{
 709				.first = 0x09,
 710				.last = 0x09,
 711			},
 712			{
 713				.first = 0x0B,
 714				.last = 0x0C,
 715			},
 716			{
 717				.first = 0x12,
 718				.last = 0x15,
 719			},
 720			{
 721				.first = 0x18,
 722				.last = 0x18,
 723			},
 724			/* Latch registers should not be read here */
 725			{
 726				.first = 0x40,
 727				.last = 0x44,
 728			},
 729			{
 730				.first = 0x46,
 731				.last = 0x49,
 732			},
 733			{
 734				.first = 0x4B,
 735				.last = 0x4D,
 736			},
 737			{
 738				.first = 0x52,
 739				.last = 0x55,
 740			},
 741			{
 742				.first = 0x58,
 743				.last = 0x58,
 744			},
 745			/* LatchHier registers should not be read here */
 746		},
 747	},
 748	[AB8500_RTC] = {
 749		.num_ranges = 2,
 750		.range = (struct ab8500_reg_range[]) {
 751			{
 752				.first = 0x00,
 753				.last = 0x14,
 754			},
 755			{
 756				.first = 0x16,
 757				.last = 0x17,
 758			},
 759		},
 760	},
 761	[AB8500_MISC] = {
 762		.num_ranges = 8,
 763		.range = (struct ab8500_reg_range[]) {
 764			{
 765				.first = 0x00,
 766				.last = 0x06,
 767			},
 768			{
 769				.first = 0x10,
 770				.last = 0x16,
 771			},
 772			{
 773				.first = 0x20,
 774				.last = 0x26,
 775			},
 776			{
 777				.first = 0x30,
 778				.last = 0x36,
 779			},
 780			{
 781				.first = 0x40,
 782				.last = 0x46,
 783			},
 784			{
 785				.first = 0x50,
 786				.last = 0x50,
 787			},
 788			{
 789				.first = 0x60,
 790				.last = 0x6B,
 791			},
 792			{
 793				.first = 0x80,
 794				.last = 0x82,
 795			},
 796		},
 797	},
 798	[AB8500_DEVELOPMENT] = {
 799		.num_ranges = 2,
 800		.range = (struct ab8500_reg_range[]) {
 801			{
 802				.first = 0x00,
 803				.last = 0x00,
 804			},
 805			{
 806				.first = 0x05,
 807				.last = 0x05,
 808			},
 809		},
 810	},
 811	[AB8500_DEBUG] = {
 812		.num_ranges = 1,
 813		.range = (struct ab8500_reg_range[]) {
 814			{
 815				.first = 0x05,
 816				.last = 0x07,
 817			},
 818		},
 819	},
 820	[AB8500_PROD_TEST] = {
 821		.num_ranges = 0,
 822		.range = NULL,
 823	},
 824	[AB8500_STE_TEST] = {
 825		.num_ranges = 0,
 826		.range = NULL,
 827	},
 828	[AB8500_OTP_EMUL] = {
 829		.num_ranges = 1,
 830		.range = (struct ab8500_reg_range[]) {
 831			{
 832				.first = 0x01,
 833				.last = 0x15,
 834			},
 835		},
 836	},
 837};
 838
 839static struct ab8500_prcmu_ranges ab8540_debug_ranges[AB8500_NUM_BANKS] = {
 840	[AB8500_M_FSM_RANK] = {
 841		.num_ranges = 1,
 842		.range = (struct ab8500_reg_range[]) {
 843			{
 844				.first = 0x00,
 845				.last = 0x0B,
 846			},
 847		},
 848	},
 849	[AB8500_SYS_CTRL1_BLOCK] = {
 850		.num_ranges = 6,
 851		.range = (struct ab8500_reg_range[]) {
 852			{
 853				.first = 0x00,
 854				.last = 0x04,
 855			},
 856			{
 857				.first = 0x42,
 858				.last = 0x42,
 859			},
 860			{
 861				.first = 0x50,
 862				.last = 0x54,
 863			},
 864			{
 865				.first = 0x57,
 866				.last = 0x57,
 867			},
 868			{
 869				.first = 0x80,
 870				.last = 0x83,
 871			},
 872			{
 873				.first = 0x90,
 874				.last = 0x90,
 875			},
 876		},
 877	},
 878	[AB8500_SYS_CTRL2_BLOCK] = {
 879		.num_ranges = 5,
 880		.range = (struct ab8500_reg_range[]) {
 881			{
 882				.first = 0x00,
 883				.last = 0x0D,
 884			},
 885			{
 886				.first = 0x0F,
 887				.last = 0x10,
 888			},
 889			{
 890				.first = 0x20,
 891				.last = 0x21,
 892			},
 893			{
 894				.first = 0x32,
 895				.last = 0x3C,
 896			},
 897			{
 898				.first = 0x40,
 899				.last = 0x42,
 900			},
 901		},
 902	},
 903	[AB8500_REGU_CTRL1] = {
 904		.num_ranges = 4,
 905		.range = (struct ab8500_reg_range[]) {
 906			{
 907				.first = 0x03,
 908				.last = 0x15,
 909			},
 910			{
 911				.first = 0x20,
 912				.last = 0x20,
 913			},
 914			{
 915				.first = 0x80,
 916				.last = 0x85,
 917			},
 918			{
 919				.first = 0x87,
 920				.last = 0x88,
 921			},
 922		},
 923	},
 924	[AB8500_REGU_CTRL2] = {
 925		.num_ranges = 8,
 926		.range = (struct ab8500_reg_range[]) {
 927			{
 928				.first = 0x00,
 929				.last = 0x06,
 930			},
 931			{
 932				.first = 0x08,
 933				.last = 0x15,
 934			},
 935			{
 936				.first = 0x17,
 937				.last = 0x19,
 938			},
 939			{
 940				.first = 0x1B,
 941				.last = 0x1D,
 942			},
 943			{
 944				.first = 0x1F,
 945				.last = 0x2F,
 946			},
 947			{
 948				.first = 0x31,
 949				.last = 0x3A,
 950			},
 951			{
 952				.first = 0x43,
 953				.last = 0x44,
 954			},
 955			{
 956				.first = 0x48,
 957				.last = 0x49,
 958			},
 959		},
 960	},
 961	[AB8500_USB] = {
 962		.num_ranges = 3,
 963		.range = (struct ab8500_reg_range[]) {
 964			{
 965				.first = 0x80,
 966				.last = 0x83,
 967			},
 968			{
 969				.first = 0x87,
 970				.last = 0x8A,
 971			},
 972			{
 973				.first = 0x91,
 974				.last = 0x94,
 975			},
 976		},
 977	},
 978	[AB8500_TVOUT] = {
 979		.num_ranges = 0,
 980		.range = NULL
 981	},
 982	[AB8500_DBI] = {
 983		.num_ranges = 4,
 984		.range = (struct ab8500_reg_range[]) {
 985			{
 986				.first = 0x00,
 987				.last = 0x07,
 988			},
 989			{
 990				.first = 0x10,
 991				.last = 0x11,
 992			},
 993			{
 994				.first = 0x20,
 995				.last = 0x21,
 996			},
 997			{
 998				.first = 0x30,
 999				.last = 0x43,
1000			},
1001		},
1002	},
1003	[AB8500_ECI_AV_ACC] = {
1004		.num_ranges = 2,
1005		.range = (struct ab8500_reg_range[]) {
1006			{
1007				.first = 0x00,
1008				.last = 0x03,
1009			},
1010			{
1011				.first = 0x80,
1012				.last = 0x82,
1013			},
1014		},
1015	},
1016	[AB8500_RESERVED] = {
1017		.num_ranges = 0,
1018		.range = NULL,
1019	},
1020	[AB8500_GPADC] = {
1021		.num_ranges = 4,
1022		.range = (struct ab8500_reg_range[]) {
1023			{
1024				.first = 0x00,
1025				.last = 0x01,
1026			},
1027			{
1028				.first = 0x04,
1029				.last = 0x06,
1030			},
1031			{
1032				.first = 0x09,
1033				.last = 0x0A,
1034			},
1035			{
1036				.first = 0x10,
1037				.last = 0x14,
1038			},
1039		},
1040	},
1041	[AB8500_CHARGER] = {
1042		.num_ranges = 10,
1043		.range = (struct ab8500_reg_range[]) {
1044			{
1045				.first = 0x00,
1046				.last = 0x00,
1047			},
1048			{
1049				.first = 0x02,
1050				.last = 0x05,
1051			},
1052			{
1053				.first = 0x40,
1054				.last = 0x44,
1055			},
1056			{
1057				.first = 0x50,
1058				.last = 0x57,
1059			},
1060			{
1061				.first = 0x60,
1062				.last = 0x60,
1063			},
1064			{
1065				.first = 0x70,
1066				.last = 0x70,
1067			},
1068			{
1069				.first = 0xA0,
1070				.last = 0xA9,
1071			},
1072			{
1073				.first = 0xAF,
1074				.last = 0xB2,
1075			},
1076			{
1077				.first = 0xC0,
1078				.last = 0xC6,
1079			},
1080			{
1081				.first = 0xF5,
1082				.last = 0xF5,
1083			},
1084		},
1085	},
1086	[AB8500_GAS_GAUGE] = {
1087		.num_ranges = 3,
1088		.range = (struct ab8500_reg_range[]) {
1089			{
1090				.first = 0x00,
1091				.last = 0x00,
1092			},
1093			{
1094				.first = 0x07,
1095				.last = 0x0A,
1096			},
1097			{
1098				.first = 0x10,
1099				.last = 0x14,
1100			},
1101		},
1102	},
1103	[AB8500_AUDIO] = {
1104		.num_ranges = 1,
1105		.range = (struct ab8500_reg_range[]) {
1106			{
1107				.first = 0x00,
1108				.last = 0x9f,
1109			},
1110		},
1111	},
1112	[AB8500_INTERRUPT] = {
1113		.num_ranges = 6,
1114		.range = (struct ab8500_reg_range[]) {
1115			{
1116				.first = 0x00,
1117				.last = 0x05,
1118			},
1119			{
1120				.first = 0x0B,
1121				.last = 0x0D,
1122			},
1123			{
1124				.first = 0x12,
1125				.last = 0x20,
1126			},
1127			/* Latch registers should not be read here */
1128			{
1129				.first = 0x40,
1130				.last = 0x45,
1131			},
1132			{
1133				.first = 0x4B,
1134				.last = 0x4D,
1135			},
1136			{
1137				.first = 0x52,
1138				.last = 0x60,
1139			},
1140			/* LatchHier registers should not be read here */
1141		},
1142	},
1143	[AB8500_RTC] = {
1144		.num_ranges = 3,
1145		.range = (struct ab8500_reg_range[]) {
1146			{
1147				.first = 0x00,
1148				.last = 0x07,
1149			},
1150			{
1151				.first = 0x0B,
1152				.last = 0x18,
1153			},
1154			{
1155				.first = 0x20,
1156				.last = 0x25,
1157			},
1158		},
1159	},
1160	[AB8500_MISC] = {
1161		.num_ranges = 9,
1162		.range = (struct ab8500_reg_range[]) {
1163			{
1164				.first = 0x00,
1165				.last = 0x06,
1166			},
1167			{
1168				.first = 0x10,
1169				.last = 0x16,
1170			},
1171			{
1172				.first = 0x20,
1173				.last = 0x26,
1174			},
1175			{
1176				.first = 0x30,
1177				.last = 0x36,
1178			},
1179			{
1180				.first = 0x40,
1181				.last = 0x49,
1182			},
1183			{
1184				.first = 0x50,
1185				.last = 0x50,
1186			},
1187			{
1188				.first = 0x60,
1189				.last = 0x6B,
1190			},
1191			{
1192				.first = 0x70,
1193				.last = 0x74,
1194			},
1195			{
1196				.first = 0x80,
1197				.last = 0x82,
1198			},
1199		},
1200	},
1201	[AB8500_DEVELOPMENT] = {
1202		.num_ranges = 3,
1203		.range = (struct ab8500_reg_range[]) {
1204			{
1205				.first = 0x00,
1206				.last = 0x01,
1207			},
1208			{
1209				.first = 0x06,
1210				.last = 0x06,
1211			},
1212			{
1213				.first = 0x10,
1214				.last = 0x21,
1215			},
1216		},
1217	},
1218	[AB8500_DEBUG] = {
1219		.num_ranges = 3,
1220		.range = (struct ab8500_reg_range[]) {
1221			{
1222				.first = 0x01,
1223				.last = 0x0C,
1224			},
1225			{
1226				.first = 0x0E,
1227				.last = 0x11,
1228			},
1229			{
1230				.first = 0x80,
1231				.last = 0x81,
1232			},
1233		},
1234	},
1235	[AB8500_PROD_TEST] = {
1236		.num_ranges = 0,
1237		.range = NULL,
1238	},
1239	[AB8500_STE_TEST] = {
1240		.num_ranges = 0,
1241		.range = NULL,
1242	},
1243	[AB8500_OTP_EMUL] = {
1244		.num_ranges = 1,
1245		.range = (struct ab8500_reg_range[]) {
1246			{
1247				.first = 0x00,
1248				.last = 0x3F,
1249			},
1250		},
1251	},
1252};
1253
1254static irqreturn_t ab8500_debug_handler(int irq, void *data)
1255{
1256	char buf[16];
1257	struct kobject *kobj = (struct kobject *)data;
1258	unsigned int irq_abb = irq - irq_first;
1259
1260	if (irq_abb < num_irqs)
1261		irq_count[irq_abb]++;
1262	/*
1263	 * This makes it possible to use poll for events (EPOLLPRI | EPOLLERR)
1264	 * from userspace on sysfs file named <irq-nr>
1265	 */
1266	sprintf(buf, "%d", irq);
1267	sysfs_notify(kobj, NULL, buf);
1268
1269	return IRQ_HANDLED;
1270}
1271
1272/* Prints to seq_file or log_buf */
1273static int ab8500_registers_print(struct device *dev, u32 bank,
1274				  struct seq_file *s)
1275{
1276	unsigned int i;
1277
 
1278	for (i = 0; i < debug_ranges[bank].num_ranges; i++) {
1279		u32 reg;
1280
1281		for (reg = debug_ranges[bank].range[i].first;
1282			reg <= debug_ranges[bank].range[i].last;
1283			reg++) {
1284			u8 value;
1285			int err;
1286
1287			err = abx500_get_register_interruptible(dev,
1288				(u8)bank, (u8)reg, &value);
1289			if (err < 0) {
1290				dev_err(dev, "ab->read fail %d\n", err);
1291				return err;
1292			}
1293
1294			if (s) {
1295				seq_printf(s, "  [0x%02X/0x%02X]: 0x%02X\n",
1296					   bank, reg, value);
1297				/*
1298				 * Error is not returned here since
1299				 * the output is wanted in any case
1300				 */
1301				if (seq_has_overflowed(s))
1302					return 0;
1303			} else {
1304				dev_info(dev, " [0x%02X/0x%02X]: 0x%02X\n",
1305					 bank, reg, value);
1306			}
1307		}
1308	}
1309
1310	return 0;
1311}
1312
1313static int ab8500_bank_registers_show(struct seq_file *s, void *p)
1314{
1315	struct device *dev = s->private;
1316	u32 bank = debug_bank;
1317
1318	seq_puts(s, AB8500_NAME_STRING " register values:\n");
1319
1320	seq_printf(s, " bank 0x%02X:\n", bank);
1321
1322	return ab8500_registers_print(dev, bank, s);
1323}
1324
1325DEFINE_SHOW_ATTRIBUTE(ab8500_bank_registers);
1326
1327static int ab8500_print_all_banks(struct seq_file *s, void *p)
1328{
1329	struct device *dev = s->private;
1330	unsigned int i;
1331
1332	seq_puts(s, AB8500_NAME_STRING " register values:\n");
1333
1334	for (i = 0; i < AB8500_NUM_BANKS; i++) {
1335		int err;
1336
1337		seq_printf(s, " bank 0x%02X:\n", i);
1338		err = ab8500_registers_print(dev, i, s);
1339		if (err)
1340			return err;
1341	}
1342	return 0;
1343}
1344
1345/* Dump registers to kernel log */
1346void ab8500_dump_all_banks(struct device *dev)
1347{
1348	unsigned int i;
1349
1350	dev_info(dev, "ab8500 register values:\n");
1351
1352	for (i = 1; i < AB8500_NUM_BANKS; i++) {
1353		dev_info(dev, " bank 0x%02X:\n", i);
1354		ab8500_registers_print(dev, i, NULL);
1355	}
1356}
1357
1358static int ab8500_all_banks_open(struct inode *inode, struct file *file)
1359{
1360	struct seq_file *s;
1361	int err;
1362
1363	err = single_open(file, ab8500_print_all_banks, inode->i_private);
1364	if (!err) {
1365		/* Default buf size in seq_read is not enough */
1366		s = (struct seq_file *)file->private_data;
1367		s->size = (PAGE_SIZE * 2);
1368		s->buf = kmalloc(s->size, GFP_KERNEL);
1369		if (!s->buf) {
1370			single_release(inode, file);
1371			err = -ENOMEM;
1372		}
1373	}
1374	return err;
1375}
1376
1377static const struct file_operations ab8500_all_banks_fops = {
1378	.open = ab8500_all_banks_open,
1379	.read = seq_read,
1380	.llseek = seq_lseek,
1381	.release = single_release,
1382	.owner = THIS_MODULE,
1383};
1384
1385static int ab8500_bank_print(struct seq_file *s, void *p)
1386{
1387	seq_printf(s, "0x%02X\n", debug_bank);
1388	return 0;
1389}
1390
1391static int ab8500_bank_open(struct inode *inode, struct file *file)
1392{
1393	return single_open(file, ab8500_bank_print, inode->i_private);
1394}
1395
1396static ssize_t ab8500_bank_write(struct file *file,
1397	const char __user *user_buf,
1398	size_t count, loff_t *ppos)
1399{
1400	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1401	unsigned long user_bank;
1402	int err;
1403
 
1404	err = kstrtoul_from_user(user_buf, count, 0, &user_bank);
1405	if (err)
1406		return err;
1407
1408	if (user_bank >= AB8500_NUM_BANKS) {
1409		dev_err(dev, "debugfs error input > number of banks\n");
1410		return -EINVAL;
1411	}
1412
1413	debug_bank = user_bank;
1414
1415	return count;
1416}
1417
1418static int ab8500_address_print(struct seq_file *s, void *p)
1419{
1420	seq_printf(s, "0x%02X\n", debug_address);
1421	return 0;
1422}
1423
1424static int ab8500_address_open(struct inode *inode, struct file *file)
1425{
1426	return single_open(file, ab8500_address_print, inode->i_private);
1427}
1428
1429static ssize_t ab8500_address_write(struct file *file,
1430				    const char __user *user_buf,
1431				    size_t count, loff_t *ppos)
1432{
1433	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1434	unsigned long user_address;
1435	int err;
1436
 
1437	err = kstrtoul_from_user(user_buf, count, 0, &user_address);
1438	if (err)
1439		return err;
1440
1441	if (user_address > 0xff) {
1442		dev_err(dev, "debugfs error input > 0xff\n");
1443		return -EINVAL;
1444	}
1445	debug_address = user_address;
1446
1447	return count;
1448}
1449
1450static int ab8500_val_print(struct seq_file *s, void *p)
1451{
1452	struct device *dev = s->private;
1453	int ret;
1454	u8 regvalue;
1455
1456	ret = abx500_get_register_interruptible(dev,
1457		(u8)debug_bank, (u8)debug_address, &regvalue);
1458	if (ret < 0) {
1459		dev_err(dev, "abx500_get_reg fail %d, %d\n",
1460			ret, __LINE__);
1461		return -EINVAL;
1462	}
1463	seq_printf(s, "0x%02X\n", regvalue);
1464
1465	return 0;
1466}
1467
1468static int ab8500_val_open(struct inode *inode, struct file *file)
1469{
1470	return single_open(file, ab8500_val_print, inode->i_private);
1471}
1472
1473static ssize_t ab8500_val_write(struct file *file,
1474				const char __user *user_buf,
1475				size_t count, loff_t *ppos)
1476{
1477	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1478	unsigned long user_val;
1479	int err;
1480
 
1481	err = kstrtoul_from_user(user_buf, count, 0, &user_val);
1482	if (err)
1483		return err;
1484
1485	if (user_val > 0xff) {
1486		dev_err(dev, "debugfs error input > 0xff\n");
1487		return -EINVAL;
1488	}
1489	err = abx500_set_register_interruptible(dev,
1490		(u8)debug_bank, debug_address, (u8)user_val);
1491	if (err < 0) {
1492		pr_err("abx500_set_reg failed %d, %d", err, __LINE__);
1493		return -EINVAL;
1494	}
1495
1496	return count;
1497}
1498
1499/*
1500 * Interrupt status
1501 */
1502static u32 num_interrupts[AB8500_MAX_NR_IRQS];
1503static u32 num_wake_interrupts[AB8500_MAX_NR_IRQS];
1504static int num_interrupt_lines;
1505
1506void ab8500_debug_register_interrupt(int line)
1507{
1508	if (line < num_interrupt_lines)
1509		num_interrupts[line]++;
1510}
1511
1512static int ab8500_interrupts_show(struct seq_file *s, void *p)
1513{
1514	int line;
1515
1516	seq_puts(s, "name: number: irq: number of: wake:\n");
1517
1518	for (line = 0; line < num_interrupt_lines; line++) {
1519		seq_printf(s, "%3i:  %4i %6i %4i\n",
1520			   line,
1521			   line + irq_first,
1522			   num_interrupts[line],
1523			   num_wake_interrupts[line]);
1524	}
1525
1526	return 0;
1527}
1528
1529DEFINE_SHOW_ATTRIBUTE(ab8500_interrupts);
1530
1531/*
1532 * - HWREG DB8500 formated routines
1533 */
1534static int ab8500_hwreg_print(struct seq_file *s, void *d)
1535{
1536	struct device *dev = s->private;
1537	int ret;
1538	u8 regvalue;
1539
1540	ret = abx500_get_register_interruptible(dev,
1541		(u8)hwreg_cfg.bank, (u8)hwreg_cfg.addr, &regvalue);
1542	if (ret < 0) {
1543		dev_err(dev, "abx500_get_reg fail %d, %d\n",
1544			ret, __LINE__);
1545		return -EINVAL;
1546	}
1547
1548	if (hwreg_cfg.shift >= 0)
1549		regvalue >>= hwreg_cfg.shift;
1550	else
1551		regvalue <<= -hwreg_cfg.shift;
1552	regvalue &= hwreg_cfg.mask;
1553
1554	if (REG_FMT_DEC(&hwreg_cfg))
1555		seq_printf(s, "%d\n", regvalue);
1556	else
1557		seq_printf(s, "0x%02X\n", regvalue);
1558	return 0;
1559}
1560
1561static int ab8500_hwreg_open(struct inode *inode, struct file *file)
1562{
1563	return single_open(file, ab8500_hwreg_print, inode->i_private);
1564}
1565
1566#define AB8500_SUPPLY_CONTROL_CONFIG_1 0x01
1567#define AB8500_SUPPLY_CONTROL_REG 0x00
1568#define AB8500_FIRST_SIM_REG 0x80
1569#define AB8500_LAST_SIM_REG 0x8B
1570#define AB8505_LAST_SIM_REG 0x8C
1571
1572static int ab8500_modem_show(struct seq_file *s, void *p)
1573{
1574	struct device *dev = s->private;
1575	struct ab8500 *ab8500;
1576	int err;
1577	u8 value;
1578	u8 orig_value;
1579	u32 bank = AB8500_REGU_CTRL2;
1580	u32 last_sim_reg = AB8500_LAST_SIM_REG;
1581	u32 reg;
1582
1583	ab8500 = dev_get_drvdata(dev->parent);
1584	dev_warn(dev, "WARNING! This operation can interfer with modem side\n"
1585		"and should only be done with care\n");
1586
1587	err = abx500_get_register_interruptible(dev,
1588		AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, &orig_value);
1589	if (err < 0)
1590		goto report_read_failure;
1591
1592	/* Config 1 will allow APE side to read SIM registers */
1593	err = abx500_set_register_interruptible(dev,
1594		AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG,
1595		AB8500_SUPPLY_CONTROL_CONFIG_1);
1596	if (err < 0)
1597		goto report_write_failure;
1598
1599	seq_printf(s, " bank 0x%02X:\n", bank);
1600
1601	if (is_ab9540(ab8500) || is_ab8505(ab8500))
1602		last_sim_reg = AB8505_LAST_SIM_REG;
1603
1604	for (reg = AB8500_FIRST_SIM_REG; reg <= last_sim_reg; reg++) {
1605		err = abx500_get_register_interruptible(dev,
1606			bank, reg, &value);
1607		if (err < 0)
1608			goto report_read_failure;
1609
1610		seq_printf(s, "  [0x%02X/0x%02X]: 0x%02X\n", bank, reg, value);
1611	}
1612	err = abx500_set_register_interruptible(dev,
1613		AB8500_REGU_CTRL1, AB8500_SUPPLY_CONTROL_REG, orig_value);
1614	if (err < 0)
1615		goto report_write_failure;
1616
1617	return 0;
1618
1619report_read_failure:
1620	dev_err(dev, "ab->read fail %d\n", err);
1621	return err;
1622
1623report_write_failure:
1624	dev_err(dev, "ab->write fail %d\n", err);
1625	return err;
1626}
1627
1628DEFINE_SHOW_ATTRIBUTE(ab8500_modem);
1629
1630/*
1631 * return length of an ASCII numerical value, 0 is string is not a
1632 * numerical value.
1633 * string shall start at value 1st char.
1634 * string can be tailed with \0 or space or newline chars only.
1635 * value can be decimal or hexadecimal (prefixed 0x or 0X).
1636 */
1637static int strval_len(char *b)
1638{
1639	char *s = b;
1640
1641	if ((*s == '0') && ((*(s+1) == 'x') || (*(s+1) == 'X'))) {
1642		s += 2;
1643		for (; *s && (*s != ' ') && (*s != '\n'); s++) {
1644			if (!isxdigit(*s))
1645				return 0;
1646		}
1647	} else {
1648		if (*s == '-')
1649			s++;
1650		for (; *s && (*s != ' ') && (*s != '\n'); s++) {
1651			if (!isdigit(*s))
1652				return 0;
1653		}
1654	}
1655	return (int) (s-b);
1656}
1657
1658/*
1659 * parse hwreg input data.
1660 * update global hwreg_cfg only if input data syntax is ok.
1661 */
1662static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg,
1663		struct device *dev)
1664{
1665	uint write, val = 0;
1666	u8  regvalue;
1667	int ret;
1668	struct hwreg_cfg loc = {
1669		.bank = 0,          /* default: invalid phys addr */
1670		.addr = 0,          /* default: invalid phys addr */
1671		.fmt = 0,           /* default: 32bit access, hex output */
1672		.mask = 0xFFFFFFFF, /* default: no mask */
1673		.shift = 0,         /* default: no bit shift */
1674	};
1675
1676	/* read or write ? */
1677	if (!strncmp(b, "read ", 5)) {
1678		write = 0;
1679		b += 5;
1680	} else if (!strncmp(b, "write ", 6)) {
1681		write = 1;
1682		b += 6;
1683	} else
1684		return -EINVAL;
1685
1686	/* OPTIONS -l|-w|-b -s -m -o */
1687	while ((*b == ' ') || (*b == '-')) {
1688		if (*(b-1) != ' ') {
1689			b++;
1690			continue;
1691		}
1692		if ((!strncmp(b, "-d ", 3)) ||
1693				(!strncmp(b, "-dec ", 5))) {
1694			b += (*(b+2) == ' ') ? 3 : 5;
1695			loc.fmt |= (1<<0);
1696		} else if ((!strncmp(b, "-h ", 3)) ||
1697				(!strncmp(b, "-hex ", 5))) {
1698			b += (*(b+2) == ' ') ? 3 : 5;
1699			loc.fmt &= ~(1<<0);
1700		} else if ((!strncmp(b, "-m ", 3)) ||
1701				(!strncmp(b, "-mask ", 6))) {
1702			b += (*(b+2) == ' ') ? 3 : 6;
1703			if (strval_len(b) == 0)
1704				return -EINVAL;
1705			ret = kstrtoul(b, 0, &loc.mask);
1706			if (ret)
1707				return ret;
1708		} else if ((!strncmp(b, "-s ", 3)) ||
1709				(!strncmp(b, "-shift ", 7))) {
1710			b += (*(b+2) == ' ') ? 3 : 7;
1711			if (strval_len(b) == 0)
1712				return -EINVAL;
1713			ret = kstrtol(b, 0, &loc.shift);
1714			if (ret)
1715				return ret;
1716		} else {
1717			return -EINVAL;
1718		}
1719	}
1720	/* get arg BANK and ADDRESS */
1721	if (strval_len(b) == 0)
1722		return -EINVAL;
1723	ret = kstrtouint(b, 0, &loc.bank);
1724	if (ret)
1725		return ret;
1726	while (*b == ' ')
1727		b++;
1728	if (strval_len(b) == 0)
1729		return -EINVAL;
1730	ret = kstrtoul(b, 0, &loc.addr);
1731	if (ret)
1732		return ret;
1733
1734	if (write) {
1735		while (*b == ' ')
1736			b++;
1737		if (strval_len(b) == 0)
1738			return -EINVAL;
1739		ret = kstrtouint(b, 0, &val);
1740		if (ret)
1741			return ret;
1742	}
1743
1744	/* args are ok, update target cfg (mainly for read) */
1745	*cfg = loc;
1746
1747#ifdef ABB_HWREG_DEBUG
1748	pr_warn("HWREG request: %s, %s,\n", (write) ? "write" : "read",
1749		REG_FMT_DEC(cfg) ? "decimal" : "hexa");
1750	pr_warn("  addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n",
1751		cfg->addr, cfg->mask, cfg->shift, val);
1752#endif
1753
1754	if (!write)
1755		return 0;
1756
1757	ret = abx500_get_register_interruptible(dev,
1758			(u8)cfg->bank, (u8)cfg->addr, &regvalue);
1759	if (ret < 0) {
1760		dev_err(dev, "abx500_get_reg fail %d, %d\n",
1761			ret, __LINE__);
1762		return -EINVAL;
1763	}
1764
1765	if (cfg->shift >= 0) {
1766		regvalue &= ~(cfg->mask << (cfg->shift));
1767		val = (val & cfg->mask) << (cfg->shift);
1768	} else {
1769		regvalue &= ~(cfg->mask >> (-cfg->shift));
1770		val = (val & cfg->mask) >> (-cfg->shift);
1771	}
1772	val = val | regvalue;
1773
1774	ret = abx500_set_register_interruptible(dev,
1775			(u8)cfg->bank, (u8)cfg->addr, (u8)val);
1776	if (ret < 0) {
1777		pr_err("abx500_set_reg failed %d, %d", ret, __LINE__);
1778		return -EINVAL;
1779	}
1780
1781	return 0;
1782}
1783
1784static ssize_t ab8500_hwreg_write(struct file *file,
1785	const char __user *user_buf, size_t count, loff_t *ppos)
1786{
1787	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1788	char buf[128];
1789	int buf_size, ret;
1790
1791	/* Get userspace string and assure termination */
1792	buf_size = min((int)count, (int)(sizeof(buf)-1));
1793	if (copy_from_user(buf, user_buf, buf_size))
1794		return -EFAULT;
1795	buf[buf_size] = 0;
1796
1797	/* get args and process */
1798	ret = hwreg_common_write(buf, &hwreg_cfg, dev);
1799	return (ret) ? ret : buf_size;
1800}
1801
1802/*
1803 * - irq subscribe/unsubscribe stuff
1804 */
1805static int ab8500_subscribe_unsubscribe_print(struct seq_file *s, void *p)
1806{
1807	seq_printf(s, "%d\n", irq_first);
1808
1809	return 0;
1810}
1811
1812static int ab8500_subscribe_unsubscribe_open(struct inode *inode,
1813					     struct file *file)
1814{
1815	return single_open(file, ab8500_subscribe_unsubscribe_print,
1816		inode->i_private);
1817}
1818
1819/*
1820 * Userspace should use poll() on this file. When an event occur
1821 * the blocking poll will be released.
1822 */
1823static ssize_t show_irq(struct device *dev,
1824			struct device_attribute *attr, char *buf)
1825{
1826	unsigned long name;
1827	unsigned int irq_index;
1828	int err;
1829
1830	err = kstrtoul(attr->attr.name, 0, &name);
1831	if (err)
1832		return err;
1833
1834	irq_index = name - irq_first;
1835	if (irq_index >= num_irqs)
1836		return -EINVAL;
1837
1838	return sprintf(buf, "%u\n", irq_count[irq_index]);
1839}
1840
1841static ssize_t ab8500_subscribe_write(struct file *file,
1842				      const char __user *user_buf,
1843				      size_t count, loff_t *ppos)
1844{
1845	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1846	unsigned long user_val;
1847	int err;
1848	unsigned int irq_index;
1849
1850	err = kstrtoul_from_user(user_buf, count, 0, &user_val);
1851	if (err)
1852		return err;
1853
1854	if (user_val < irq_first) {
1855		dev_err(dev, "debugfs error input < %d\n", irq_first);
1856		return -EINVAL;
1857	}
1858	if (user_val > irq_last) {
1859		dev_err(dev, "debugfs error input > %d\n", irq_last);
1860		return -EINVAL;
1861	}
1862
1863	irq_index = user_val - irq_first;
1864	if (irq_index >= num_irqs)
1865		return -EINVAL;
1866
1867	/*
1868	 * This will create a sysfs file named <irq-nr> which userspace can
1869	 * use to select or poll and get the AB8500 events
1870	 */
1871	dev_attr[irq_index] = kmalloc(sizeof(struct device_attribute),
1872		GFP_KERNEL);
1873	if (!dev_attr[irq_index])
1874		return -ENOMEM;
1875
1876	event_name[irq_index] = kasprintf(GFP_KERNEL, "%lu", user_val);
1877	if (!event_name[irq_index])
1878		return -ENOMEM;
1879
1880	dev_attr[irq_index]->show = show_irq;
1881	dev_attr[irq_index]->store = NULL;
1882	dev_attr[irq_index]->attr.name = event_name[irq_index];
1883	dev_attr[irq_index]->attr.mode = S_IRUGO;
1884	err = sysfs_create_file(&dev->kobj, &dev_attr[irq_index]->attr);
1885	if (err < 0) {
1886		pr_info("sysfs_create_file failed %d\n", err);
1887		return err;
1888	}
1889
1890	err = request_threaded_irq(user_val, NULL, ab8500_debug_handler,
1891				   IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
1892				   "ab8500-debug", &dev->kobj);
1893	if (err < 0) {
1894		pr_info("request_threaded_irq failed %d, %lu\n",
1895			err, user_val);
1896		sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr);
1897		return err;
1898	}
1899
1900	return count;
1901}
1902
1903static ssize_t ab8500_unsubscribe_write(struct file *file,
1904					const char __user *user_buf,
1905					size_t count, loff_t *ppos)
1906{
1907	struct device *dev = ((struct seq_file *)(file->private_data))->private;
1908	unsigned long user_val;
1909	int err;
1910	unsigned int irq_index;
1911
1912	err = kstrtoul_from_user(user_buf, count, 0, &user_val);
1913	if (err)
1914		return err;
1915
1916	if (user_val < irq_first) {
1917		dev_err(dev, "debugfs error input < %d\n", irq_first);
1918		return -EINVAL;
1919	}
1920	if (user_val > irq_last) {
1921		dev_err(dev, "debugfs error input > %d\n", irq_last);
1922		return -EINVAL;
1923	}
1924
1925	irq_index = user_val - irq_first;
1926	if (irq_index >= num_irqs)
1927		return -EINVAL;
1928
1929	/* Set irq count to 0 when unsubscribe */
1930	irq_count[irq_index] = 0;
1931
1932	if (dev_attr[irq_index])
1933		sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr);
1934
1935
1936	free_irq(user_val, &dev->kobj);
1937	kfree(event_name[irq_index]);
1938	kfree(dev_attr[irq_index]);
1939
1940	return count;
1941}
1942
1943/*
1944 * - several debugfs nodes fops
1945 */
1946
1947static const struct file_operations ab8500_bank_fops = {
1948	.open = ab8500_bank_open,
1949	.write = ab8500_bank_write,
1950	.read = seq_read,
1951	.llseek = seq_lseek,
1952	.release = single_release,
1953	.owner = THIS_MODULE,
1954};
1955
1956static const struct file_operations ab8500_address_fops = {
1957	.open = ab8500_address_open,
1958	.write = ab8500_address_write,
1959	.read = seq_read,
1960	.llseek = seq_lseek,
1961	.release = single_release,
1962	.owner = THIS_MODULE,
1963};
1964
1965static const struct file_operations ab8500_val_fops = {
1966	.open = ab8500_val_open,
1967	.write = ab8500_val_write,
1968	.read = seq_read,
1969	.llseek = seq_lseek,
1970	.release = single_release,
1971	.owner = THIS_MODULE,
1972};
1973
1974static const struct file_operations ab8500_subscribe_fops = {
1975	.open = ab8500_subscribe_unsubscribe_open,
1976	.write = ab8500_subscribe_write,
1977	.read = seq_read,
1978	.llseek = seq_lseek,
1979	.release = single_release,
1980	.owner = THIS_MODULE,
1981};
1982
1983static const struct file_operations ab8500_unsubscribe_fops = {
1984	.open = ab8500_subscribe_unsubscribe_open,
1985	.write = ab8500_unsubscribe_write,
1986	.read = seq_read,
1987	.llseek = seq_lseek,
1988	.release = single_release,
1989	.owner = THIS_MODULE,
1990};
1991
1992static const struct file_operations ab8500_hwreg_fops = {
1993	.open = ab8500_hwreg_open,
1994	.write = ab8500_hwreg_write,
1995	.read = seq_read,
1996	.llseek = seq_lseek,
1997	.release = single_release,
1998	.owner = THIS_MODULE,
1999};
2000
2001static int ab8500_debug_probe(struct platform_device *plf)
2002{
2003	struct dentry *ab8500_dir;
2004	struct ab8500 *ab8500;
2005	struct resource *res;
2006
2007	debug_bank = AB8500_MISC;
2008	debug_address = AB8500_REV_REG & 0x00FF;
2009
2010	ab8500 = dev_get_drvdata(plf->dev.parent);
2011	num_irqs = ab8500->mask_size;
 
2012
2013	irq_count = devm_kcalloc(&plf->dev,
2014				 num_irqs, sizeof(*irq_count), GFP_KERNEL);
2015	if (!irq_count)
2016		return -ENOMEM;
2017
2018	dev_attr = devm_kcalloc(&plf->dev,
2019				num_irqs, sizeof(*dev_attr), GFP_KERNEL);
2020	if (!dev_attr)
2021		return -ENOMEM;
2022
2023	event_name = devm_kcalloc(&plf->dev,
2024				  num_irqs, sizeof(*event_name), GFP_KERNEL);
2025	if (!event_name)
2026		return -ENOMEM;
2027
2028	res = platform_get_resource_byname(plf, 0, "IRQ_AB8500");
2029	if (!res) {
2030		dev_err(&plf->dev, "AB8500 irq not found, err %d\n", irq_first);
2031		return -ENXIO;
2032	}
2033	irq_ab8500 = res->start;
2034
2035	irq_first = platform_get_irq_byname(plf, "IRQ_FIRST");
2036	if (irq_first < 0)
2037		return irq_first;
2038
2039	irq_last = platform_get_irq_byname(plf, "IRQ_LAST");
2040	if (irq_last < 0)
2041		return irq_last;
2042
2043	ab8500_dir = debugfs_create_dir(AB8500_NAME_STRING, NULL);
2044
2045	debugfs_create_file("all-bank-registers", S_IRUGO, ab8500_dir,
2046			    &plf->dev, &ab8500_bank_registers_fops);
2047	debugfs_create_file("all-banks", S_IRUGO, ab8500_dir,
2048			    &plf->dev, &ab8500_all_banks_fops);
2049	debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR | S_IWGRP),
2050			    ab8500_dir, &plf->dev, &ab8500_bank_fops);
2051	debugfs_create_file("register-address", (S_IRUGO | S_IWUSR | S_IWGRP),
2052			    ab8500_dir, &plf->dev, &ab8500_address_fops);
2053	debugfs_create_file("register-value", (S_IRUGO | S_IWUSR | S_IWGRP),
2054			    ab8500_dir, &plf->dev, &ab8500_val_fops);
2055	debugfs_create_file("irq-subscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
2056			    ab8500_dir, &plf->dev, &ab8500_subscribe_fops);
2057
2058	if (is_ab8500(ab8500)) {
2059		debug_ranges = ab8500_debug_ranges;
2060		num_interrupt_lines = AB8500_NR_IRQS;
2061	} else if (is_ab8505(ab8500)) {
2062		debug_ranges = ab8505_debug_ranges;
2063		num_interrupt_lines = AB8505_NR_IRQS;
2064	} else if (is_ab9540(ab8500)) {
2065		debug_ranges = ab8505_debug_ranges;
2066		num_interrupt_lines = AB9540_NR_IRQS;
2067	} else if (is_ab8540(ab8500)) {
2068		debug_ranges = ab8540_debug_ranges;
2069		num_interrupt_lines = AB8540_NR_IRQS;
2070	}
2071
2072	debugfs_create_file("interrupts", (S_IRUGO), ab8500_dir, &plf->dev,
2073			    &ab8500_interrupts_fops);
2074	debugfs_create_file("irq-unsubscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
2075			    ab8500_dir, &plf->dev, &ab8500_unsubscribe_fops);
2076	debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir,
2077			    &plf->dev, &ab8500_hwreg_fops);
2078	debugfs_create_file("all-modem-registers", (S_IRUGO | S_IWUSR | S_IWGRP),
2079			    ab8500_dir, &plf->dev, &ab8500_modem_fops);
 
 
 
 
 
 
 
 
 
 
 
 
2080
2081	return 0;
2082}
2083
2084static struct platform_driver ab8500_debug_driver = {
2085	.driver = {
2086		.name = "ab8500-debug",
2087		.suppress_bind_attrs = true,
2088	},
2089	.probe  = ab8500_debug_probe,
 
2090};
2091
2092static int __init ab8500_debug_init(void)
2093{
2094	return platform_driver_register(&ab8500_debug_driver);
2095}
 
 
 
 
 
2096subsys_initcall(ab8500_debug_init);