diff options
Diffstat (limited to 'drivers/misc/max8997-muic.c')
-rw-r--r-- | drivers/misc/max8997-muic.c | 137 |
1 files changed, 4 insertions, 133 deletions
diff --git a/drivers/misc/max8997-muic.c b/drivers/misc/max8997-muic.c index 74a9448a93d2..d74ef41aabd5 100644 --- a/drivers/misc/max8997-muic.c +++ b/drivers/misc/max8997-muic.c | |||
@@ -307,11 +307,8 @@ static void max8997_muic_irq_work(struct work_struct *work) | |||
307 | struct max8997_muic_info, irq_work); | 307 | struct max8997_muic_info, irq_work); |
308 | struct max8997_platform_data *pdata = | 308 | struct max8997_platform_data *pdata = |
309 | dev_get_platdata(info->iodev->dev); | 309 | dev_get_platdata(info->iodev->dev); |
310 | char env_name_str[30], env_state_str[15]; | ||
311 | char *envp[] = { env_name_str, env_state_str, NULL }; | ||
312 | u8 status[3]; | 310 | u8 status[3]; |
313 | u8 adc, adc_low, adc_err; | 311 | u8 adc, chg_type; |
314 | u8 vb_volt, db_chg, dcd_tmr, cdr, chg_type, ovp; | ||
315 | 312 | ||
316 | int irq_type = info->irq - pdata->irq_base; | 313 | int irq_type = info->irq - pdata->irq_base; |
317 | int ret; | 314 | int ret; |
@@ -330,72 +327,24 @@ static void max8997_muic_irq_work(struct work_struct *work) | |||
330 | status[0], status[1]); | 327 | status[0], status[1]); |
331 | 328 | ||
332 | switch (irq_type) { | 329 | switch (irq_type) { |
333 | case MAX8997_MUICIRQ_ADCError: | ||
334 | adc_err = status[0] & STATUS1_ADCERR_MASK; | ||
335 | adc_err >>= STATUS1_ADCERR_SHIFT; | ||
336 | sprintf(env_name_str, "IRQ=%s", "ADC_Error"); | ||
337 | sprintf(env_state_str, "STATE=%d", adc_err); | ||
338 | break; | ||
339 | case MAX8997_MUICIRQ_ADCLow: | ||
340 | adc_low = status[0] & STATUS1_ADCLOW_MASK; | ||
341 | adc_low >>= STATUS1_ADCLOW_SHIFT; | ||
342 | sprintf(env_name_str, "IRQ=%s", "ADC_Low"); | ||
343 | sprintf(env_state_str, "STATE=%d", adc_low); | ||
344 | break; | ||
345 | case MAX8997_MUICIRQ_ADC: | 330 | case MAX8997_MUICIRQ_ADC: |
346 | adc = status[0] & STATUS1_ADC_MASK; | 331 | adc = status[0] & STATUS1_ADC_MASK; |
347 | adc >>= STATUS1_ADC_SHIFT; | 332 | adc >>= STATUS1_ADC_SHIFT; |
348 | 333 | ||
349 | max8997_muic_handle_adc(info, adc); | 334 | max8997_muic_handle_adc(info, adc); |
350 | |||
351 | sprintf(env_name_str, "IRQ=%s", "ADC"); | ||
352 | sprintf(env_state_str, "STATE=%d", adc); | ||
353 | break; | ||
354 | case MAX8997_MUICIRQ_VBVolt: | ||
355 | vb_volt = status[1] & STATUS2_VBVOLT_MASK; | ||
356 | vb_volt >>= STATUS2_VBVOLT_SHIFT; | ||
357 | sprintf(env_name_str, "IRQ=%s", "VB_Volt"); | ||
358 | sprintf(env_state_str, "STATE=%d", vb_volt); | ||
359 | break; | ||
360 | case MAX8997_MUICIRQ_DBChg: | ||
361 | db_chg = status[1] & STATUS2_DBCHG_MASK; | ||
362 | db_chg >>= STATUS2_DBCHG_SHIFT; | ||
363 | sprintf(env_name_str, "IRQ=%s", "DB_CHARGER"); | ||
364 | sprintf(env_state_str, "STATE=%d", db_chg); | ||
365 | break; | ||
366 | case MAX8997_MUICIRQ_DCDTmr: | ||
367 | dcd_tmr = status[1] & STATUS2_DCDTMR_MASK; | ||
368 | dcd_tmr >>= STATUS2_DCDTMR_SHIFT; | ||
369 | sprintf(env_name_str, "IRQ=%s", "DCD_TIMER"); | ||
370 | sprintf(env_state_str, "STATE=%d", dcd_tmr); | ||
371 | break; | ||
372 | case MAX8997_MUICIRQ_ChgDetRun: | ||
373 | cdr = status[1] & STATUS2_CHGDETRUN_MASK; | ||
374 | cdr >>= STATUS2_CHGDETRUN_SHIFT; | ||
375 | sprintf(env_name_str, "IRQ=%s", "CHG_DET_RUN"); | ||
376 | sprintf(env_state_str, "STATE=%d", cdr); | ||
377 | break; | 335 | break; |
378 | case MAX8997_MUICIRQ_ChgTyp: | 336 | case MAX8997_MUICIRQ_ChgTyp: |
379 | chg_type = status[1] & STATUS2_CHGTYP_MASK; | 337 | chg_type = status[1] & STATUS2_CHGTYP_MASK; |
380 | chg_type >>= STATUS2_CHGTYP_SHIFT; | 338 | chg_type >>= STATUS2_CHGTYP_SHIFT; |
381 | 339 | ||
382 | max8997_muic_handle_charger_type(info, chg_type); | 340 | max8997_muic_handle_charger_type(info, chg_type); |
383 | |||
384 | sprintf(env_name_str, "IRQ=%s", "CHARGER_TYPE"); | ||
385 | sprintf(env_state_str, "STATE=%d", chg_type); | ||
386 | break; | ||
387 | case MAX8997_MUICIRQ_OVP: | ||
388 | ovp = status[2] & STATUS3_OVP_MASK; | ||
389 | ovp >>= STATUS3_OVP_SHIFT; | ||
390 | sprintf(env_name_str, "IRQ=%s", "OVER-VOLTAGE"); | ||
391 | sprintf(env_state_str, "STATE=%d", ovp); | ||
392 | break; | 341 | break; |
393 | default: | 342 | default: |
343 | dev_info(info->dev, "misc interrupt: %s occurred\n", | ||
344 | muic_irqs[irq_type].name); | ||
394 | break; | 345 | break; |
395 | } | 346 | } |
396 | 347 | ||
397 | kobject_uevent_env(&info->dev->kobj, KOBJ_CHANGE, envp); | ||
398 | |||
399 | mutex_unlock(&info->mutex); | 348 | mutex_unlock(&info->mutex); |
400 | 349 | ||
401 | return; | 350 | return; |
@@ -438,74 +387,6 @@ static void max8997_muic_detect_dev(struct max8997_muic_info *info) | |||
438 | max8997_muic_handle_charger_type(info, chg_type); | 387 | max8997_muic_handle_charger_type(info, chg_type); |
439 | } | 388 | } |
440 | 389 | ||
441 | static ssize_t max8997_muic_show_manualsw(struct device *dev, | ||
442 | struct device_attribute *attr, char *buf) | ||
443 | { | ||
444 | struct max8997_muic_info *info = dev_get_drvdata(dev); | ||
445 | int ret; | ||
446 | u8 value, manual_switch; | ||
447 | |||
448 | ret = max8997_read_reg(info->muic, MAX8997_MUIC_REG_CONTROL1, &value); | ||
449 | if (ret) { | ||
450 | dev_err(info->dev, "failed to read muic register\n"); | ||
451 | return sprintf(buf, "UNKNOWN\n"); | ||
452 | } | ||
453 | |||
454 | manual_switch = value & (COMN1SW_MASK | COMP2SW_MASK); | ||
455 | |||
456 | switch (manual_switch) { | ||
457 | case MAX8997_SW_USB: | ||
458 | return sprintf(buf, "USB\n"); | ||
459 | case MAX8997_SW_AUDIO: | ||
460 | return sprintf(buf, "AUDIO\n"); | ||
461 | case MAX8997_SW_UART: | ||
462 | return sprintf(buf, "UART\n"); | ||
463 | default: | ||
464 | return sprintf(buf, "OPEN\n"); | ||
465 | } | ||
466 | } | ||
467 | |||
468 | static ssize_t max8997_muic_store_manualsw(struct device *dev, | ||
469 | struct device_attribute *attr, | ||
470 | const char *buf, size_t count) | ||
471 | { | ||
472 | struct max8997_muic_info *info = dev_get_drvdata(dev); | ||
473 | int ret; | ||
474 | u8 manual_switch; | ||
475 | |||
476 | if (!strncmp(buf, "USB", 3)) { | ||
477 | manual_switch = MAX8997_SW_USB; | ||
478 | } else if (!strncmp(buf, "AUDIO", 5)) { | ||
479 | manual_switch = MAX8997_SW_AUDIO; | ||
480 | } else if (!strncmp(buf, "UART", 4)) { | ||
481 | manual_switch = MAX8997_SW_UART; | ||
482 | } else if (!strncmp(buf, "OPEN", 4)) { | ||
483 | manual_switch = MAX8997_SW_OPEN; | ||
484 | } else { | ||
485 | dev_err(info->dev, "invalid parameter\n"); | ||
486 | goto out; | ||
487 | } | ||
488 | |||
489 | ret = max8997_update_reg(info->muic, MAX8997_MUIC_REG_CONTROL1, | ||
490 | manual_switch, SW_MASK); | ||
491 | if (ret) | ||
492 | dev_err(info->dev, "failed to update muic register\n"); | ||
493 | out: | ||
494 | return count; | ||
495 | } | ||
496 | |||
497 | static DEVICE_ATTR(switch, S_IRUGO | S_IWUSR, | ||
498 | max8997_muic_show_manualsw, max8997_muic_store_manualsw); | ||
499 | |||
500 | static struct attribute *max8997_muic_attributes[] = { | ||
501 | &dev_attr_switch.attr, | ||
502 | NULL | ||
503 | }; | ||
504 | |||
505 | static const struct attribute_group max8997_muic_group = { | ||
506 | .attrs = max8997_muic_attributes, | ||
507 | }; | ||
508 | |||
509 | static void max8997_initialize_device(struct max8997_muic_info *info) | 390 | static void max8997_initialize_device(struct max8997_muic_info *info) |
510 | { | 391 | { |
511 | struct max8997_muic_platform_data *mdata = info->muic_pdata; | 392 | struct max8997_muic_platform_data *mdata = info->muic_pdata; |
@@ -545,13 +426,6 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) | |||
545 | platform_set_drvdata(pdev, info); | 426 | platform_set_drvdata(pdev, info); |
546 | mutex_init(&info->mutex); | 427 | mutex_init(&info->mutex); |
547 | 428 | ||
548 | ret = sysfs_create_group(&pdev->dev.kobj, &max8997_muic_group); | ||
549 | if (ret) { | ||
550 | dev_err(&pdev->dev, | ||
551 | "failed to create max8997 muic attribute group\n"); | ||
552 | goto err_sysfs; | ||
553 | } | ||
554 | |||
555 | INIT_WORK(&info->irq_work, max8997_muic_irq_work); | 429 | INIT_WORK(&info->irq_work, max8997_muic_irq_work); |
556 | 430 | ||
557 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { | 431 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { |
@@ -583,8 +457,6 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev) | |||
583 | return ret; | 457 | return ret; |
584 | 458 | ||
585 | err_irq: | 459 | err_irq: |
586 | sysfs_remove_group(&pdev->dev.kobj, &max8997_muic_group); | ||
587 | err_sysfs: | ||
588 | err_pdata: | 460 | err_pdata: |
589 | kfree(info); | 461 | kfree(info); |
590 | err_kfree: | 462 | err_kfree: |
@@ -598,10 +470,9 @@ static int __devexit max8997_muic_remove(struct platform_device *pdev) | |||
598 | dev_get_platdata(info->iodev->dev); | 470 | dev_get_platdata(info->iodev->dev); |
599 | int i; | 471 | int i; |
600 | 472 | ||
601 | sysfs_remove_group(&pdev->dev.kobj, &max8997_muic_group); | ||
602 | |||
603 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) | 473 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) |
604 | free_irq(pdata->irq_base + muic_irqs[i].irq, info); | 474 | free_irq(pdata->irq_base + muic_irqs[i].irq, info); |
475 | cancel_work_sync(&info->irq_work); | ||
605 | 476 | ||
606 | kfree(info); | 477 | kfree(info); |
607 | 478 | ||