diff options
| -rw-r--r-- | drivers/mfd/twl6040-core.c | 26 | ||||
| -rw-r--r-- | include/linux/mfd/twl6040.h | 17 |
2 files changed, 19 insertions, 24 deletions
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index 6843977f4e87..24d436c2fe4a 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
| @@ -270,7 +270,8 @@ int twl6040_power(struct twl6040 *twl6040, int on) | |||
| 270 | goto out; | 270 | goto out; |
| 271 | } | 271 | } |
| 272 | } | 272 | } |
| 273 | twl6040->pll = TWL6040_LPPLL_ID; | 273 | /* Default PLL configuration after power up */ |
| 274 | twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL; | ||
| 274 | twl6040->sysclk = 19200000; | 275 | twl6040->sysclk = 19200000; |
| 275 | } else { | 276 | } else { |
| 276 | /* already powered-down */ | 277 | /* already powered-down */ |
| @@ -294,7 +295,6 @@ int twl6040_power(struct twl6040 *twl6040, int on) | |||
| 294 | /* use manual power-down sequence */ | 295 | /* use manual power-down sequence */ |
| 295 | twl6040_power_down(twl6040); | 296 | twl6040_power_down(twl6040); |
| 296 | } | 297 | } |
| 297 | twl6040->pll = TWL6040_NOPLL_ID; | ||
| 298 | twl6040->sysclk = 0; | 298 | twl6040->sysclk = 0; |
| 299 | } | 299 | } |
| 300 | 300 | ||
| @@ -304,7 +304,7 @@ out: | |||
| 304 | } | 304 | } |
| 305 | EXPORT_SYMBOL(twl6040_power); | 305 | EXPORT_SYMBOL(twl6040_power); |
| 306 | 306 | ||
| 307 | int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, | 307 | int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, |
| 308 | unsigned int freq_in, unsigned int freq_out) | 308 | unsigned int freq_in, unsigned int freq_out) |
| 309 | { | 309 | { |
| 310 | u8 hppllctl, lppllctl; | 310 | u8 hppllctl, lppllctl; |
| @@ -315,8 +315,8 @@ int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, | |||
| 315 | hppllctl = twl6040_reg_read(twl6040, TWL6040_REG_HPPLLCTL); | 315 | hppllctl = twl6040_reg_read(twl6040, TWL6040_REG_HPPLLCTL); |
| 316 | lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL); | 316 | lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL); |
| 317 | 317 | ||
| 318 | switch (id) { | 318 | switch (pll_id) { |
| 319 | case TWL6040_LPPLL_ID: | 319 | case TWL6040_SYSCLK_SEL_LPPLL: |
| 320 | /* low-power PLL divider */ | 320 | /* low-power PLL divider */ |
| 321 | switch (freq_out) { | 321 | switch (freq_out) { |
| 322 | case 17640000: | 322 | case 17640000: |
| @@ -352,10 +352,8 @@ int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, | |||
| 352 | ret = -EINVAL; | 352 | ret = -EINVAL; |
| 353 | goto pll_out; | 353 | goto pll_out; |
| 354 | } | 354 | } |
| 355 | |||
| 356 | twl6040->pll = TWL6040_LPPLL_ID; | ||
| 357 | break; | 355 | break; |
| 358 | case TWL6040_HPPLL_ID: | 356 | case TWL6040_SYSCLK_SEL_HPPLL: |
| 359 | /* high-performance PLL can provide only 19.2 MHz */ | 357 | /* high-performance PLL can provide only 19.2 MHz */ |
| 360 | if (freq_out != 19200000) { | 358 | if (freq_out != 19200000) { |
| 361 | dev_err(&twl6040_dev->dev, | 359 | dev_err(&twl6040_dev->dev, |
| @@ -406,16 +404,15 @@ int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, | |||
| 406 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); | 404 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); |
| 407 | lppllctl &= ~TWL6040_LPLLENA; | 405 | lppllctl &= ~TWL6040_LPLLENA; |
| 408 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); | 406 | twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl); |
| 409 | |||
| 410 | twl6040->pll = TWL6040_HPPLL_ID; | ||
| 411 | break; | 407 | break; |
| 412 | default: | 408 | default: |
| 413 | dev_err(&twl6040_dev->dev, "unknown pll id %d\n", id); | 409 | dev_err(&twl6040_dev->dev, "unknown pll id %d\n", pll_id); |
| 414 | ret = -EINVAL; | 410 | ret = -EINVAL; |
| 415 | goto pll_out; | 411 | goto pll_out; |
| 416 | } | 412 | } |
| 417 | 413 | ||
| 418 | twl6040->sysclk = freq_out; | 414 | twl6040->sysclk = freq_out; |
| 415 | twl6040->pll = pll_id; | ||
| 419 | 416 | ||
| 420 | pll_out: | 417 | pll_out: |
| 421 | mutex_unlock(&twl6040->mutex); | 418 | mutex_unlock(&twl6040->mutex); |
| @@ -423,9 +420,12 @@ pll_out: | |||
| 423 | } | 420 | } |
| 424 | EXPORT_SYMBOL(twl6040_set_pll); | 421 | EXPORT_SYMBOL(twl6040_set_pll); |
| 425 | 422 | ||
| 426 | enum twl6040_pll_id twl6040_get_pll(struct twl6040 *twl6040) | 423 | int twl6040_get_pll(struct twl6040 *twl6040) |
| 427 | { | 424 | { |
| 428 | return twl6040->pll; | 425 | if (twl6040->power_count) |
| 426 | return twl6040->pll; | ||
| 427 | else | ||
| 428 | return -ENODEV; | ||
| 429 | } | 429 | } |
| 430 | EXPORT_SYMBOL(twl6040_get_pll); | 430 | EXPORT_SYMBOL(twl6040_get_pll); |
| 431 | 431 | ||
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index df890a247c36..4c806f6d663e 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h | |||
| @@ -165,9 +165,6 @@ | |||
| 165 | #define TWL6040_RESETSPLIT 0x04 | 165 | #define TWL6040_RESETSPLIT 0x04 |
| 166 | #define TWL6040_INTCLRMODE 0x08 | 166 | #define TWL6040_INTCLRMODE 0x08 |
| 167 | 167 | ||
| 168 | #define TWL6040_SYSCLK_SEL_LPPLL 1 | ||
| 169 | #define TWL6040_SYSCLK_SEL_HPPLL 2 | ||
| 170 | |||
| 171 | /* STATUS (0x2E) fields */ | 168 | /* STATUS (0x2E) fields */ |
| 172 | 169 | ||
| 173 | #define TWL6040_PLUGCOMP 0x02 | 170 | #define TWL6040_PLUGCOMP 0x02 |
| @@ -188,11 +185,9 @@ | |||
| 188 | #define TWL6040_IRQ_VIB 4 | 185 | #define TWL6040_IRQ_VIB 4 |
| 189 | #define TWL6040_IRQ_READY 5 | 186 | #define TWL6040_IRQ_READY 5 |
| 190 | 187 | ||
| 191 | enum twl6040_pll_id { | 188 | /* PLL selection */ |
| 192 | TWL6040_NOPLL_ID, | 189 | #define TWL6040_SYSCLK_SEL_LPPLL 0 |
| 193 | TWL6040_LPPLL_ID, | 190 | #define TWL6040_SYSCLK_SEL_HPPLL 1 |
| 194 | TWL6040_HPPLL_ID, | ||
| 195 | }; | ||
| 196 | 191 | ||
| 197 | struct twl6040 { | 192 | struct twl6040 { |
| 198 | struct device *dev; | 193 | struct device *dev; |
| @@ -206,7 +201,7 @@ struct twl6040 { | |||
| 206 | int power_count; | 201 | int power_count; |
| 207 | int rev; | 202 | int rev; |
| 208 | 203 | ||
| 209 | enum twl6040_pll_id pll; | 204 | int pll; |
| 210 | unsigned int sysclk; | 205 | unsigned int sysclk; |
| 211 | 206 | ||
| 212 | unsigned int irq; | 207 | unsigned int irq; |
| @@ -223,9 +218,9 @@ int twl6040_set_bits(struct twl6040 *twl6040, unsigned int reg, | |||
| 223 | int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, | 218 | int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, |
| 224 | u8 mask); | 219 | u8 mask); |
| 225 | int twl6040_power(struct twl6040 *twl6040, int on); | 220 | int twl6040_power(struct twl6040 *twl6040, int on); |
| 226 | int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, | 221 | int twl6040_set_pll(struct twl6040 *twl6040, int pll_id, |
| 227 | unsigned int freq_in, unsigned int freq_out); | 222 | unsigned int freq_in, unsigned int freq_out); |
| 228 | enum twl6040_pll_id twl6040_get_pll(struct twl6040 *twl6040); | 223 | int twl6040_get_pll(struct twl6040 *twl6040); |
| 229 | unsigned int twl6040_get_sysclk(struct twl6040 *twl6040); | 224 | unsigned int twl6040_get_sysclk(struct twl6040 *twl6040); |
| 230 | int twl6040_irq_init(struct twl6040 *twl6040); | 225 | int twl6040_irq_init(struct twl6040 *twl6040); |
| 231 | void twl6040_irq_exit(struct twl6040 *twl6040); | 226 | void twl6040_irq_exit(struct twl6040 *twl6040); |
