194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij/*
294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij * Copyright (C) 2011 ST-Ericsson
394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij * License terms: GNU General Public License (GPL) version 2
494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij * Debugfs support for the AB5500 MFD driver
594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij */
694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
7858a6303f2b14945447a964563f54c918ef3927eAxel Lin#include <linux/module.h>
894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include <linux/debugfs.h>
994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include <linux/seq_file.h>
1094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include <linux/mfd/abx500.h>
11ee66e653ca7425bc8ffca4e00f19a8057cd14e4dLinus Walleij#include <linux/mfd/abx500/ab5500.h>
1294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include <linux/uaccess.h>
1394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
1494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include "ab5500-core.h"
1594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij#include "ab5500-debugfs.h"
1694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
1794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct ab5500_i2c_ranges ab5500_reg_ranges[AB5500_NUM_BANKS] = {
1894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_LED] = {
1994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_LED,
2094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 1,
2194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
2294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
2394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
2494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x0C,
2594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
2694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
2794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
2894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
2994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_ADC] = {
3094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_ADC,
3194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 6,
3294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
3394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
3494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x1F,
3594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x22,
3694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
3794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
3894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
3994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x23,
4094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x24,
4194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
4294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
4394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
4494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x26,
4594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x2D,
4694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
4794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
4894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
4994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x2F,
5094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x34,
5194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
5294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
5394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
5494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x37,
5594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x57,
5694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
5794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
5894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
5994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x58,
6094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x58,
6194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
6294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
6394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
6494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
6594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_RTC] = {
6694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_RTC,
6794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 2,
6894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
6994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
7094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
7194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x04,
7294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
7394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
7494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
7594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x06,
7694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x0C,
7794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
7894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
7994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
8094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
8194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_STARTUP] = {
8294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_STARTUP,
8394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 12,
8494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
8594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
8694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
8794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x01,
8894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
8994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
9094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
9194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x1F,
9294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x1F,
9394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
9494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
9594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
9694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x2E,
9794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x2E,
9894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
9994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
10094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
10194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x2F,
10294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x30,
10394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
10494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
10594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
10694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x50,
10794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x51,
10894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
10994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
11094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
11194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x60,
11294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x61,
11394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
11494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
11594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
11694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x66,
11794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x8A,
11894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
11994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
12094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
12194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x8C,
12294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x96,
12394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
12494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
12594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
12694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xAA,
12794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xB4,
12894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
12994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
13094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
13194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xB7,
13294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xBF,
13394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
13494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
13594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
13694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xC1,
13794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xCA,
13894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
13994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
14094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
14194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xD3,
14294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xE0,
14394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
14494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
14594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
14694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
14794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_DBI_ECI] = {
14894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_DBI_ECI,
14994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 3,
15094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
15194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
15294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
15394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x07,
15494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
15594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
15694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
15794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x10,
15894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x10,
15994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
16094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
16194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
16294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x13,
16394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x13,
16494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
16594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
16694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
16794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
16894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_CHG] = {
16994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_CHG,
17094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 2,
17194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
17294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
17394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x11,
17494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x11,
17594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
17694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
17794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
17894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x12,
17994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x1B,
18094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
18194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
18294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
18394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
18494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_FG_BATTCOM_ACC] = {
18594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_FG_BATTCOM_ACC,
18694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 2,
18794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
18894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
18994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
19094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x0B,
19194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
19294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
19394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
19494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x0C,
19594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x10,
19694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
19794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
19894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
19994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
20094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_USB] = {
20194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_USB,
20294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 12,
20394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
20494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
20594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x01,
20694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x01,
20794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
20894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
20994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
21094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x80,
21194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x83,
21294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
21394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
21494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
21594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x87,
21694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x8A,
21794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
21894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
21994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
22094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x8B,
22194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x8B,
22294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
22394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
22494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
22594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x91,
22694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x92,
22794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
22894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
22994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
23094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x93,
23194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x93,
23294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
23394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
23494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
23594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x94,
23694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x94,
23794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
23894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
23994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
24094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xA8,
24194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xB0,
24294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
24394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
24494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
24594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xB2,
24694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xB2,
24794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
24894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
24994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
25094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xB4,
25194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xBC,
25294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
25394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
25494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
25594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xBF,
25694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xBF,
25794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
25894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
25994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
26094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xC1,
26194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xC5,
26294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
26394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
26494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
26594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
26694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_IT] = {
26794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_IT,
26894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 4,
26994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
27094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
27194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
27294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x02,
27394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
27494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
27594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
27694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x20,
27794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x36,
27894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
27994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
28094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
28194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x40,
28294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x56,
28394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
28494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
28594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
28694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x60,
28794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x76,
28894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
28994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
29094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
29194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
29294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_VDDDIG_IO_I2C_CLK_TST] = {
29394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_VDDDIG_IO_I2C_CLK_TST,
29494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 7,
29594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
29694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
29794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x02,
29894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x02,
29994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
30094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
30194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
30294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x12,
30394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x12,
30494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
30594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
30694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
30794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x30,
30894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x34,
30994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
31094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
31194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
31294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x40,
31394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x44,
31494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
31594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
31694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
31794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x50,
31894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x54,
31994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
32094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
32194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
32294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x60,
32394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x64,
32494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
32594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
32694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
32794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x70,
32894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x74,
32994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
33094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
33194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
33294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
33394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP] = {
33494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP,
33594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 13,
33694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
33794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
33894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x01,
33994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x01,
34094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
34194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
34294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
34394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x02,
34494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x02,
34594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
34694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
34794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
34894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x0D,
34994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x0F,
35094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
35194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
35294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
35394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x1C,
35494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x1C,
35594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
35694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
35794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
35894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x1E,
35994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x1E,
36094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
36194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
36294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
36394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x20,
36494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x21,
36594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
36694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
36794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
36894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x25,
36994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x25,
37094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
37194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
37294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
37394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x28,
37494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x2A,
37594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
37694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
37794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
37894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x30,
37994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x33,
38094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
38194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
38294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
38394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x40,
38494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x43,
38594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
38694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
38794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
38894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x50,
38994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x53,
39094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
39194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
39294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
39394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x60,
39494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x63,
39594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
39694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
39794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
39894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x70,
39994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x73,
40094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
40194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
40294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
40394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
40494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_VIBRA] = {
40594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_VIBRA,
40694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 2,
40794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
40894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
40994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x10,
41094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x13,
41194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
41294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
41394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
41494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xFE,
41594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xFE,
41694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
41794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
41894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
41994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
42094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_AUDIO_HEADSETUSB] = {
42194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_AUDIO_HEADSETUSB,
42294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 2,
42394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
42494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
42594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
42694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x48,
42794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
42894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
42994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
43094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0xEB,
43194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0xFB,
43294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
43394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
43494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
43594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
43694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_SIM_USBSIM] = {
43794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_SIM_USBSIM,
43894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 1,
43994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
44094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
44194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x13,
44294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x19,
44394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
44494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
44594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
44694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
44794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	[AB5500_BANK_VDENC] = {
44894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.bankid = AB5500_BANK_VDENC,
44994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.nranges = 12,
45094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		.range = (struct ab5500_reg_range[]) {
45194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
45294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x00,
45394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x08,
45494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
45594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
45694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
45794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x09,
45894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x09,
45994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RO,
46094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
46194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
46294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x0A,
46394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x12,
46494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
46594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
46694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
46794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x15,
46894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x19,
46994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
47094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
47194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
47294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x1B,
47394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x21,
47494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
47594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
47694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
47794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x27,
47894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x2C,
47994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
48094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
48194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
48294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x41,
48394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x41,
48494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
48594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
48694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
48794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x45,
48894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x5B,
48994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
49094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
49194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
49294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x5D,
49394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x5D,
49494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
49594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
49694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
49794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x69,
49894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x69,
49994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
50094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
50194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
50294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x6C,
50394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x6D,
50494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
50594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
50694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			{
50794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.first = 0x80,
50894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.last = 0x81,
50994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				.perm = AB5500_PERM_RW,
51094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			},
51194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		},
51294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	},
51394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij};
51494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
51594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_registers_print(struct seq_file *s, void *p)
51694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
51794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = s->private;
51894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	unsigned int i;
51994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	u8 bank = (u8)ab->debug_bank;
52094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
52194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	seq_printf(s, "ab5500 register values:\n");
52294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	for (bank = 0; bank < AB5500_NUM_BANKS; bank++) {
52394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		seq_printf(s, " bank %u, %s (0x%x):\n", bank,
52494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				bankinfo[bank].name,
52594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				bankinfo[bank].slave_addr);
52694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		for (i = 0; i < ab5500_reg_ranges[bank].nranges; i++) {
52794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			u8 reg;
52894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			int err;
52994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
53094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			for (reg = ab5500_reg_ranges[bank].range[i].first;
53194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				reg <= ab5500_reg_ranges[bank].range[i].last;
53294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				reg++) {
53394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				u8 value;
53494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
53594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				err = ab5500_get_register_interruptible_raw(ab,
53694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij								bank, reg,
53794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij								&value);
53894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				if (err < 0) {
53994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					dev_err(ab->dev, "get_reg failed %d"
54094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij						"bank 0x%x reg 0x%x\n",
54194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij						err, bank, reg);
54294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					return err;
54394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				}
54494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
54594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				err = seq_printf(s, "[%d/0x%02X]: 0x%02X\n",
54694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij						bank, reg, value);
54794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				if (err < 0) {
54894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					dev_err(ab->dev,
54994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij						"seq_printf overflow\n");
55094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					/*
55194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					 * Error is not returned here since
55294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					 * the output is wanted in any case
55394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					 */
55494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij					return 0;
55594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij				}
55694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			}
55794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		}
55894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	}
55994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return 0;
56094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
56194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
56294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_registers_open(struct inode *inode, struct file *file)
56394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
56494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return single_open(file, ab5500_registers_print, inode->i_private);
56594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
56694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
56794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic const struct file_operations ab5500_registers_fops = {
56894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.open = ab5500_registers_open,
56994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.read = seq_read,
57094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.llseek = seq_lseek,
57194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.release = single_release,
57294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.owner = THIS_MODULE,
57394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij};
57494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
57594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_bank_print(struct seq_file *s, void *p)
57694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
57794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = s->private;
57894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
57994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	seq_printf(s, "%d\n", ab->debug_bank);
58094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return 0;
58194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
58294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
58394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_bank_open(struct inode *inode, struct file *file)
58494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
58594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return single_open(file, ab5500_bank_print, inode->i_private);
58694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
58794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
58894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic ssize_t ab5500_bank_write(struct file *file,
58994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	const char __user *user_buf,
59094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	size_t count, loff_t *ppos)
59194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
59294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
59394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	char buf[32];
59494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int buf_size;
59594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	unsigned long user_bank;
59694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int err;
59794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
59894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	/* Get userspace string and assure termination */
59994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf_size = min(count, (sizeof(buf) - 1));
60094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (copy_from_user(buf, user_buf, buf_size))
60194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EFAULT;
60294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf[buf_size] = 0;
60394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
60494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	err = strict_strtoul(buf, 0, &user_bank);
60594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err)
60694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
60794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
60894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (user_bank >= AB5500_NUM_BANKS) {
60994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		dev_err(ab->dev,
61094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			"debugfs error input > number of banks\n");
61194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
61294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	}
61394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
61494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab->debug_bank = user_bank;
61594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
61694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return buf_size;
61794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
61894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
61994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_address_print(struct seq_file *s, void *p)
62094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
62194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = s->private;
62294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
62394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	seq_printf(s, "0x%02X\n", ab->debug_address);
62494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return 0;
62594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
62694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
62794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_address_open(struct inode *inode, struct file *file)
62894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
62994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return single_open(file, ab5500_address_print, inode->i_private);
63094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
63194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
63294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic ssize_t ab5500_address_write(struct file *file,
63394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	const char __user *user_buf,
63494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	size_t count, loff_t *ppos)
63594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
63694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
63794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	char buf[32];
63894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int buf_size;
63994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	unsigned long user_address;
64094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int err;
64194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
64294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	/* Get userspace string and assure termination */
64394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf_size = min(count, (sizeof(buf) - 1));
64494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (copy_from_user(buf, user_buf, buf_size))
64594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EFAULT;
64694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf[buf_size] = 0;
64794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
64894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	err = strict_strtoul(buf, 0, &user_address);
64994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err)
65094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
65194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (user_address > 0xff) {
65294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		dev_err(ab->dev,
65394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			"debugfs error input > 0xff\n");
65494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
65594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	}
65694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab->debug_address = user_address;
65794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return buf_size;
65894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
65994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
66094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_val_print(struct seq_file *s, void *p)
66194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
66294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = s->private;
66394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int err;
66494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	u8 regvalue;
66594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
66694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	err = ab5500_get_register_interruptible_raw(ab, (u8)ab->debug_bank,
66794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(u8)ab->debug_address, &regvalue);
66894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err) {
66994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		dev_err(ab->dev, "get_reg failed %d, bank 0x%x"
67094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			", reg 0x%x\n", err, ab->debug_bank,
67194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			ab->debug_address);
67294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
67394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	}
67494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	seq_printf(s, "0x%02X\n", regvalue);
67594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
67694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return 0;
67794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
67894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
67994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic int ab5500_val_open(struct inode *inode, struct file *file)
68094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
68194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return single_open(file, ab5500_val_print, inode->i_private);
68294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
68394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
68494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic ssize_t ab5500_val_write(struct file *file,
68594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	const char __user *user_buf,
68694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	size_t count, loff_t *ppos)
68794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
68894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	struct ab5500 *ab = ((struct seq_file *)(file->private_data))->private;
68994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	char buf[32];
69094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int buf_size;
69194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	unsigned long user_val;
69294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	int err;
69394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	u8 regvalue;
69494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
69594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	/* Get userspace string and assure termination */
69694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf_size = min(count, (sizeof(buf)-1));
69794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (copy_from_user(buf, user_buf, buf_size))
69894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EFAULT;
69994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	buf[buf_size] = 0;
70094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
70194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	err = strict_strtoul(buf, 0, &user_val);
70294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err)
70394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
70494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (user_val > 0xff) {
70594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		dev_err(ab->dev,
70694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij			"debugfs error input > 0xff\n");
70794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
70894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	}
70994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	err = ab5500_mask_and_set_register_interruptible_raw(
71094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		ab, (u8)ab->debug_bank,
71194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(u8)ab->debug_address, 0xFF, (u8)user_val);
71294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err)
71394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
71494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
71594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_get_register_interruptible_raw(ab, (u8)ab->debug_bank,
71694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(u8)ab->debug_address, &regvalue);
71794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (err)
71894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		return -EINVAL;
71994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
72094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return buf_size;
72194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
72294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
72394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic const struct file_operations ab5500_bank_fops = {
72494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.open = ab5500_bank_open,
72594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.write = ab5500_bank_write,
72694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.read = seq_read,
72794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.llseek = seq_lseek,
72894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.release = single_release,
72994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.owner = THIS_MODULE,
73094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij};
73194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
73294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic const struct file_operations ab5500_address_fops = {
73394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.open = ab5500_address_open,
73494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.write = ab5500_address_write,
73594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.read = seq_read,
73694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.llseek = seq_lseek,
73794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.release = single_release,
73894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.owner = THIS_MODULE,
73994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij};
74094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
74194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic const struct file_operations ab5500_val_fops = {
74294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.open = ab5500_val_open,
74394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.write = ab5500_val_write,
74494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.read = seq_read,
74594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.llseek = seq_lseek,
74694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.release = single_release,
74794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	.owner = THIS_MODULE,
74894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij};
74994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
75094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct dentry *ab5500_dir;
75194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct dentry *ab5500_reg_file;
75294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct dentry *ab5500_bank_file;
75394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct dentry *ab5500_address_file;
75494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijstatic struct dentry *ab5500_val_file;
75594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
75694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijvoid __init ab5500_setup_debugfs(struct ab5500 *ab)
75794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
75894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab->debug_bank = AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP;
75994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab->debug_address = AB5500_CHIP_ID;
76094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
76194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_dir = debugfs_create_dir("ab5500", NULL);
76294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (!ab5500_dir)
76394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		goto exit_no_debugfs;
76494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
76594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_reg_file = debugfs_create_file("all-bank-registers",
76694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		S_IRUGO, ab5500_dir, ab, &ab5500_registers_fops);
76794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (!ab5500_reg_file)
76894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		goto exit_destroy_dir;
76994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
77094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_bank_file = debugfs_create_file("register-bank",
77194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_bank_fops);
77294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (!ab5500_bank_file)
77394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		goto exit_destroy_reg;
77494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
77594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_address_file = debugfs_create_file("register-address",
77694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_address_fops);
77794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (!ab5500_address_file)
77894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		goto exit_destroy_bank;
77994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
78094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	ab5500_val_file = debugfs_create_file("register-value",
78194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		(S_IRUGO | S_IWUGO), ab5500_dir, ab, &ab5500_val_fops);
78294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	if (!ab5500_val_file)
78394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij		goto exit_destroy_address;
78494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
78594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return;
78694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
78794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijexit_destroy_address:
78894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_address_file);
78994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijexit_destroy_bank:
79094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_bank_file);
79194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijexit_destroy_reg:
79294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_reg_file);
79394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijexit_destroy_dir:
79494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_dir);
79594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijexit_no_debugfs:
79694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	dev_err(ab->dev, "failed to create debugfs entries.\n");
79794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	return;
79894be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
79994be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij
80094be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleijvoid __exit ab5500_remove_debugfs(void)
80194be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij{
80294be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_val_file);
80394be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_address_file);
80494be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_bank_file);
80594be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_reg_file);
80694be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij	debugfs_remove(ab5500_dir);
80794be70d4b279ba1b35119a3340833ffcc798c2e2Linus Walleij}
808