aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/mutex-debug.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-02-17 21:32:06 -0500
committerH. Peter Anvin <hpa@zytor.com>2010-02-17 21:32:06 -0500
commitf1f6baf8f1df29be38003089787e378567ce0086 (patch)
tree241bbc2e266f5d08cec510064fc4a2cc0417c46e /kernel/mutex-debug.c
parentb0483e78e5c4c9871fc5541875b3bc006846d46b (diff)
x86, setup: When restoring the screen, update boot_params.screen_info
When we restore the screen content after a mode change, we return the cursor to its former position. However, we need to also update boot_params.screen_info accordingly, so that the decompression code knows where on the screen the cursor is. Just in case the video BIOS does something extra screwy, read the cursor position back from the BIOS instead of relying on it doing the right thing. While we're at it, make sure we cap the cursor position to the new screen coordinates. Reported-by: Wim Osterholt <wim@djo.tudelft.nl> Bugzilla-Reference: http://bugzilla.kernel.org/show_bug.cgi?id=15329 Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'kernel/mutex-debug.c')
0 files changed, 0 insertions, 0 deletions
Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com> 2016-05-27 06:10:41 -0400 committer Herbert Xu <herbert@gondor.apana.org.au> 2016-05-31 05:52:29 -0400 hwrng: bcm2835 - Read as much data as available' href='/cgit/cgit.cgi/litmus-rt-ext-res.git/commit/drivers/char/hw_random/bcm2835-rng.c?id=4f8de65bab611a68f40355ac9169edb4d0d33974'>4f8de65bab61
8c4196a2fd7c
abd42026eab9
8c4196a2fd7c




abd42026eab9
4f8de65bab61



abd42026eab9
4f8de65bab61

8c4196a2fd7c

a81577755382


791af4f4907a
04b154fa86af

791af4f4907a





04b154fa86af

abd42026eab9
04b154fa86af
abd42026eab9
04b154fa86af
a81577755382

abd42026eab9

a81577755382
791af4f4907a
a81577755382

ec94bca7be6b




abd42026eab9
791af4f4907a


ec94bca7be6b

04b154fa86af







422a7491459b

04b154fa86af

8705f24f7b57
422a7491459b


8c4196a2fd7c

04b154fa86af
8c4196a2fd7c

422a7491459b
b788479f6826
21bb0ef43c11
8c4196a2fd7c

b788479f6826





21bb0ef43c11

8c4196a2fd7c
b788479f6826
c4fc5d6d0b37
b788479f6826
b788479f6826
791af4f4907a

7b4c5d30d0bd

791af4f4907a
8705f24f7b57
a81577755382
b788479f6826
ec94bca7be6b
8c4196a2fd7c
422a7491459b
21bb0ef43c11
422a7491459b
21bb0ef43c11
422a7491459b
04b154fa86af


422a7491459b
8c4196a2fd7c
16a4c04b3729
21bb0ef43c11
8c4196a2fd7c
21bb0ef43c11
8c4196a2fd7c

8c4196a2fd7c


8c4196a2fd7c

8705f24f7b57






8c4196a2fd7c


8c4196a2fd7c


8705f24f7b57
8c4196a2fd7c




22e8099f4f66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211

                                   

                                                         


                            






                                  
                      



                           
                            






                                                                          

                           


                           
                             
                        

  




                                                                     

                                                                      






                                                                         




                                                                     



                                                                         

 


                                                                     
                                                         

                                          
 
                                                          




                                 
                                                      



                                                   
                                                                

                                       

 


                                                         
                    

                





                                                    

                                        
                                                    
                                   
                                                    
         

                                        

                                                       
 
                   

 




                                                         
                                      


                                                 

 







                                                           

                                                           

                                                                        
                                            


           

                                                          
                                                  

                                              
                                          
                                      
                           

                





                                                            

                                                           
                            
                                                   
                               
                                           
 

                                                 

                                                                     
 
                                    
                                          
                                          
                                                
 
                                                         
                    
                               
 
                                                     


                                                                 
 
                             
                                                   
                
                                                            
            

                                                    


                   

                                              






                                                          


                                                    


                                                       
                                              




                                                                   
                         
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2010-2012 Broadcom. All rights reserved.
 * Copyright (c) 2013 Lubomir Rintel
 */

#include <linux/hw_random.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/printk.h>
#include <linux/clk.h>

#define RNG_CTRL	0x0
#define RNG_STATUS	0x4
#define RNG_DATA	0x8
#define RNG_INT_MASK	0x10

/* enable rng */
#define RNG_RBGEN	0x1

/* the initial numbers generated are "less random" so will be discarded */
#define RNG_WARMUP_COUNT 0x40000

#define RNG_INT_OFF	0x1

struct bcm2835_rng_priv {
	struct hwrng rng;
	void __iomem *base;
	bool mask_interrupts;
	struct clk *clk;
};

static inline struct bcm2835_rng_priv *to_rng_priv(struct hwrng *rng)
{
	return container_of(rng, struct bcm2835_rng_priv, rng);
}

static inline u32 rng_readl(struct bcm2835_rng_priv *priv, u32 offset)
{
	/* MIPS chips strapped for BE will automagically configure the
	 * peripheral registers for CPU-native byte order.
	 */
	if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
		return __raw_readl(priv->base + offset);
	else
		return readl(priv->base + offset);
}

static inline void rng_writel(struct bcm2835_rng_priv *priv, u32 val,
			      u32 offset)
{
	if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
		__raw_writel(val, priv->base + offset);
	else
		writel(val, priv->base + offset);
}

static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
			       bool wait)
{
	struct bcm2835_rng_priv *priv = to_rng_priv(rng);
	u32 max_words = max / sizeof(u32);
	u32 num_words, count;

	while ((rng_readl(priv, RNG_STATUS) >> 24) == 0) {
		if (!wait)
			return 0;
		cpu_relax();
	}

	num_words = rng_readl(priv, RNG_STATUS) >> 24;
	if (num_words > max_words)
		num_words = max_words;

	for (count = 0; count < num_words; count++)
		((u32 *)buf)[count] = rng_readl(priv, RNG_DATA);

	return num_words * sizeof(u32);
}

static int bcm2835_rng_init(struct hwrng *rng)
{
	struct bcm2835_rng_priv *priv = to_rng_priv(rng);
	int ret = 0;
	u32 val;

	if (!IS_ERR(priv->clk)) {
		ret = clk_prepare_enable(priv->clk);
		if (ret)
			return ret;
	}

	if (priv->mask_interrupts) {
		/* mask the interrupt */
		val = rng_readl(priv, RNG_INT_MASK);
		val |= RNG_INT_OFF;
		rng_writel(priv, val, RNG_INT_MASK);
	}

	/* set warm-up count & enable */
	rng_writel(priv, RNG_WARMUP_COUNT, RNG_STATUS);
	rng_writel(priv, RNG_RBGEN, RNG_CTRL);

	return ret;
}

static void bcm2835_rng_cleanup(struct hwrng *rng)
{
	struct bcm2835_rng_priv *priv = to_rng_priv(rng);

	/* disable rng hardware */
	rng_writel(priv, 0, RNG_CTRL);

	if (!IS_ERR(priv->clk))
		clk_disable_unprepare(priv->clk);
}

struct bcm2835_rng_of_data {
	bool mask_interrupts;
};

static const struct bcm2835_rng_of_data nsp_rng_of_data = {
	.mask_interrupts = true,
};

static const struct of_device_id bcm2835_rng_of_match[] = {
	{ .compatible = "brcm,bcm2835-rng"},
	{ .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
	{ .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
	{ .compatible = "brcm,bcm6368-rng"},
	{},
};

static int bcm2835_rng_probe(struct platform_device *pdev)
{
	const struct bcm2835_rng_of_data *of_data;
	struct device *dev = &pdev->dev;
	struct device_node *np = dev->of_node;
	const struct of_device_id *rng_id;
	struct bcm2835_rng_priv *priv;
	struct resource *r;
	int err;

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	platform_set_drvdata(pdev, priv);

	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	/* map peripheral */
	priv->base = devm_ioremap_resource(dev, r);
	if (IS_ERR(priv->base))
		return PTR_ERR(priv->base);

	/* Clock is optional on most platforms */
	priv->clk = devm_clk_get(dev, NULL);
	if (IS_ERR(priv->clk) && PTR_ERR(priv->clk) == -EPROBE_DEFER)
		return -EPROBE_DEFER;

	priv->rng.name = pdev->name;
	priv->rng.init = bcm2835_rng_init;
	priv->rng.read = bcm2835_rng_read;
	priv->rng.cleanup = bcm2835_rng_cleanup;

	rng_id = of_match_node(bcm2835_rng_of_match, np);
	if (!rng_id)
		return -EINVAL;

	/* Check for rng init function, execute it */
	of_data = rng_id->data;
	if (of_data)
		priv->mask_interrupts = of_data->mask_interrupts;

	/* register driver */
	err = devm_hwrng_register(dev, &priv->rng);
	if (err)
		dev_err(dev, "hwrng registration failed\n");
	else
		dev_info(dev, "hwrng registered\n");

	return err;
}

MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);

static struct platform_device_id bcm2835_rng_devtype[] = {
	{ .name = "bcm2835-rng" },
	{ .name = "bcm63xx-rng" },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, bcm2835_rng_devtype);

static struct platform_driver bcm2835_rng_driver = {
	.driver = {
		.name = "bcm2835-rng",
		.of_match_table = bcm2835_rng_of_match,
	},
	.probe		= bcm2835_rng_probe,
	.id_table	= bcm2835_rng_devtype,
};
module_platform_driver(bcm2835_rng_driver);

MODULE_AUTHOR("Lubomir Rintel <lkundrak@v3.sk>");
MODULE_DESCRIPTION("BCM2835 Random Number Generator (RNG) driver");
MODULE_LICENSE("GPL v2");