\r
#include <linux/bug.h>\r
#include <linux/err.h>\r
-#include <linux/hardirq.h>\r
#include <linux/platform_device.h>\r
#include <linux/kernel.h>\r
#include <linux/clk.h>\r
#endif\r
\r
\r
-#define PWM_VCORE_120 40\r
-#define PWM_VCORE_125 32\r
+#define PWM_VCORE_120 40\r
+#define PWM_VCORE_125 32\r
#define PWM_VCORE_130 21\r
#define PWM_VCORE_135 10\r
#define PWM_VCORE_140 0\r
\r
static int pwm_set_rate(struct pwm_platform_data *pdata,int nHz,u32 rate)\r
{\r
- u32 divh,divTotal;\r
- int id = pdata->pwm_id;\r
- unsigned long clkrate;\r
-\r
- clkrate = clk_get_rate(pwm_clk);\r
- \r
- if ( id >3 || id <0 )\r
- return -1;\r
-\r
- if(rate == 0)\r
- {\r
- // iomux pwm2 to gpio2_a[3] \r
- rk29_mux_api_set(pdata->pwm_iomux_name, pdata->pwm_iomux_gpio);\r
- // set gpio to low level \r
- gpio_set_value(pdata->pwm_gpio,GPIO_LOW);\r
+ u32 divh,divTotal;\r
+ int id = pdata->pwm_id;\r
+ unsigned long clkrate;\r
+\r
+ clkrate = clk_get_rate(pwm_clk);\r
+\r
+ if ( id >3 || id <0 )\r
+ return -1;\r
+\r
+ if(rate == 0)\r
+ {\r
+ // iomux pwm2 to gpio2_a[3]\r
+ rk29_mux_api_set(pdata->pwm_iomux_name, pdata->pwm_iomux_gpio);\r
+ // set gpio to low level\r
+ gpio_set_value(pdata->pwm_gpio,GPIO_LOW);\r
}\r
- else if (rate <= 100)\r
- {\r
- // iomux pwm2 \r
- rk29_mux_api_set(pdata->pwm_iomux_name, pdata->pwm_iomux_pwm);\r
- \r
- pwm_write_reg(id,PWM_REG_CTRL, PWM_DIV|PWM_RESET);\r
- divh = clkrate / nHz;\r
- divh = divh >> (1+(PWM_DIV>>9));\r
- pwm_write_reg(id,PWM_REG_LRC,(divh == 0)?1:divh);\r
- \r
- divTotal =pwm_read_reg(id,PWM_REG_LRC);\r
- divh = divTotal*rate/100;\r
- pwm_write_reg(id, PWM_REG_HRC, divh?divh:1);\r
- pwm_write_reg(id,PWM_REG_CNTR,0);\r
- pwm_write_reg(id, PWM_REG_CTRL,pwm_read_reg(id,PWM_REG_CTRL)|PWM_DIV|PWM_ENABLE|PWM_TimeEN);\r
+ else if (rate <= 100)\r
+ {\r
+ // iomux pwm2\r
+ rk29_mux_api_set(pdata->pwm_iomux_name, pdata->pwm_iomux_pwm);\r
+\r
+ pwm_write_reg(id,PWM_REG_CTRL, PWM_DIV|PWM_RESET);\r
+ divh = clkrate / nHz;\r
+ divh = divh >> (1+(PWM_DIV>>9));\r
+ pwm_write_reg(id,PWM_REG_LRC,(divh == 0)?1:divh);\r
+\r
+ divTotal =pwm_read_reg(id,PWM_REG_LRC);\r
+ divh = divTotal*rate/100;\r
+ pwm_write_reg(id, PWM_REG_HRC, divh?divh:1);\r
+ pwm_write_reg(id,PWM_REG_CNTR,0);\r
+ pwm_write_reg(id, PWM_REG_CTRL,pwm_read_reg(id,PWM_REG_CTRL)|PWM_DIV|PWM_ENABLE|PWM_TimeEN);\r
}\r
- else\r
- {\r
- return -1;\r
+ else\r
+ {\r
+ return -1;\r
}\r
\r
- if (in_atomic() || irqs_disabled())\r
- mdelay(10);\r
- else\r
- usleep_range(10*1000, 10*1000);\r
- \r
- \r
- return (0);\r
+ usleep_range(10*1000, 10*1000);\r
+\r
+\r
+ return (0);\r
}\r
\r
static int pwm_regulator_list_voltage(struct regulator_dev *dev,unsigned int index)\r
{\r
- DBG("Enter %s, index =%d\n",__FUNCTION__,index);\r
- if (index < sizeof(pwm_voltage_map)/sizeof(int))\r
+ DBG("Enter %s, index =%d\n",__FUNCTION__,index);\r
+ if (index < sizeof(pwm_voltage_map)/sizeof(int))\r
return pwm_voltage_map[index];\r
else\r
return -1;\r
\r
static int pwm_regulator_get_voltage(struct regulator_dev *dev)\r
{\r
- struct pwm_platform_data *pdata = rdev_get_drvdata(dev);\r
- \r
+ struct pwm_platform_data *pdata = rdev_get_drvdata(dev);\r
+\r
DBG("Enter %s\n",__FUNCTION__); \r
- \r
+\r
return (pdata->pwm_voltage*1000);\r
}\r
\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38))\r
static int pwm_regulator_set_voltage(struct regulator_dev *dev,\r
- int min_uV, int max_uV)\r
+ int min_uV, int max_uV, unsigned *selector)\r
+#else\r
+static int pwm_regulator_set_voltage(struct regulator_dev *dev,\r
+ int min_uV, int max_uV)\r
+#endif\r
{ \r
struct pwm_platform_data *pdata = rdev_get_drvdata(dev);\r
- \r
- const int *voltage_map = pwm_voltage_map;\r
- \r
- int min_mV = min_uV /1000, max_mA = max_uV / 1000;\r
- \r
+\r
+ const int *voltage_map = pwm_voltage_map;\r
+\r
+ int min_mV = min_uV /1000, max_mA = max_uV / 1000;\r
+\r
u32 size = sizeof(pwm_voltage_map)/sizeof(int), i, vol,pwm_value;\r
\r
DBG("%s: min_uV = %d, max_uV = %d\n",__FUNCTION__, min_uV,max_uV);\r
\r
if (min_mV < voltage_map[0] ||max_mA > voltage_map[size-1])\r
return -EINVAL;\r
- \r
+\r
for (i = 0; i < size; i++)\r
{\r
if (voltage_map[i] >= min_mV)\r
}\r
\r
\r
- vol = voltage_map[i];\r
+ vol = voltage_map[i];\r
+\r
+ pdata->pwm_voltage = vol;\r
\r
- pdata->pwm_voltage = vol;\r
- \r
// VDD12 = 1.4 - 0.476*D , ÆäÖÐDΪPWMÕ¼¿Õ±È, \r
pwm_value = 100*(1400-vol)/476; // pwm_value %\r
\r
- \r
+\r
if (pwm_set_rate(pdata,1000*1000,pwm_value)!=0)\r
return -1;\r
\r
- return 0;\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38))\r
+ *selector = i;\r
+#endif\r
+\r
+ return 0;\r
\r
}\r
\r
};\r
\r
static struct regulator_desc pwm_regulator= {\r
- .name = "pwm-regulator",\r
- .ops = &pwm_voltage_ops,\r
- .type = REGULATOR_VOLTAGE,\r
+ .name = "pwm-regulator",\r
+ .ops = &pwm_voltage_ops,\r
+ .type = REGULATOR_VOLTAGE,\r
};\r
\r
static int __devinit pwm_regulator_probe(struct platform_device *pdev)\r
pdata->pwm_voltage = 1200; // default 1.2v\r
\r
rdev = regulator_register(&pwm_regulator, &pdev->dev,\r
- pdata->init_data, pdata);\r
+ pdata->init_data, pdata);\r
if (IS_ERR(rdev)) {\r
dev_dbg(&pdev->dev, "couldn't register regulator\n");\r
return PTR_ERR(rdev);\r
}\r
- \r
- ret = gpio_request(pdata->pwm_gpio,"pwm");\r
+\r
+ ret = gpio_request(pdata->pwm_gpio,"pwm");\r
\r
if (ret) {\r
- dev_err(&pdev->dev,"failed to request pwm gpio\n");\r
- goto err_gpio;\r
- }\r
+ dev_err(&pdev->dev,"failed to request pwm gpio\n");\r
+ goto err_gpio;\r
+ }\r
\r
pwm_clk = clk_get(NULL, "pwm");\r
clk_enable(pwm_clk);\r
\r
return 0;\r
\r
- \r
+\r
err_gpio:\r
gpio_free(pdata->pwm_gpio);\r
\r