1/*
2 *  Device State Control Registers driver
3 *
4 *  Copyright (C) 2011 Texas Instruments Incorporated
5 *  Author: Mark Salter <msalter@redhat.com>
6 *
7 *  This program is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License version 2 as
9 *  published by the Free Software Foundation.
10 */
11
12/*
13 * The Device State Control Registers (DSCR) provide SoC level control over
14 * a number of peripherals. Details vary considerably among the various SoC
15 * parts. In general, the DSCR block will provide one or more configuration
16 * registers often protected by a lock register. One or more key values must
17 * be written to a lock register in order to unlock the configuration register.
18 * The configuration register may be used to enable (and disable in some
19 * cases) SoC pin drivers, peripheral clock sources (internal or pin), etc.
20 * In some cases, a configuration register is write once or the individual
21 * bits are write once. That is, you may be able to enable a device, but
22 * will not be able to disable it.
23 *
24 * In addition to device configuration, the DSCR block may provide registers
25 * which are used to reset SoC peripherals, provide device ID information,
26 * provide MAC addresses, and other miscellaneous functions.
27 */
28
29#include <linux/of.h>
30#include <linux/of_address.h>
31#include <linux/of_platform.h>
32#include <linux/module.h>
33#include <linux/io.h>
34#include <linux/delay.h>
35#include <asm/soc.h>
36#include <asm/dscr.h>
37
38#define MAX_DEVSTATE_IDS   32
39#define MAX_DEVCTL_REGS     8
40#define MAX_DEVSTAT_REGS    8
41#define MAX_LOCKED_REGS     4
42#define MAX_SOC_EMACS       2
43
44struct rmii_reset_reg {
45	u32 reg;
46	u32 mask;
47};
48
49/*
50 * Some registerd may be locked. In order to write to these
51 * registers, the key value must first be written to the lockreg.
52 */
53struct locked_reg {
54	u32 reg;	/* offset from base */
55	u32 lockreg;	/* offset from base */
56	u32 key;	/* unlock key */
57};
58
59/*
60 * This describes a contiguous area of like control bits used to enable/disable
61 * SoC devices. Each controllable device is given an ID which is used by the
62 * individual device drivers to control the device state. These IDs start at
63 * zero and are assigned sequentially to the control bitfield ranges described
64 * by this structure.
65 */
66struct devstate_ctl_reg {
67	u32 reg;		/* register holding the control bits */
68	u8  start_id;		/* start id of this range */
69	u8  num_ids;		/* number of devices in this range */
70	u8  enable_only;	/* bits are write-once to enable only */
71	u8  enable;		/* value used to enable device */
72	u8  disable;		/* value used to disable device */
73	u8  shift;		/* starting (rightmost) bit in range */
74	u8  nbits;		/* number of bits per device */
75};
76
77
78/*
79 * This describes a region of status bits indicating the state of
80 * various devices. This is used internally to wait for status
81 * change completion when enabling/disabling a device. Status is
82 * optional and not all device controls will have a corresponding
83 * status.
84 */
85struct devstate_stat_reg {
86	u32 reg;		/* register holding the status bits */
87	u8  start_id;		/* start id of this range */
88	u8  num_ids;		/* number of devices in this range */
89	u8  enable;		/* value indicating enabled state */
90	u8  disable;		/* value indicating disabled state */
91	u8  shift;		/* starting (rightmost) bit in range */
92	u8  nbits;		/* number of bits per device */
93};
94
95struct devstate_info {
96	struct devstate_ctl_reg *ctl;
97	struct devstate_stat_reg *stat;
98};
99
100/* These are callbacks to SOC-specific code. */
101struct dscr_ops {
102	void (*init)(struct device_node *node);
103};
104
105struct dscr_regs {
106	spinlock_t		lock;
107	void __iomem		*base;
108	u32			kick_reg[2];
109	u32			kick_key[2];
110	struct locked_reg	locked[MAX_LOCKED_REGS];
111	struct devstate_info	devstate_info[MAX_DEVSTATE_IDS];
112	struct rmii_reset_reg   rmii_resets[MAX_SOC_EMACS];
113	struct devstate_ctl_reg devctl[MAX_DEVCTL_REGS];
114	struct devstate_stat_reg devstat[MAX_DEVSTAT_REGS];
115};
116
117static struct dscr_regs	dscr;
118
119static struct locked_reg *find_locked_reg(u32 reg)
120{
121	int i;
122
123	for (i = 0; i < MAX_LOCKED_REGS; i++)
124		if (dscr.locked[i].key && reg == dscr.locked[i].reg)
125			return &dscr.locked[i];
126	return NULL;
127}
128
129/*
130 * Write to a register with one lock
131 */
132static void dscr_write_locked1(u32 reg, u32 val,
133			       u32 lock, u32 key)
134{
135	void __iomem *reg_addr = dscr.base + reg;
136	void __iomem *lock_addr = dscr.base + lock;
137
138	/*
139	 * For some registers, the lock is relocked after a short number
140	 * of cycles. We have to put the lock write and register write in
141	 * the same fetch packet to meet this timing. The .align ensures
142	 * the two stw instructions are in the same fetch packet.
143	 */
144	asm volatile ("b	.s2	0f\n"
145		      "nop	5\n"
146		      "    .align 5\n"
147		      "0:\n"
148		      "stw	.D1T2	%3,*%2\n"
149		      "stw	.D1T2	%1,*%0\n"
150		      :
151		      : "a"(reg_addr), "b"(val), "a"(lock_addr), "b"(key)
152		);
153
154	/* in case the hw doesn't reset the lock */
155	soc_writel(0, lock_addr);
156}
157
158/*
159 * Write to a register protected by two lock registers
160 */
161static void dscr_write_locked2(u32 reg, u32 val,
162			       u32 lock0, u32 key0,
163			       u32 lock1, u32 key1)
164{
165	soc_writel(key0, dscr.base + lock0);
166	soc_writel(key1, dscr.base + lock1);
167	soc_writel(val, dscr.base + reg);
168	soc_writel(0, dscr.base + lock0);
169	soc_writel(0, dscr.base + lock1);
170}
171
172static void dscr_write(u32 reg, u32 val)
173{
174	struct locked_reg *lock;
175
176	lock = find_locked_reg(reg);
177	if (lock)
178		dscr_write_locked1(reg, val, lock->lockreg, lock->key);
179	else if (dscr.kick_key[0])
180		dscr_write_locked2(reg, val, dscr.kick_reg[0], dscr.kick_key[0],
181				   dscr.kick_reg[1], dscr.kick_key[1]);
182	else
183		soc_writel(val, dscr.base + reg);
184}
185
186
187/*
188 * Drivers can use this interface to enable/disable SoC IP blocks.
189 */
190void dscr_set_devstate(int id, enum dscr_devstate_t state)
191{
192	struct devstate_ctl_reg *ctl;
193	struct devstate_stat_reg *stat;
194	struct devstate_info *info;
195	u32 ctl_val, val;
196	int ctl_shift, ctl_mask;
197	unsigned long flags;
198
199	if (!dscr.base)
200		return;
201
202	if (id < 0 || id >= MAX_DEVSTATE_IDS)
203		return;
204
205	info = &dscr.devstate_info[id];
206	ctl = info->ctl;
207	stat = info->stat;
208
209	if (ctl == NULL)
210		return;
211
212	ctl_shift = ctl->shift + ctl->nbits * (id - ctl->start_id);
213	ctl_mask = ((1 << ctl->nbits) - 1) << ctl_shift;
214
215	switch (state) {
216	case DSCR_DEVSTATE_ENABLED:
217		ctl_val = ctl->enable << ctl_shift;
218		break;
219	case DSCR_DEVSTATE_DISABLED:
220		if (ctl->enable_only)
221			return;
222		ctl_val = ctl->disable << ctl_shift;
223		break;
224	default:
225		return;
226	}
227
228	spin_lock_irqsave(&dscr.lock, flags);
229
230	val = soc_readl(dscr.base + ctl->reg);
231	val &= ~ctl_mask;
232	val |= ctl_val;
233
234	dscr_write(ctl->reg, val);
235
236	spin_unlock_irqrestore(&dscr.lock, flags);
237
238	if (!stat)
239		return;
240
241	ctl_shift = stat->shift + stat->nbits * (id - stat->start_id);
242
243	if (state == DSCR_DEVSTATE_ENABLED)
244		ctl_val = stat->enable;
245	else
246		ctl_val = stat->disable;
247
248	do {
249		val = soc_readl(dscr.base + stat->reg);
250		val >>= ctl_shift;
251		val &= ((1 << stat->nbits) - 1);
252	} while (val != ctl_val);
253}
254EXPORT_SYMBOL(dscr_set_devstate);
255
256/*
257 * Drivers can use this to reset RMII module.
258 */
259void dscr_rmii_reset(int id, int assert)
260{
261	struct rmii_reset_reg *r;
262	unsigned long flags;
263	u32 val;
264
265	if (id < 0 || id >= MAX_SOC_EMACS)
266		return;
267
268	r = &dscr.rmii_resets[id];
269	if (r->mask == 0)
270		return;
271
272	spin_lock_irqsave(&dscr.lock, flags);
273
274	val = soc_readl(dscr.base + r->reg);
275	if (assert)
276		dscr_write(r->reg, val | r->mask);
277	else
278		dscr_write(r->reg, val & ~(r->mask));
279
280	spin_unlock_irqrestore(&dscr.lock, flags);
281}
282EXPORT_SYMBOL(dscr_rmii_reset);
283
284static void __init dscr_parse_devstat(struct device_node *node,
285				      void __iomem *base)
286{
287	u32 val;
288	int err;
289
290	err = of_property_read_u32_array(node, "ti,dscr-devstat", &val, 1);
291	if (!err)
292		c6x_devstat = soc_readl(base + val);
293	printk(KERN_INFO "DEVSTAT: %08x\n", c6x_devstat);
294}
295
296static void __init dscr_parse_silicon_rev(struct device_node *node,
297					 void __iomem *base)
298{
299	u32 vals[3];
300	int err;
301
302	err = of_property_read_u32_array(node, "ti,dscr-silicon-rev", vals, 3);
303	if (!err) {
304		c6x_silicon_rev = soc_readl(base + vals[0]);
305		c6x_silicon_rev >>= vals[1];
306		c6x_silicon_rev &= vals[2];
307	}
308}
309
310/*
311 * Some SoCs will have a pair of fuse registers which hold
312 * an ethernet MAC address. The "ti,dscr-mac-fuse-regs"
313 * property is a mapping from fuse register bytes to MAC
314 * address bytes. The expected format is:
315 *
316 *	ti,dscr-mac-fuse-regs = <reg0 b3 b2 b1 b0
317 *				 reg1 b3 b2 b1 b0>
318 *
319 * reg0 and reg1 are the offsets of the two fuse registers.
320 * b3-b0 positionally represent bytes within the fuse register.
321 * b3 is the most significant byte and b0 is the least.
322 * Allowable values for b3-b0 are:
323 *
324 *	  0 = fuse register byte not used in MAC address
325 *      1-6 = index+1 into c6x_fuse_mac[]
326 */
327static void __init dscr_parse_mac_fuse(struct device_node *node,
328				       void __iomem *base)
329{
330	u32 vals[10], fuse;
331	int f, i, j, err;
332
333	err = of_property_read_u32_array(node, "ti,dscr-mac-fuse-regs",
334					 vals, 10);
335	if (err)
336		return;
337
338	for (f = 0; f < 2; f++) {
339		fuse = soc_readl(base + vals[f * 5]);
340		for (j = (f * 5) + 1, i = 24; i >= 0; i -= 8, j++)
341			if (vals[j] && vals[j] <= 6)
342				c6x_fuse_mac[vals[j] - 1] = fuse >> i;
343	}
344}
345
346static void __init dscr_parse_rmii_resets(struct device_node *node,
347					  void __iomem *base)
348{
349	const __be32 *p;
350	int i, size;
351
352	/* look for RMII reset registers */
353	p = of_get_property(node, "ti,dscr-rmii-resets", &size);
354	if (p) {
355		/* parse all the reg/mask pairs we can handle */
356		size /= (sizeof(*p) * 2);
357		if (size > MAX_SOC_EMACS)
358			size = MAX_SOC_EMACS;
359
360		for (i = 0; i < size; i++) {
361			dscr.rmii_resets[i].reg = be32_to_cpup(p++);
362			dscr.rmii_resets[i].mask = be32_to_cpup(p++);
363		}
364	}
365}
366
367
368static void __init dscr_parse_privperm(struct device_node *node,
369				       void __iomem *base)
370{
371	u32 vals[2];
372	int err;
373
374	err = of_property_read_u32_array(node, "ti,dscr-privperm", vals, 2);
375	if (err)
376		return;
377	dscr_write(vals[0], vals[1]);
378}
379
380/*
381 * SoCs may have "locked" DSCR registers which can only be written
382 * to only after writing a key value to a lock registers. These
383 * regisers can be described with the "ti,dscr-locked-regs" property.
384 * This property provides a list of register descriptions with each
385 * description consisting of three values.
386 *
387 *	ti,dscr-locked-regs = <reg0 lockreg0 key0
388 *                               ...
389 *                             regN lockregN keyN>;
390 *
391 * reg is the offset of the locked register
392 * lockreg is the offset of the lock register
393 * key is the unlock key written to lockreg
394 *
395 */
396static void __init dscr_parse_locked_regs(struct device_node *node,
397					  void __iomem *base)
398{
399	struct locked_reg *r;
400	const __be32 *p;
401	int i, size;
402
403	p = of_get_property(node, "ti,dscr-locked-regs", &size);
404	if (p) {
405		/* parse all the register descriptions we can handle */
406		size /= (sizeof(*p) * 3);
407		if (size > MAX_LOCKED_REGS)
408			size = MAX_LOCKED_REGS;
409
410		for (i = 0; i < size; i++) {
411			r = &dscr.locked[i];
412
413			r->reg = be32_to_cpup(p++);
414			r->lockreg = be32_to_cpup(p++);
415			r->key = be32_to_cpup(p++);
416		}
417	}
418}
419
420/*
421 * SoCs may have DSCR registers which are only write enabled after
422 * writing specific key values to two registers. The two key registers
423 * and the key values can be parsed from a "ti,dscr-kick-regs"
424 * propety with the following layout:
425 *
426 *	ti,dscr-kick-regs = <kickreg0 key0 kickreg1 key1>
427 *
428 * kickreg is the offset of the "kick" register
429 * key is the value which unlocks writing for protected regs
430 */
431static void __init dscr_parse_kick_regs(struct device_node *node,
432					void __iomem *base)
433{
434	u32 vals[4];
435	int err;
436
437	err = of_property_read_u32_array(node, "ti,dscr-kick-regs", vals, 4);
438	if (!err) {
439		dscr.kick_reg[0] = vals[0];
440		dscr.kick_key[0] = vals[1];
441		dscr.kick_reg[1] = vals[2];
442		dscr.kick_key[1] = vals[3];
443	}
444}
445
446
447/*
448 * SoCs may provide controls to enable/disable individual IP blocks. These
449 * controls in the DSCR usually control pin drivers but also may control
450 * clocking and or resets. The device tree is used to describe the bitfields
451 * in registers used to control device state. The number of bits and their
452 * values may vary even within the same register.
453 *
454 * The layout of these bitfields is described by the ti,dscr-devstate-ctl-regs
455 * property. This property is a list where each element describes a contiguous
456 * range of control fields with like properties. Each element of the list
457 * consists of 7 cells with the following values:
458 *
459 *   start_id num_ids reg enable disable start_bit nbits
460 *
461 * start_id is device id for the first device control in the range
462 * num_ids is the number of device controls in the range
463 * reg is the offset of the register holding the control bits
464 * enable is the value to enable a device
465 * disable is the value to disable a device (0xffffffff if cannot disable)
466 * start_bit is the bit number of the first bit in the range
467 * nbits is the number of bits per device control
468 */
469static void __init dscr_parse_devstate_ctl_regs(struct device_node *node,
470						void __iomem *base)
471{
472	struct devstate_ctl_reg *r;
473	const __be32 *p;
474	int i, j, size;
475
476	p = of_get_property(node, "ti,dscr-devstate-ctl-regs", &size);
477	if (p) {
478		/* parse all the ranges we can handle */
479		size /= (sizeof(*p) * 7);
480		if (size > MAX_DEVCTL_REGS)
481			size = MAX_DEVCTL_REGS;
482
483		for (i = 0; i < size; i++) {
484			r = &dscr.devctl[i];
485
486			r->start_id = be32_to_cpup(p++);
487			r->num_ids = be32_to_cpup(p++);
488			r->reg = be32_to_cpup(p++);
489			r->enable = be32_to_cpup(p++);
490			r->disable = be32_to_cpup(p++);
491			if (r->disable == 0xffffffff)
492				r->enable_only = 1;
493			r->shift = be32_to_cpup(p++);
494			r->nbits = be32_to_cpup(p++);
495
496			for (j = r->start_id;
497			     j < (r->start_id + r->num_ids);
498			     j++)
499				dscr.devstate_info[j].ctl = r;
500		}
501	}
502}
503
504/*
505 * SoCs may provide status registers indicating the state (enabled/disabled) of
506 * devices on the SoC. The device tree is used to describe the bitfields in
507 * registers used to provide device status. The number of bits and their
508 * values used to provide status may vary even within the same register.
509 *
510 * The layout of these bitfields is described by the ti,dscr-devstate-stat-regs
511 * property. This property is a list where each element describes a contiguous
512 * range of status fields with like properties. Each element of the list
513 * consists of 7 cells with the following values:
514 *
515 *   start_id num_ids reg enable disable start_bit nbits
516 *
517 * start_id is device id for the first device status in the range
518 * num_ids is the number of devices covered by the range
519 * reg is the offset of the register holding the status bits
520 * enable is the value indicating device is enabled
521 * disable is the value indicating device is disabled
522 * start_bit is the bit number of the first bit in the range
523 * nbits is the number of bits per device status
524 */
525static void __init dscr_parse_devstate_stat_regs(struct device_node *node,
526						 void __iomem *base)
527{
528	struct devstate_stat_reg *r;
529	const __be32 *p;
530	int i, j, size;
531
532	p = of_get_property(node, "ti,dscr-devstate-stat-regs", &size);
533	if (p) {
534		/* parse all the ranges we can handle */
535		size /= (sizeof(*p) * 7);
536		if (size > MAX_DEVSTAT_REGS)
537			size = MAX_DEVSTAT_REGS;
538
539		for (i = 0; i < size; i++) {
540			r = &dscr.devstat[i];
541
542			r->start_id = be32_to_cpup(p++);
543			r->num_ids = be32_to_cpup(p++);
544			r->reg = be32_to_cpup(p++);
545			r->enable = be32_to_cpup(p++);
546			r->disable = be32_to_cpup(p++);
547			r->shift = be32_to_cpup(p++);
548			r->nbits = be32_to_cpup(p++);
549
550			for (j = r->start_id;
551			     j < (r->start_id + r->num_ids);
552			     j++)
553				dscr.devstate_info[j].stat = r;
554		}
555	}
556}
557
558static struct of_device_id dscr_ids[] __initdata = {
559	{ .compatible = "ti,c64x+dscr" },
560	{}
561};
562
563/*
564 * Probe for DSCR area.
565 *
566 * This has to be done early on in case timer or interrupt controller
567 * needs something. e.g. On C6455 SoC, timer must be enabled through
568 * DSCR before it is functional.
569 */
570void __init dscr_probe(void)
571{
572	struct device_node *node;
573	void __iomem *base;
574
575	spin_lock_init(&dscr.lock);
576
577	node = of_find_matching_node(NULL, dscr_ids);
578	if (!node)
579		return;
580
581	base = of_iomap(node, 0);
582	if (!base) {
583		of_node_put(node);
584		return;
585	}
586
587	dscr.base = base;
588
589	dscr_parse_devstat(node, base);
590	dscr_parse_silicon_rev(node, base);
591	dscr_parse_mac_fuse(node, base);
592	dscr_parse_rmii_resets(node, base);
593	dscr_parse_locked_regs(node, base);
594	dscr_parse_kick_regs(node, base);
595	dscr_parse_devstate_ctl_regs(node, base);
596	dscr_parse_devstate_stat_regs(node, base);
597	dscr_parse_privperm(node, base);
598}
599