aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/atheros/atl1c/or
stat options
Period:
Authors:

Commits per author per week (path 'drivers/net/ethernet/atheros/atl1c/or')

AuthorW36 2025W37 2025W38 2025W39 2025Total
Total00000
aul.gortmaker@windriver.com> 2011-07-03 15:14:56 -0400 committer Paul Gortmaker <paul.gortmaker@windriver.com> 2011-10-31 19:31:53 -0400 drivers/misc: Add module.h to files who are really modular.' href='/cgit/cgit.cgi/litmus-rt.git/commit/drivers/misc/ab8500-pwm.c?h=test&id=eb12a679b242c03b9eaa38a67cae9fa3e17ddea6'>eb12a679b242
f0f05b1c7517








6173f8f4ed9c

f0f05b1c7517

6173f8f4ed9c

f0f05b1c7517















6173f8f4ed9c
f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517


6173f8f4ed9c
f0f05b1c7517



f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517


6173f8f4ed9c
f0f05b1c7517
54b02347d718
f0f05b1c7517
622fc5d4452a
f0f05b1c7517


f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517


6173f8f4ed9c
f0f05b1c7517
54b02347d718
f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517
f0f05b1c7517
f0f05b1c7517
6173f8f4ed9c



fa0abee9b89e
6173f8f4ed9c
f0f05b1c7517
3e9fe83d278c
f0f05b1c7517
6173f8f4ed9c


f0f05b1c7517



482467ad97b6
a2fc1db61a65
f0f05b1c7517
6173f8f4ed9c






482467ad97b6
6173f8f4ed9c
6173f8f4ed9c



f0f05b1c7517


77f37917a6f2
f0f05b1c7517
6173f8f4ed9c






f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517





f0f05b1c7517

fd1091125a1d
f0f05b1c7517
6173f8f4ed9c
f0f05b1c7517
f0f05b1c7517

37b7bf67c36d
f0f05b1c7517
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









                                                            
                             
                                    
                         








                                            

                             

  

                                                                           















                                                      
                                                                
 
                                                                       


                                            
                                                                       



                                                   
 
                                                                           


                
                                                                   
                                                                      
                                                                              
                    
                                                                          


                                                                         
 
                                                                             


                
                                                                   
                                                                      
                                                          
                    
                                                                           
                                                                         
 
 



                                              
                             
  
 
                                                         
 


                                       



                                                                   
                                                                       
                           
                               






                                           
                    
                           



                                                      


                 
                                                          
 






                                                                    
                                                    
 





                                                   

                                  
                                    
  
                                          
 

                                                           
                                    
                         
/*
 * Copyright (C) ST-Ericsson SA 2010
 *
 * Author: Arun R Murthy <arun.murthy@stericsson.com>
 * License terms: GNU General Public License (GPL) version 2
 */
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/pwm.h>
#include <linux/mfd/abx500.h>
#include <linux/mfd/abx500/ab8500.h>
#include <linux/module.h>

/*
 * PWM Out generators
 * Bank: 0x10
 */
#define AB8500_PWM_OUT_CTRL1_REG	0x60
#define AB8500_PWM_OUT_CTRL2_REG	0x61
#define AB8500_PWM_OUT_CTRL7_REG	0x66

struct ab8500_pwm_chip {
	struct pwm_chip chip;
};

static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
			     int duty_ns, int period_ns)
{
	int ret = 0;
	unsigned int higher_val, lower_val;
	u8 reg;

	/*
	 * get the first 8 bits that are be written to
	 * AB8500_PWM_OUT_CTRL1_REG[0:7]
	 */
	lower_val = duty_ns & 0x00FF;
	/*
	 * get bits [9:10] that are to be written to
	 * AB8500_PWM_OUT_CTRL2_REG[0:1]
	 */
	higher_val = ((duty_ns & 0x0300) >> 8);

	reg = AB8500_PWM_OUT_CTRL1_REG + ((chip->base - 1) * 2);

	ret = abx500_set_register_interruptible(chip->dev, AB8500_MISC,
			reg, (u8)lower_val);
	if (ret < 0)
		return ret;
	ret = abx500_set_register_interruptible(chip->dev, AB8500_MISC,
			(reg + 1), (u8)higher_val);

	return ret;
}

static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
{
	int ret;

	ret = abx500_mask_and_set_register_interruptible(chip->dev,
				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
				1 << (chip->base - 1), 1 << (chip->base - 1));
	if (ret < 0)
		dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
							pwm->label, ret);
	return ret;
}

static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
{
	int ret;

	ret = abx500_mask_and_set_register_interruptible(chip->dev,
				AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
				1 << (chip->base - 1), 0);
	if (ret < 0)
		dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
							pwm->label, ret);
}

static const struct pwm_ops ab8500_pwm_ops = {
	.config = ab8500_pwm_config,
	.enable = ab8500_pwm_enable,
	.disable = ab8500_pwm_disable,
	.owner = THIS_MODULE,
};

static int ab8500_pwm_probe(struct platform_device *pdev)
{
	struct ab8500_pwm_chip *ab8500;
	int err;

	/*
	 * Nothing to be done in probe, this is required to get the
	 * device which is required for ab8500 read and write
	 */
	ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL);
	if (ab8500 == NULL)
		return -ENOMEM;

	ab8500->chip.dev = &pdev->dev;
	ab8500->chip.ops = &ab8500_pwm_ops;
	ab8500->chip.base = pdev->id;
	ab8500->chip.npwm = 1;

	err = pwmchip_add(&ab8500->chip);
	if (err < 0)
		return err;

	dev_dbg(&pdev->dev, "pwm probe successful\n");
	platform_set_drvdata(pdev, ab8500);

	return 0;
}

static int ab8500_pwm_remove(struct platform_device *pdev)
{
	struct ab8500_pwm_chip *ab8500 = platform_get_drvdata(pdev);
	int err;