diff options
author | Mark Brown <broonie@kernel.org> | 2014-10-28 18:15:31 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-10-29 07:15:10 -0400 |
commit | 7077148fb50a120d20a50516a332ed6eb9233c16 (patch) | |
tree | c057c8f5ef91ed7191e92bebe65d691b022fb405 /sound | |
parent | c1b4d1c7774189002bc08766ec10e339dfbc98d6 (diff) |
ASoC: core: Split ops out of soc-core.c
The main ASoC source file is getting quite large and the standard ops don't
really have anything to do with the rest of the file so split them out into
a separate file.
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/Makefile | 2 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 919 | ||||
-rw-r--r-- | sound/soc/soc-ops.c | 952 |
3 files changed, 953 insertions, 920 deletions
diff --git a/sound/soc/Makefile b/sound/soc/Makefile index 534714a1ca44..a384d145e4d2 100644 --- a/sound/soc/Makefile +++ b/sound/soc/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o | 1 | snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o |
2 | snd-soc-core-objs += soc-pcm.o soc-compress.o soc-io.o soc-devres.o | 2 | snd-soc-core-objs += soc-pcm.o soc-compress.o soc-io.o soc-devres.o soc-ops.o |
3 | 3 | ||
4 | ifneq ($(CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM),) | 4 | ifneq ($(CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM),) |
5 | snd-soc-core-objs += soc-generic-dmaengine-pcm.o | 5 | snd-soc-core-objs += soc-generic-dmaengine-pcm.o |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 47c378abb9a2..a2b51edf6d83 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -2334,925 +2334,6 @@ int snd_soc_add_dai_controls(struct snd_soc_dai *dai, | |||
2334 | EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls); | 2334 | EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls); |
2335 | 2335 | ||
2336 | /** | 2336 | /** |
2337 | * snd_soc_info_enum_double - enumerated double mixer info callback | ||
2338 | * @kcontrol: mixer control | ||
2339 | * @uinfo: control element information | ||
2340 | * | ||
2341 | * Callback to provide information about a double enumerated | ||
2342 | * mixer control. | ||
2343 | * | ||
2344 | * Returns 0 for success. | ||
2345 | */ | ||
2346 | int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol, | ||
2347 | struct snd_ctl_elem_info *uinfo) | ||
2348 | { | ||
2349 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
2350 | |||
2351 | return snd_ctl_enum_info(uinfo, e->shift_l == e->shift_r ? 1 : 2, | ||
2352 | e->items, e->texts); | ||
2353 | } | ||
2354 | EXPORT_SYMBOL_GPL(snd_soc_info_enum_double); | ||
2355 | |||
2356 | /** | ||
2357 | * snd_soc_get_enum_double - enumerated double mixer get callback | ||
2358 | * @kcontrol: mixer control | ||
2359 | * @ucontrol: control element information | ||
2360 | * | ||
2361 | * Callback to get the value of a double enumerated mixer. | ||
2362 | * | ||
2363 | * Returns 0 for success. | ||
2364 | */ | ||
2365 | int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol, | ||
2366 | struct snd_ctl_elem_value *ucontrol) | ||
2367 | { | ||
2368 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2369 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
2370 | unsigned int val, item; | ||
2371 | unsigned int reg_val; | ||
2372 | int ret; | ||
2373 | |||
2374 | ret = snd_soc_component_read(component, e->reg, ®_val); | ||
2375 | if (ret) | ||
2376 | return ret; | ||
2377 | val = (reg_val >> e->shift_l) & e->mask; | ||
2378 | item = snd_soc_enum_val_to_item(e, val); | ||
2379 | ucontrol->value.enumerated.item[0] = item; | ||
2380 | if (e->shift_l != e->shift_r) { | ||
2381 | val = (reg_val >> e->shift_l) & e->mask; | ||
2382 | item = snd_soc_enum_val_to_item(e, val); | ||
2383 | ucontrol->value.enumerated.item[1] = item; | ||
2384 | } | ||
2385 | |||
2386 | return 0; | ||
2387 | } | ||
2388 | EXPORT_SYMBOL_GPL(snd_soc_get_enum_double); | ||
2389 | |||
2390 | /** | ||
2391 | * snd_soc_put_enum_double - enumerated double mixer put callback | ||
2392 | * @kcontrol: mixer control | ||
2393 | * @ucontrol: control element information | ||
2394 | * | ||
2395 | * Callback to set the value of a double enumerated mixer. | ||
2396 | * | ||
2397 | * Returns 0 for success. | ||
2398 | */ | ||
2399 | int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, | ||
2400 | struct snd_ctl_elem_value *ucontrol) | ||
2401 | { | ||
2402 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2403 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
2404 | unsigned int *item = ucontrol->value.enumerated.item; | ||
2405 | unsigned int val; | ||
2406 | unsigned int mask; | ||
2407 | |||
2408 | if (item[0] >= e->items) | ||
2409 | return -EINVAL; | ||
2410 | val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; | ||
2411 | mask = e->mask << e->shift_l; | ||
2412 | if (e->shift_l != e->shift_r) { | ||
2413 | if (item[1] >= e->items) | ||
2414 | return -EINVAL; | ||
2415 | val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r; | ||
2416 | mask |= e->mask << e->shift_r; | ||
2417 | } | ||
2418 | |||
2419 | return snd_soc_component_update_bits(component, e->reg, mask, val); | ||
2420 | } | ||
2421 | EXPORT_SYMBOL_GPL(snd_soc_put_enum_double); | ||
2422 | |||
2423 | /** | ||
2424 | * snd_soc_read_signed - Read a codec register and interprete as signed value | ||
2425 | * @component: component | ||
2426 | * @reg: Register to read | ||
2427 | * @mask: Mask to use after shifting the register value | ||
2428 | * @shift: Right shift of register value | ||
2429 | * @sign_bit: Bit that describes if a number is negative or not. | ||
2430 | * @signed_val: Pointer to where the read value should be stored | ||
2431 | * | ||
2432 | * This functions reads a codec register. The register value is shifted right | ||
2433 | * by 'shift' bits and masked with the given 'mask'. Afterwards it translates | ||
2434 | * the given registervalue into a signed integer if sign_bit is non-zero. | ||
2435 | * | ||
2436 | * Returns 0 on sucess, otherwise an error value | ||
2437 | */ | ||
2438 | static int snd_soc_read_signed(struct snd_soc_component *component, | ||
2439 | unsigned int reg, unsigned int mask, unsigned int shift, | ||
2440 | unsigned int sign_bit, int *signed_val) | ||
2441 | { | ||
2442 | int ret; | ||
2443 | unsigned int val; | ||
2444 | |||
2445 | ret = snd_soc_component_read(component, reg, &val); | ||
2446 | if (ret < 0) | ||
2447 | return ret; | ||
2448 | |||
2449 | val = (val >> shift) & mask; | ||
2450 | |||
2451 | if (!sign_bit) { | ||
2452 | *signed_val = val; | ||
2453 | return 0; | ||
2454 | } | ||
2455 | |||
2456 | /* non-negative number */ | ||
2457 | if (!(val & BIT(sign_bit))) { | ||
2458 | *signed_val = val; | ||
2459 | return 0; | ||
2460 | } | ||
2461 | |||
2462 | ret = val; | ||
2463 | |||
2464 | /* | ||
2465 | * The register most probably does not contain a full-sized int. | ||
2466 | * Instead we have an arbitrary number of bits in a signed | ||
2467 | * representation which has to be translated into a full-sized int. | ||
2468 | * This is done by filling up all bits above the sign-bit. | ||
2469 | */ | ||
2470 | ret |= ~((int)(BIT(sign_bit) - 1)); | ||
2471 | |||
2472 | *signed_val = ret; | ||
2473 | |||
2474 | return 0; | ||
2475 | } | ||
2476 | |||
2477 | /** | ||
2478 | * snd_soc_info_volsw - single mixer info callback | ||
2479 | * @kcontrol: mixer control | ||
2480 | * @uinfo: control element information | ||
2481 | * | ||
2482 | * Callback to provide information about a single mixer control, or a double | ||
2483 | * mixer control that spans 2 registers. | ||
2484 | * | ||
2485 | * Returns 0 for success. | ||
2486 | */ | ||
2487 | int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, | ||
2488 | struct snd_ctl_elem_info *uinfo) | ||
2489 | { | ||
2490 | struct soc_mixer_control *mc = | ||
2491 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2492 | int platform_max; | ||
2493 | |||
2494 | if (!mc->platform_max) | ||
2495 | mc->platform_max = mc->max; | ||
2496 | platform_max = mc->platform_max; | ||
2497 | |||
2498 | if (platform_max == 1 && !strstr(kcontrol->id.name, " Volume")) | ||
2499 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
2500 | else | ||
2501 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
2502 | |||
2503 | uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; | ||
2504 | uinfo->value.integer.min = 0; | ||
2505 | uinfo->value.integer.max = platform_max - mc->min; | ||
2506 | return 0; | ||
2507 | } | ||
2508 | EXPORT_SYMBOL_GPL(snd_soc_info_volsw); | ||
2509 | |||
2510 | /** | ||
2511 | * snd_soc_get_volsw - single mixer get callback | ||
2512 | * @kcontrol: mixer control | ||
2513 | * @ucontrol: control element information | ||
2514 | * | ||
2515 | * Callback to get the value of a single mixer control, or a double mixer | ||
2516 | * control that spans 2 registers. | ||
2517 | * | ||
2518 | * Returns 0 for success. | ||
2519 | */ | ||
2520 | int snd_soc_get_volsw(struct snd_kcontrol *kcontrol, | ||
2521 | struct snd_ctl_elem_value *ucontrol) | ||
2522 | { | ||
2523 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2524 | struct soc_mixer_control *mc = | ||
2525 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2526 | unsigned int reg = mc->reg; | ||
2527 | unsigned int reg2 = mc->rreg; | ||
2528 | unsigned int shift = mc->shift; | ||
2529 | unsigned int rshift = mc->rshift; | ||
2530 | int max = mc->max; | ||
2531 | int min = mc->min; | ||
2532 | int sign_bit = mc->sign_bit; | ||
2533 | unsigned int mask = (1 << fls(max)) - 1; | ||
2534 | unsigned int invert = mc->invert; | ||
2535 | int val; | ||
2536 | int ret; | ||
2537 | |||
2538 | if (sign_bit) | ||
2539 | mask = BIT(sign_bit + 1) - 1; | ||
2540 | |||
2541 | ret = snd_soc_read_signed(component, reg, mask, shift, sign_bit, &val); | ||
2542 | if (ret) | ||
2543 | return ret; | ||
2544 | |||
2545 | ucontrol->value.integer.value[0] = val - min; | ||
2546 | if (invert) | ||
2547 | ucontrol->value.integer.value[0] = | ||
2548 | max - ucontrol->value.integer.value[0]; | ||
2549 | |||
2550 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2551 | if (reg == reg2) | ||
2552 | ret = snd_soc_read_signed(component, reg, mask, rshift, | ||
2553 | sign_bit, &val); | ||
2554 | else | ||
2555 | ret = snd_soc_read_signed(component, reg2, mask, shift, | ||
2556 | sign_bit, &val); | ||
2557 | if (ret) | ||
2558 | return ret; | ||
2559 | |||
2560 | ucontrol->value.integer.value[1] = val - min; | ||
2561 | if (invert) | ||
2562 | ucontrol->value.integer.value[1] = | ||
2563 | max - ucontrol->value.integer.value[1]; | ||
2564 | } | ||
2565 | |||
2566 | return 0; | ||
2567 | } | ||
2568 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw); | ||
2569 | |||
2570 | /** | ||
2571 | * snd_soc_put_volsw - single mixer put callback | ||
2572 | * @kcontrol: mixer control | ||
2573 | * @ucontrol: control element information | ||
2574 | * | ||
2575 | * Callback to set the value of a single mixer control, or a double mixer | ||
2576 | * control that spans 2 registers. | ||
2577 | * | ||
2578 | * Returns 0 for success. | ||
2579 | */ | ||
2580 | int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, | ||
2581 | struct snd_ctl_elem_value *ucontrol) | ||
2582 | { | ||
2583 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2584 | struct soc_mixer_control *mc = | ||
2585 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2586 | unsigned int reg = mc->reg; | ||
2587 | unsigned int reg2 = mc->rreg; | ||
2588 | unsigned int shift = mc->shift; | ||
2589 | unsigned int rshift = mc->rshift; | ||
2590 | int max = mc->max; | ||
2591 | int min = mc->min; | ||
2592 | unsigned int sign_bit = mc->sign_bit; | ||
2593 | unsigned int mask = (1 << fls(max)) - 1; | ||
2594 | unsigned int invert = mc->invert; | ||
2595 | int err; | ||
2596 | bool type_2r = false; | ||
2597 | unsigned int val2 = 0; | ||
2598 | unsigned int val, val_mask; | ||
2599 | |||
2600 | if (sign_bit) | ||
2601 | mask = BIT(sign_bit + 1) - 1; | ||
2602 | |||
2603 | val = ((ucontrol->value.integer.value[0] + min) & mask); | ||
2604 | if (invert) | ||
2605 | val = max - val; | ||
2606 | val_mask = mask << shift; | ||
2607 | val = val << shift; | ||
2608 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2609 | val2 = ((ucontrol->value.integer.value[1] + min) & mask); | ||
2610 | if (invert) | ||
2611 | val2 = max - val2; | ||
2612 | if (reg == reg2) { | ||
2613 | val_mask |= mask << rshift; | ||
2614 | val |= val2 << rshift; | ||
2615 | } else { | ||
2616 | val2 = val2 << shift; | ||
2617 | type_2r = true; | ||
2618 | } | ||
2619 | } | ||
2620 | err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2621 | if (err < 0) | ||
2622 | return err; | ||
2623 | |||
2624 | if (type_2r) | ||
2625 | err = snd_soc_component_update_bits(component, reg2, val_mask, | ||
2626 | val2); | ||
2627 | |||
2628 | return err; | ||
2629 | } | ||
2630 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw); | ||
2631 | |||
2632 | /** | ||
2633 | * snd_soc_get_volsw_sx - single mixer get callback | ||
2634 | * @kcontrol: mixer control | ||
2635 | * @ucontrol: control element information | ||
2636 | * | ||
2637 | * Callback to get the value of a single mixer control, or a double mixer | ||
2638 | * control that spans 2 registers. | ||
2639 | * | ||
2640 | * Returns 0 for success. | ||
2641 | */ | ||
2642 | int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, | ||
2643 | struct snd_ctl_elem_value *ucontrol) | ||
2644 | { | ||
2645 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2646 | struct soc_mixer_control *mc = | ||
2647 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2648 | unsigned int reg = mc->reg; | ||
2649 | unsigned int reg2 = mc->rreg; | ||
2650 | unsigned int shift = mc->shift; | ||
2651 | unsigned int rshift = mc->rshift; | ||
2652 | int max = mc->max; | ||
2653 | int min = mc->min; | ||
2654 | int mask = (1 << (fls(min + max) - 1)) - 1; | ||
2655 | unsigned int val; | ||
2656 | int ret; | ||
2657 | |||
2658 | ret = snd_soc_component_read(component, reg, &val); | ||
2659 | if (ret < 0) | ||
2660 | return ret; | ||
2661 | |||
2662 | ucontrol->value.integer.value[0] = ((val >> shift) - min) & mask; | ||
2663 | |||
2664 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2665 | ret = snd_soc_component_read(component, reg2, &val); | ||
2666 | if (ret < 0) | ||
2667 | return ret; | ||
2668 | |||
2669 | val = ((val >> rshift) - min) & mask; | ||
2670 | ucontrol->value.integer.value[1] = val; | ||
2671 | } | ||
2672 | |||
2673 | return 0; | ||
2674 | } | ||
2675 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx); | ||
2676 | |||
2677 | /** | ||
2678 | * snd_soc_put_volsw_sx - double mixer set callback | ||
2679 | * @kcontrol: mixer control | ||
2680 | * @uinfo: control element information | ||
2681 | * | ||
2682 | * Callback to set the value of a double mixer control that spans 2 registers. | ||
2683 | * | ||
2684 | * Returns 0 for success. | ||
2685 | */ | ||
2686 | int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, | ||
2687 | struct snd_ctl_elem_value *ucontrol) | ||
2688 | { | ||
2689 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2690 | struct soc_mixer_control *mc = | ||
2691 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2692 | |||
2693 | unsigned int reg = mc->reg; | ||
2694 | unsigned int reg2 = mc->rreg; | ||
2695 | unsigned int shift = mc->shift; | ||
2696 | unsigned int rshift = mc->rshift; | ||
2697 | int max = mc->max; | ||
2698 | int min = mc->min; | ||
2699 | int mask = (1 << (fls(min + max) - 1)) - 1; | ||
2700 | int err = 0; | ||
2701 | unsigned int val, val_mask, val2 = 0; | ||
2702 | |||
2703 | val_mask = mask << shift; | ||
2704 | val = (ucontrol->value.integer.value[0] + min) & mask; | ||
2705 | val = val << shift; | ||
2706 | |||
2707 | err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2708 | if (err < 0) | ||
2709 | return err; | ||
2710 | |||
2711 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2712 | val_mask = mask << rshift; | ||
2713 | val2 = (ucontrol->value.integer.value[1] + min) & mask; | ||
2714 | val2 = val2 << rshift; | ||
2715 | |||
2716 | err = snd_soc_component_update_bits(component, reg2, val_mask, | ||
2717 | val2); | ||
2718 | } | ||
2719 | return err; | ||
2720 | } | ||
2721 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx); | ||
2722 | |||
2723 | /** | ||
2724 | * snd_soc_info_volsw_range - single mixer info callback with range. | ||
2725 | * @kcontrol: mixer control | ||
2726 | * @uinfo: control element information | ||
2727 | * | ||
2728 | * Callback to provide information, within a range, about a single | ||
2729 | * mixer control. | ||
2730 | * | ||
2731 | * returns 0 for success. | ||
2732 | */ | ||
2733 | int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, | ||
2734 | struct snd_ctl_elem_info *uinfo) | ||
2735 | { | ||
2736 | struct soc_mixer_control *mc = | ||
2737 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2738 | int platform_max; | ||
2739 | int min = mc->min; | ||
2740 | |||
2741 | if (!mc->platform_max) | ||
2742 | mc->platform_max = mc->max; | ||
2743 | platform_max = mc->platform_max; | ||
2744 | |||
2745 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
2746 | uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; | ||
2747 | uinfo->value.integer.min = 0; | ||
2748 | uinfo->value.integer.max = platform_max - min; | ||
2749 | |||
2750 | return 0; | ||
2751 | } | ||
2752 | EXPORT_SYMBOL_GPL(snd_soc_info_volsw_range); | ||
2753 | |||
2754 | /** | ||
2755 | * snd_soc_put_volsw_range - single mixer put value callback with range. | ||
2756 | * @kcontrol: mixer control | ||
2757 | * @ucontrol: control element information | ||
2758 | * | ||
2759 | * Callback to set the value, within a range, for a single mixer control. | ||
2760 | * | ||
2761 | * Returns 0 for success. | ||
2762 | */ | ||
2763 | int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, | ||
2764 | struct snd_ctl_elem_value *ucontrol) | ||
2765 | { | ||
2766 | struct soc_mixer_control *mc = | ||
2767 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2768 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2769 | unsigned int reg = mc->reg; | ||
2770 | unsigned int rreg = mc->rreg; | ||
2771 | unsigned int shift = mc->shift; | ||
2772 | int min = mc->min; | ||
2773 | int max = mc->max; | ||
2774 | unsigned int mask = (1 << fls(max)) - 1; | ||
2775 | unsigned int invert = mc->invert; | ||
2776 | unsigned int val, val_mask; | ||
2777 | int ret; | ||
2778 | |||
2779 | if (invert) | ||
2780 | val = (max - ucontrol->value.integer.value[0]) & mask; | ||
2781 | else | ||
2782 | val = ((ucontrol->value.integer.value[0] + min) & mask); | ||
2783 | val_mask = mask << shift; | ||
2784 | val = val << shift; | ||
2785 | |||
2786 | ret = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
2787 | if (ret < 0) | ||
2788 | return ret; | ||
2789 | |||
2790 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2791 | if (invert) | ||
2792 | val = (max - ucontrol->value.integer.value[1]) & mask; | ||
2793 | else | ||
2794 | val = ((ucontrol->value.integer.value[1] + min) & mask); | ||
2795 | val_mask = mask << shift; | ||
2796 | val = val << shift; | ||
2797 | |||
2798 | ret = snd_soc_component_update_bits(component, rreg, val_mask, | ||
2799 | val); | ||
2800 | } | ||
2801 | |||
2802 | return ret; | ||
2803 | } | ||
2804 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range); | ||
2805 | |||
2806 | /** | ||
2807 | * snd_soc_get_volsw_range - single mixer get callback with range | ||
2808 | * @kcontrol: mixer control | ||
2809 | * @ucontrol: control element information | ||
2810 | * | ||
2811 | * Callback to get the value, within a range, of a single mixer control. | ||
2812 | * | ||
2813 | * Returns 0 for success. | ||
2814 | */ | ||
2815 | int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, | ||
2816 | struct snd_ctl_elem_value *ucontrol) | ||
2817 | { | ||
2818 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2819 | struct soc_mixer_control *mc = | ||
2820 | (struct soc_mixer_control *)kcontrol->private_value; | ||
2821 | unsigned int reg = mc->reg; | ||
2822 | unsigned int rreg = mc->rreg; | ||
2823 | unsigned int shift = mc->shift; | ||
2824 | int min = mc->min; | ||
2825 | int max = mc->max; | ||
2826 | unsigned int mask = (1 << fls(max)) - 1; | ||
2827 | unsigned int invert = mc->invert; | ||
2828 | unsigned int val; | ||
2829 | int ret; | ||
2830 | |||
2831 | ret = snd_soc_component_read(component, reg, &val); | ||
2832 | if (ret) | ||
2833 | return ret; | ||
2834 | |||
2835 | ucontrol->value.integer.value[0] = (val >> shift) & mask; | ||
2836 | if (invert) | ||
2837 | ucontrol->value.integer.value[0] = | ||
2838 | max - ucontrol->value.integer.value[0]; | ||
2839 | else | ||
2840 | ucontrol->value.integer.value[0] = | ||
2841 | ucontrol->value.integer.value[0] - min; | ||
2842 | |||
2843 | if (snd_soc_volsw_is_stereo(mc)) { | ||
2844 | ret = snd_soc_component_read(component, rreg, &val); | ||
2845 | if (ret) | ||
2846 | return ret; | ||
2847 | |||
2848 | ucontrol->value.integer.value[1] = (val >> shift) & mask; | ||
2849 | if (invert) | ||
2850 | ucontrol->value.integer.value[1] = | ||
2851 | max - ucontrol->value.integer.value[1]; | ||
2852 | else | ||
2853 | ucontrol->value.integer.value[1] = | ||
2854 | ucontrol->value.integer.value[1] - min; | ||
2855 | } | ||
2856 | |||
2857 | return 0; | ||
2858 | } | ||
2859 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range); | ||
2860 | |||
2861 | /** | ||
2862 | * snd_soc_limit_volume - Set new limit to an existing volume control. | ||
2863 | * | ||
2864 | * @codec: where to look for the control | ||
2865 | * @name: Name of the control | ||
2866 | * @max: new maximum limit | ||
2867 | * | ||
2868 | * Return 0 for success, else error. | ||
2869 | */ | ||
2870 | int snd_soc_limit_volume(struct snd_soc_codec *codec, | ||
2871 | const char *name, int max) | ||
2872 | { | ||
2873 | struct snd_card *card = codec->component.card->snd_card; | ||
2874 | struct snd_kcontrol *kctl; | ||
2875 | struct soc_mixer_control *mc; | ||
2876 | int found = 0; | ||
2877 | int ret = -EINVAL; | ||
2878 | |||
2879 | /* Sanity check for name and max */ | ||
2880 | if (unlikely(!name || max <= 0)) | ||
2881 | return -EINVAL; | ||
2882 | |||
2883 | list_for_each_entry(kctl, &card->controls, list) { | ||
2884 | if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name))) { | ||
2885 | found = 1; | ||
2886 | break; | ||
2887 | } | ||
2888 | } | ||
2889 | if (found) { | ||
2890 | mc = (struct soc_mixer_control *)kctl->private_value; | ||
2891 | if (max <= mc->max) { | ||
2892 | mc->platform_max = max; | ||
2893 | ret = 0; | ||
2894 | } | ||
2895 | } | ||
2896 | return ret; | ||
2897 | } | ||
2898 | EXPORT_SYMBOL_GPL(snd_soc_limit_volume); | ||
2899 | |||
2900 | int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, | ||
2901 | struct snd_ctl_elem_info *uinfo) | ||
2902 | { | ||
2903 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2904 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
2905 | |||
2906 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; | ||
2907 | uinfo->count = params->num_regs * component->val_bytes; | ||
2908 | |||
2909 | return 0; | ||
2910 | } | ||
2911 | EXPORT_SYMBOL_GPL(snd_soc_bytes_info); | ||
2912 | |||
2913 | int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, | ||
2914 | struct snd_ctl_elem_value *ucontrol) | ||
2915 | { | ||
2916 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2917 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
2918 | int ret; | ||
2919 | |||
2920 | if (component->regmap) | ||
2921 | ret = regmap_raw_read(component->regmap, params->base, | ||
2922 | ucontrol->value.bytes.data, | ||
2923 | params->num_regs * component->val_bytes); | ||
2924 | else | ||
2925 | ret = -EINVAL; | ||
2926 | |||
2927 | /* Hide any masked bytes to ensure consistent data reporting */ | ||
2928 | if (ret == 0 && params->mask) { | ||
2929 | switch (component->val_bytes) { | ||
2930 | case 1: | ||
2931 | ucontrol->value.bytes.data[0] &= ~params->mask; | ||
2932 | break; | ||
2933 | case 2: | ||
2934 | ((u16 *)(&ucontrol->value.bytes.data))[0] | ||
2935 | &= cpu_to_be16(~params->mask); | ||
2936 | break; | ||
2937 | case 4: | ||
2938 | ((u32 *)(&ucontrol->value.bytes.data))[0] | ||
2939 | &= cpu_to_be32(~params->mask); | ||
2940 | break; | ||
2941 | default: | ||
2942 | return -EINVAL; | ||
2943 | } | ||
2944 | } | ||
2945 | |||
2946 | return ret; | ||
2947 | } | ||
2948 | EXPORT_SYMBOL_GPL(snd_soc_bytes_get); | ||
2949 | |||
2950 | int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, | ||
2951 | struct snd_ctl_elem_value *ucontrol) | ||
2952 | { | ||
2953 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
2954 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
2955 | int ret, len; | ||
2956 | unsigned int val, mask; | ||
2957 | void *data; | ||
2958 | |||
2959 | if (!component->regmap || !params->num_regs) | ||
2960 | return -EINVAL; | ||
2961 | |||
2962 | len = params->num_regs * component->val_bytes; | ||
2963 | |||
2964 | data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); | ||
2965 | if (!data) | ||
2966 | return -ENOMEM; | ||
2967 | |||
2968 | /* | ||
2969 | * If we've got a mask then we need to preserve the register | ||
2970 | * bits. We shouldn't modify the incoming data so take a | ||
2971 | * copy. | ||
2972 | */ | ||
2973 | if (params->mask) { | ||
2974 | ret = regmap_read(component->regmap, params->base, &val); | ||
2975 | if (ret != 0) | ||
2976 | goto out; | ||
2977 | |||
2978 | val &= params->mask; | ||
2979 | |||
2980 | switch (component->val_bytes) { | ||
2981 | case 1: | ||
2982 | ((u8 *)data)[0] &= ~params->mask; | ||
2983 | ((u8 *)data)[0] |= val; | ||
2984 | break; | ||
2985 | case 2: | ||
2986 | mask = ~params->mask; | ||
2987 | ret = regmap_parse_val(component->regmap, | ||
2988 | &mask, &mask); | ||
2989 | if (ret != 0) | ||
2990 | goto out; | ||
2991 | |||
2992 | ((u16 *)data)[0] &= mask; | ||
2993 | |||
2994 | ret = regmap_parse_val(component->regmap, | ||
2995 | &val, &val); | ||
2996 | if (ret != 0) | ||
2997 | goto out; | ||
2998 | |||
2999 | ((u16 *)data)[0] |= val; | ||
3000 | break; | ||
3001 | case 4: | ||
3002 | mask = ~params->mask; | ||
3003 | ret = regmap_parse_val(component->regmap, | ||
3004 | &mask, &mask); | ||
3005 | if (ret != 0) | ||
3006 | goto out; | ||
3007 | |||
3008 | ((u32 *)data)[0] &= mask; | ||
3009 | |||
3010 | ret = regmap_parse_val(component->regmap, | ||
3011 | &val, &val); | ||
3012 | if (ret != 0) | ||
3013 | goto out; | ||
3014 | |||
3015 | ((u32 *)data)[0] |= val; | ||
3016 | break; | ||
3017 | default: | ||
3018 | ret = -EINVAL; | ||
3019 | goto out; | ||
3020 | } | ||
3021 | } | ||
3022 | |||
3023 | ret = regmap_raw_write(component->regmap, params->base, | ||
3024 | data, len); | ||
3025 | |||
3026 | out: | ||
3027 | kfree(data); | ||
3028 | |||
3029 | return ret; | ||
3030 | } | ||
3031 | EXPORT_SYMBOL_GPL(snd_soc_bytes_put); | ||
3032 | |||
3033 | int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol, | ||
3034 | struct snd_ctl_elem_info *ucontrol) | ||
3035 | { | ||
3036 | struct soc_bytes_ext *params = (void *)kcontrol->private_value; | ||
3037 | |||
3038 | ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; | ||
3039 | ucontrol->count = params->max; | ||
3040 | |||
3041 | return 0; | ||
3042 | } | ||
3043 | EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext); | ||
3044 | |||
3045 | int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag, | ||
3046 | unsigned int size, unsigned int __user *tlv) | ||
3047 | { | ||
3048 | struct soc_bytes_ext *params = (void *)kcontrol->private_value; | ||
3049 | unsigned int count = size < params->max ? size : params->max; | ||
3050 | int ret = -ENXIO; | ||
3051 | |||
3052 | switch (op_flag) { | ||
3053 | case SNDRV_CTL_TLV_OP_READ: | ||
3054 | if (params->get) | ||
3055 | ret = params->get(tlv, count); | ||
3056 | break; | ||
3057 | case SNDRV_CTL_TLV_OP_WRITE: | ||
3058 | if (params->put) | ||
3059 | ret = params->put(tlv, count); | ||
3060 | break; | ||
3061 | } | ||
3062 | return ret; | ||
3063 | } | ||
3064 | EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback); | ||
3065 | |||
3066 | /** | ||
3067 | * snd_soc_info_xr_sx - signed multi register info callback | ||
3068 | * @kcontrol: mreg control | ||
3069 | * @uinfo: control element information | ||
3070 | * | ||
3071 | * Callback to provide information of a control that can | ||
3072 | * span multiple codec registers which together | ||
3073 | * forms a single signed value in a MSB/LSB manner. | ||
3074 | * | ||
3075 | * Returns 0 for success. | ||
3076 | */ | ||
3077 | int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol, | ||
3078 | struct snd_ctl_elem_info *uinfo) | ||
3079 | { | ||
3080 | struct soc_mreg_control *mc = | ||
3081 | (struct soc_mreg_control *)kcontrol->private_value; | ||
3082 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
3083 | uinfo->count = 1; | ||
3084 | uinfo->value.integer.min = mc->min; | ||
3085 | uinfo->value.integer.max = mc->max; | ||
3086 | |||
3087 | return 0; | ||
3088 | } | ||
3089 | EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx); | ||
3090 | |||
3091 | /** | ||
3092 | * snd_soc_get_xr_sx - signed multi register get callback | ||
3093 | * @kcontrol: mreg control | ||
3094 | * @ucontrol: control element information | ||
3095 | * | ||
3096 | * Callback to get the value of a control that can span | ||
3097 | * multiple codec registers which together forms a single | ||
3098 | * signed value in a MSB/LSB manner. The control supports | ||
3099 | * specifying total no of bits used to allow for bitfields | ||
3100 | * across the multiple codec registers. | ||
3101 | * | ||
3102 | * Returns 0 for success. | ||
3103 | */ | ||
3104 | int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, | ||
3105 | struct snd_ctl_elem_value *ucontrol) | ||
3106 | { | ||
3107 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
3108 | struct soc_mreg_control *mc = | ||
3109 | (struct soc_mreg_control *)kcontrol->private_value; | ||
3110 | unsigned int regbase = mc->regbase; | ||
3111 | unsigned int regcount = mc->regcount; | ||
3112 | unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; | ||
3113 | unsigned int regwmask = (1<<regwshift)-1; | ||
3114 | unsigned int invert = mc->invert; | ||
3115 | unsigned long mask = (1UL<<mc->nbits)-1; | ||
3116 | long min = mc->min; | ||
3117 | long max = mc->max; | ||
3118 | long val = 0; | ||
3119 | unsigned int regval; | ||
3120 | unsigned int i; | ||
3121 | int ret; | ||
3122 | |||
3123 | for (i = 0; i < regcount; i++) { | ||
3124 | ret = snd_soc_component_read(component, regbase+i, ®val); | ||
3125 | if (ret) | ||
3126 | return ret; | ||
3127 | val |= (regval & regwmask) << (regwshift*(regcount-i-1)); | ||
3128 | } | ||
3129 | val &= mask; | ||
3130 | if (min < 0 && val > max) | ||
3131 | val |= ~mask; | ||
3132 | if (invert) | ||
3133 | val = max - val; | ||
3134 | ucontrol->value.integer.value[0] = val; | ||
3135 | |||
3136 | return 0; | ||
3137 | } | ||
3138 | EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx); | ||
3139 | |||
3140 | /** | ||
3141 | * snd_soc_put_xr_sx - signed multi register get callback | ||
3142 | * @kcontrol: mreg control | ||
3143 | * @ucontrol: control element information | ||
3144 | * | ||
3145 | * Callback to set the value of a control that can span | ||
3146 | * multiple codec registers which together forms a single | ||
3147 | * signed value in a MSB/LSB manner. The control supports | ||
3148 | * specifying total no of bits used to allow for bitfields | ||
3149 | * across the multiple codec registers. | ||
3150 | * | ||
3151 | * Returns 0 for success. | ||
3152 | */ | ||
3153 | int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, | ||
3154 | struct snd_ctl_elem_value *ucontrol) | ||
3155 | { | ||
3156 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
3157 | struct soc_mreg_control *mc = | ||
3158 | (struct soc_mreg_control *)kcontrol->private_value; | ||
3159 | unsigned int regbase = mc->regbase; | ||
3160 | unsigned int regcount = mc->regcount; | ||
3161 | unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; | ||
3162 | unsigned int regwmask = (1<<regwshift)-1; | ||
3163 | unsigned int invert = mc->invert; | ||
3164 | unsigned long mask = (1UL<<mc->nbits)-1; | ||
3165 | long max = mc->max; | ||
3166 | long val = ucontrol->value.integer.value[0]; | ||
3167 | unsigned int i, regval, regmask; | ||
3168 | int err; | ||
3169 | |||
3170 | if (invert) | ||
3171 | val = max - val; | ||
3172 | val &= mask; | ||
3173 | for (i = 0; i < regcount; i++) { | ||
3174 | regval = (val >> (regwshift*(regcount-i-1))) & regwmask; | ||
3175 | regmask = (mask >> (regwshift*(regcount-i-1))) & regwmask; | ||
3176 | err = snd_soc_component_update_bits(component, regbase+i, | ||
3177 | regmask, regval); | ||
3178 | if (err < 0) | ||
3179 | return err; | ||
3180 | } | ||
3181 | |||
3182 | return 0; | ||
3183 | } | ||
3184 | EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx); | ||
3185 | |||
3186 | /** | ||
3187 | * snd_soc_get_strobe - strobe get callback | ||
3188 | * @kcontrol: mixer control | ||
3189 | * @ucontrol: control element information | ||
3190 | * | ||
3191 | * Callback get the value of a strobe mixer control. | ||
3192 | * | ||
3193 | * Returns 0 for success. | ||
3194 | */ | ||
3195 | int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, | ||
3196 | struct snd_ctl_elem_value *ucontrol) | ||
3197 | { | ||
3198 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
3199 | struct soc_mixer_control *mc = | ||
3200 | (struct soc_mixer_control *)kcontrol->private_value; | ||
3201 | unsigned int reg = mc->reg; | ||
3202 | unsigned int shift = mc->shift; | ||
3203 | unsigned int mask = 1 << shift; | ||
3204 | unsigned int invert = mc->invert != 0; | ||
3205 | unsigned int val; | ||
3206 | int ret; | ||
3207 | |||
3208 | ret = snd_soc_component_read(component, reg, &val); | ||
3209 | if (ret) | ||
3210 | return ret; | ||
3211 | |||
3212 | val &= mask; | ||
3213 | |||
3214 | if (shift != 0 && val != 0) | ||
3215 | val = val >> shift; | ||
3216 | ucontrol->value.enumerated.item[0] = val ^ invert; | ||
3217 | |||
3218 | return 0; | ||
3219 | } | ||
3220 | EXPORT_SYMBOL_GPL(snd_soc_get_strobe); | ||
3221 | |||
3222 | /** | ||
3223 | * snd_soc_put_strobe - strobe put callback | ||
3224 | * @kcontrol: mixer control | ||
3225 | * @ucontrol: control element information | ||
3226 | * | ||
3227 | * Callback strobe a register bit to high then low (or the inverse) | ||
3228 | * in one pass of a single mixer enum control. | ||
3229 | * | ||
3230 | * Returns 1 for success. | ||
3231 | */ | ||
3232 | int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, | ||
3233 | struct snd_ctl_elem_value *ucontrol) | ||
3234 | { | ||
3235 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
3236 | struct soc_mixer_control *mc = | ||
3237 | (struct soc_mixer_control *)kcontrol->private_value; | ||
3238 | unsigned int reg = mc->reg; | ||
3239 | unsigned int shift = mc->shift; | ||
3240 | unsigned int mask = 1 << shift; | ||
3241 | unsigned int invert = mc->invert != 0; | ||
3242 | unsigned int strobe = ucontrol->value.enumerated.item[0] != 0; | ||
3243 | unsigned int val1 = (strobe ^ invert) ? mask : 0; | ||
3244 | unsigned int val2 = (strobe ^ invert) ? 0 : mask; | ||
3245 | int err; | ||
3246 | |||
3247 | err = snd_soc_component_update_bits(component, reg, mask, val1); | ||
3248 | if (err < 0) | ||
3249 | return err; | ||
3250 | |||
3251 | return snd_soc_component_update_bits(component, reg, mask, val2); | ||
3252 | } | ||
3253 | EXPORT_SYMBOL_GPL(snd_soc_put_strobe); | ||
3254 | |||
3255 | /** | ||
3256 | * snd_soc_dai_set_sysclk - configure DAI system or master clock. | 2337 | * snd_soc_dai_set_sysclk - configure DAI system or master clock. |
3257 | * @dai: DAI | 2338 | * @dai: DAI |
3258 | * @clk_id: DAI specific clock ID | 2339 | * @clk_id: DAI specific clock ID |
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c new file mode 100644 index 000000000000..100d92b5b77e --- /dev/null +++ b/sound/soc/soc-ops.c | |||
@@ -0,0 +1,952 @@ | |||
1 | /* | ||
2 | * soc-ops.c -- Generic ASoC operations | ||
3 | * | ||
4 | * Copyright 2005 Wolfson Microelectronics PLC. | ||
5 | * Copyright 2005 Openedhand Ltd. | ||
6 | * Copyright (C) 2010 Slimlogic Ltd. | ||
7 | * Copyright (C) 2010 Texas Instruments Inc. | ||
8 | * | ||
9 | * Author: Liam Girdwood <lrg@slimlogic.co.uk> | ||
10 | * with code, comments and ideas from :- | ||
11 | * Richard Purdie <richard@openedhand.com> | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify it | ||
14 | * under the terms of the GNU General Public License as published by the | ||
15 | * Free Software Foundation; either version 2 of the License, or (at your | ||
16 | * option) any later version. | ||
17 | */ | ||
18 | |||
19 | #include <linux/module.h> | ||
20 | #include <linux/moduleparam.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/delay.h> | ||
23 | #include <linux/pm.h> | ||
24 | #include <linux/bitops.h> | ||
25 | #include <linux/ctype.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <sound/core.h> | ||
28 | #include <sound/jack.h> | ||
29 | #include <sound/pcm.h> | ||
30 | #include <sound/pcm_params.h> | ||
31 | #include <sound/soc.h> | ||
32 | #include <sound/soc-dpcm.h> | ||
33 | #include <sound/initval.h> | ||
34 | |||
35 | /** | ||
36 | * snd_soc_info_enum_double - enumerated double mixer info callback | ||
37 | * @kcontrol: mixer control | ||
38 | * @uinfo: control element information | ||
39 | * | ||
40 | * Callback to provide information about a double enumerated | ||
41 | * mixer control. | ||
42 | * | ||
43 | * Returns 0 for success. | ||
44 | */ | ||
45 | int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol, | ||
46 | struct snd_ctl_elem_info *uinfo) | ||
47 | { | ||
48 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
49 | |||
50 | return snd_ctl_enum_info(uinfo, e->shift_l == e->shift_r ? 1 : 2, | ||
51 | e->items, e->texts); | ||
52 | } | ||
53 | EXPORT_SYMBOL_GPL(snd_soc_info_enum_double); | ||
54 | |||
55 | /** | ||
56 | * snd_soc_get_enum_double - enumerated double mixer get callback | ||
57 | * @kcontrol: mixer control | ||
58 | * @ucontrol: control element information | ||
59 | * | ||
60 | * Callback to get the value of a double enumerated mixer. | ||
61 | * | ||
62 | * Returns 0 for success. | ||
63 | */ | ||
64 | int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol, | ||
65 | struct snd_ctl_elem_value *ucontrol) | ||
66 | { | ||
67 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
68 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
69 | unsigned int val, item; | ||
70 | unsigned int reg_val; | ||
71 | int ret; | ||
72 | |||
73 | ret = snd_soc_component_read(component, e->reg, ®_val); | ||
74 | if (ret) | ||
75 | return ret; | ||
76 | val = (reg_val >> e->shift_l) & e->mask; | ||
77 | item = snd_soc_enum_val_to_item(e, val); | ||
78 | ucontrol->value.enumerated.item[0] = item; | ||
79 | if (e->shift_l != e->shift_r) { | ||
80 | val = (reg_val >> e->shift_l) & e->mask; | ||
81 | item = snd_soc_enum_val_to_item(e, val); | ||
82 | ucontrol->value.enumerated.item[1] = item; | ||
83 | } | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | EXPORT_SYMBOL_GPL(snd_soc_get_enum_double); | ||
88 | |||
89 | /** | ||
90 | * snd_soc_put_enum_double - enumerated double mixer put callback | ||
91 | * @kcontrol: mixer control | ||
92 | * @ucontrol: control element information | ||
93 | * | ||
94 | * Callback to set the value of a double enumerated mixer. | ||
95 | * | ||
96 | * Returns 0 for success. | ||
97 | */ | ||
98 | int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol, | ||
99 | struct snd_ctl_elem_value *ucontrol) | ||
100 | { | ||
101 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
102 | struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; | ||
103 | unsigned int *item = ucontrol->value.enumerated.item; | ||
104 | unsigned int val; | ||
105 | unsigned int mask; | ||
106 | |||
107 | if (item[0] >= e->items) | ||
108 | return -EINVAL; | ||
109 | val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; | ||
110 | mask = e->mask << e->shift_l; | ||
111 | if (e->shift_l != e->shift_r) { | ||
112 | if (item[1] >= e->items) | ||
113 | return -EINVAL; | ||
114 | val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r; | ||
115 | mask |= e->mask << e->shift_r; | ||
116 | } | ||
117 | |||
118 | return snd_soc_component_update_bits(component, e->reg, mask, val); | ||
119 | } | ||
120 | EXPORT_SYMBOL_GPL(snd_soc_put_enum_double); | ||
121 | |||
122 | /** | ||
123 | * snd_soc_read_signed - Read a codec register and interprete as signed value | ||
124 | * @component: component | ||
125 | * @reg: Register to read | ||
126 | * @mask: Mask to use after shifting the register value | ||
127 | * @shift: Right shift of register value | ||
128 | * @sign_bit: Bit that describes if a number is negative or not. | ||
129 | * @signed_val: Pointer to where the read value should be stored | ||
130 | * | ||
131 | * This functions reads a codec register. The register value is shifted right | ||
132 | * by 'shift' bits and masked with the given 'mask'. Afterwards it translates | ||
133 | * the given registervalue into a signed integer if sign_bit is non-zero. | ||
134 | * | ||
135 | * Returns 0 on sucess, otherwise an error value | ||
136 | */ | ||
137 | static int snd_soc_read_signed(struct snd_soc_component *component, | ||
138 | unsigned int reg, unsigned int mask, unsigned int shift, | ||
139 | unsigned int sign_bit, int *signed_val) | ||
140 | { | ||
141 | int ret; | ||
142 | unsigned int val; | ||
143 | |||
144 | ret = snd_soc_component_read(component, reg, &val); | ||
145 | if (ret < 0) | ||
146 | return ret; | ||
147 | |||
148 | val = (val >> shift) & mask; | ||
149 | |||
150 | if (!sign_bit) { | ||
151 | *signed_val = val; | ||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | /* non-negative number */ | ||
156 | if (!(val & BIT(sign_bit))) { | ||
157 | *signed_val = val; | ||
158 | return 0; | ||
159 | } | ||
160 | |||
161 | ret = val; | ||
162 | |||
163 | /* | ||
164 | * The register most probably does not contain a full-sized int. | ||
165 | * Instead we have an arbitrary number of bits in a signed | ||
166 | * representation which has to be translated into a full-sized int. | ||
167 | * This is done by filling up all bits above the sign-bit. | ||
168 | */ | ||
169 | ret |= ~((int)(BIT(sign_bit) - 1)); | ||
170 | |||
171 | *signed_val = ret; | ||
172 | |||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | /** | ||
177 | * snd_soc_info_volsw - single mixer info callback | ||
178 | * @kcontrol: mixer control | ||
179 | * @uinfo: control element information | ||
180 | * | ||
181 | * Callback to provide information about a single mixer control, or a double | ||
182 | * mixer control that spans 2 registers. | ||
183 | * | ||
184 | * Returns 0 for success. | ||
185 | */ | ||
186 | int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, | ||
187 | struct snd_ctl_elem_info *uinfo) | ||
188 | { | ||
189 | struct soc_mixer_control *mc = | ||
190 | (struct soc_mixer_control *)kcontrol->private_value; | ||
191 | int platform_max; | ||
192 | |||
193 | if (!mc->platform_max) | ||
194 | mc->platform_max = mc->max; | ||
195 | platform_max = mc->platform_max; | ||
196 | |||
197 | if (platform_max == 1 && !strstr(kcontrol->id.name, " Volume")) | ||
198 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
199 | else | ||
200 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
201 | |||
202 | uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; | ||
203 | uinfo->value.integer.min = 0; | ||
204 | uinfo->value.integer.max = platform_max - mc->min; | ||
205 | return 0; | ||
206 | } | ||
207 | EXPORT_SYMBOL_GPL(snd_soc_info_volsw); | ||
208 | |||
209 | /** | ||
210 | * snd_soc_get_volsw - single mixer get callback | ||
211 | * @kcontrol: mixer control | ||
212 | * @ucontrol: control element information | ||
213 | * | ||
214 | * Callback to get the value of a single mixer control, or a double mixer | ||
215 | * control that spans 2 registers. | ||
216 | * | ||
217 | * Returns 0 for success. | ||
218 | */ | ||
219 | int snd_soc_get_volsw(struct snd_kcontrol *kcontrol, | ||
220 | struct snd_ctl_elem_value *ucontrol) | ||
221 | { | ||
222 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
223 | struct soc_mixer_control *mc = | ||
224 | (struct soc_mixer_control *)kcontrol->private_value; | ||
225 | unsigned int reg = mc->reg; | ||
226 | unsigned int reg2 = mc->rreg; | ||
227 | unsigned int shift = mc->shift; | ||
228 | unsigned int rshift = mc->rshift; | ||
229 | int max = mc->max; | ||
230 | int min = mc->min; | ||
231 | int sign_bit = mc->sign_bit; | ||
232 | unsigned int mask = (1 << fls(max)) - 1; | ||
233 | unsigned int invert = mc->invert; | ||
234 | int val; | ||
235 | int ret; | ||
236 | |||
237 | if (sign_bit) | ||
238 | mask = BIT(sign_bit + 1) - 1; | ||
239 | |||
240 | ret = snd_soc_read_signed(component, reg, mask, shift, sign_bit, &val); | ||
241 | if (ret) | ||
242 | return ret; | ||
243 | |||
244 | ucontrol->value.integer.value[0] = val - min; | ||
245 | if (invert) | ||
246 | ucontrol->value.integer.value[0] = | ||
247 | max - ucontrol->value.integer.value[0]; | ||
248 | |||
249 | if (snd_soc_volsw_is_stereo(mc)) { | ||
250 | if (reg == reg2) | ||
251 | ret = snd_soc_read_signed(component, reg, mask, rshift, | ||
252 | sign_bit, &val); | ||
253 | else | ||
254 | ret = snd_soc_read_signed(component, reg2, mask, shift, | ||
255 | sign_bit, &val); | ||
256 | if (ret) | ||
257 | return ret; | ||
258 | |||
259 | ucontrol->value.integer.value[1] = val - min; | ||
260 | if (invert) | ||
261 | ucontrol->value.integer.value[1] = | ||
262 | max - ucontrol->value.integer.value[1]; | ||
263 | } | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw); | ||
268 | |||
269 | /** | ||
270 | * snd_soc_put_volsw - single mixer put callback | ||
271 | * @kcontrol: mixer control | ||
272 | * @ucontrol: control element information | ||
273 | * | ||
274 | * Callback to set the value of a single mixer control, or a double mixer | ||
275 | * control that spans 2 registers. | ||
276 | * | ||
277 | * Returns 0 for success. | ||
278 | */ | ||
279 | int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, | ||
280 | struct snd_ctl_elem_value *ucontrol) | ||
281 | { | ||
282 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
283 | struct soc_mixer_control *mc = | ||
284 | (struct soc_mixer_control *)kcontrol->private_value; | ||
285 | unsigned int reg = mc->reg; | ||
286 | unsigned int reg2 = mc->rreg; | ||
287 | unsigned int shift = mc->shift; | ||
288 | unsigned int rshift = mc->rshift; | ||
289 | int max = mc->max; | ||
290 | int min = mc->min; | ||
291 | unsigned int sign_bit = mc->sign_bit; | ||
292 | unsigned int mask = (1 << fls(max)) - 1; | ||
293 | unsigned int invert = mc->invert; | ||
294 | int err; | ||
295 | bool type_2r = false; | ||
296 | unsigned int val2 = 0; | ||
297 | unsigned int val, val_mask; | ||
298 | |||
299 | if (sign_bit) | ||
300 | mask = BIT(sign_bit + 1) - 1; | ||
301 | |||
302 | val = ((ucontrol->value.integer.value[0] + min) & mask); | ||
303 | if (invert) | ||
304 | val = max - val; | ||
305 | val_mask = mask << shift; | ||
306 | val = val << shift; | ||
307 | if (snd_soc_volsw_is_stereo(mc)) { | ||
308 | val2 = ((ucontrol->value.integer.value[1] + min) & mask); | ||
309 | if (invert) | ||
310 | val2 = max - val2; | ||
311 | if (reg == reg2) { | ||
312 | val_mask |= mask << rshift; | ||
313 | val |= val2 << rshift; | ||
314 | } else { | ||
315 | val2 = val2 << shift; | ||
316 | type_2r = true; | ||
317 | } | ||
318 | } | ||
319 | err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
320 | if (err < 0) | ||
321 | return err; | ||
322 | |||
323 | if (type_2r) | ||
324 | err = snd_soc_component_update_bits(component, reg2, val_mask, | ||
325 | val2); | ||
326 | |||
327 | return err; | ||
328 | } | ||
329 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw); | ||
330 | |||
331 | /** | ||
332 | * snd_soc_get_volsw_sx - single mixer get callback | ||
333 | * @kcontrol: mixer control | ||
334 | * @ucontrol: control element information | ||
335 | * | ||
336 | * Callback to get the value of a single mixer control, or a double mixer | ||
337 | * control that spans 2 registers. | ||
338 | * | ||
339 | * Returns 0 for success. | ||
340 | */ | ||
341 | int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol, | ||
342 | struct snd_ctl_elem_value *ucontrol) | ||
343 | { | ||
344 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
345 | struct soc_mixer_control *mc = | ||
346 | (struct soc_mixer_control *)kcontrol->private_value; | ||
347 | unsigned int reg = mc->reg; | ||
348 | unsigned int reg2 = mc->rreg; | ||
349 | unsigned int shift = mc->shift; | ||
350 | unsigned int rshift = mc->rshift; | ||
351 | int max = mc->max; | ||
352 | int min = mc->min; | ||
353 | int mask = (1 << (fls(min + max) - 1)) - 1; | ||
354 | unsigned int val; | ||
355 | int ret; | ||
356 | |||
357 | ret = snd_soc_component_read(component, reg, &val); | ||
358 | if (ret < 0) | ||
359 | return ret; | ||
360 | |||
361 | ucontrol->value.integer.value[0] = ((val >> shift) - min) & mask; | ||
362 | |||
363 | if (snd_soc_volsw_is_stereo(mc)) { | ||
364 | ret = snd_soc_component_read(component, reg2, &val); | ||
365 | if (ret < 0) | ||
366 | return ret; | ||
367 | |||
368 | val = ((val >> rshift) - min) & mask; | ||
369 | ucontrol->value.integer.value[1] = val; | ||
370 | } | ||
371 | |||
372 | return 0; | ||
373 | } | ||
374 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx); | ||
375 | |||
376 | /** | ||
377 | * snd_soc_put_volsw_sx - double mixer set callback | ||
378 | * @kcontrol: mixer control | ||
379 | * @uinfo: control element information | ||
380 | * | ||
381 | * Callback to set the value of a double mixer control that spans 2 registers. | ||
382 | * | ||
383 | * Returns 0 for success. | ||
384 | */ | ||
385 | int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, | ||
386 | struct snd_ctl_elem_value *ucontrol) | ||
387 | { | ||
388 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
389 | struct soc_mixer_control *mc = | ||
390 | (struct soc_mixer_control *)kcontrol->private_value; | ||
391 | |||
392 | unsigned int reg = mc->reg; | ||
393 | unsigned int reg2 = mc->rreg; | ||
394 | unsigned int shift = mc->shift; | ||
395 | unsigned int rshift = mc->rshift; | ||
396 | int max = mc->max; | ||
397 | int min = mc->min; | ||
398 | int mask = (1 << (fls(min + max) - 1)) - 1; | ||
399 | int err = 0; | ||
400 | unsigned int val, val_mask, val2 = 0; | ||
401 | |||
402 | val_mask = mask << shift; | ||
403 | val = (ucontrol->value.integer.value[0] + min) & mask; | ||
404 | val = val << shift; | ||
405 | |||
406 | err = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
407 | if (err < 0) | ||
408 | return err; | ||
409 | |||
410 | if (snd_soc_volsw_is_stereo(mc)) { | ||
411 | val_mask = mask << rshift; | ||
412 | val2 = (ucontrol->value.integer.value[1] + min) & mask; | ||
413 | val2 = val2 << rshift; | ||
414 | |||
415 | err = snd_soc_component_update_bits(component, reg2, val_mask, | ||
416 | val2); | ||
417 | } | ||
418 | return err; | ||
419 | } | ||
420 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw_sx); | ||
421 | |||
422 | /** | ||
423 | * snd_soc_info_volsw_range - single mixer info callback with range. | ||
424 | * @kcontrol: mixer control | ||
425 | * @uinfo: control element information | ||
426 | * | ||
427 | * Callback to provide information, within a range, about a single | ||
428 | * mixer control. | ||
429 | * | ||
430 | * returns 0 for success. | ||
431 | */ | ||
432 | int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, | ||
433 | struct snd_ctl_elem_info *uinfo) | ||
434 | { | ||
435 | struct soc_mixer_control *mc = | ||
436 | (struct soc_mixer_control *)kcontrol->private_value; | ||
437 | int platform_max; | ||
438 | int min = mc->min; | ||
439 | |||
440 | if (!mc->platform_max) | ||
441 | mc->platform_max = mc->max; | ||
442 | platform_max = mc->platform_max; | ||
443 | |||
444 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
445 | uinfo->count = snd_soc_volsw_is_stereo(mc) ? 2 : 1; | ||
446 | uinfo->value.integer.min = 0; | ||
447 | uinfo->value.integer.max = platform_max - min; | ||
448 | |||
449 | return 0; | ||
450 | } | ||
451 | EXPORT_SYMBOL_GPL(snd_soc_info_volsw_range); | ||
452 | |||
453 | /** | ||
454 | * snd_soc_put_volsw_range - single mixer put value callback with range. | ||
455 | * @kcontrol: mixer control | ||
456 | * @ucontrol: control element information | ||
457 | * | ||
458 | * Callback to set the value, within a range, for a single mixer control. | ||
459 | * | ||
460 | * Returns 0 for success. | ||
461 | */ | ||
462 | int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, | ||
463 | struct snd_ctl_elem_value *ucontrol) | ||
464 | { | ||
465 | struct soc_mixer_control *mc = | ||
466 | (struct soc_mixer_control *)kcontrol->private_value; | ||
467 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
468 | unsigned int reg = mc->reg; | ||
469 | unsigned int rreg = mc->rreg; | ||
470 | unsigned int shift = mc->shift; | ||
471 | int min = mc->min; | ||
472 | int max = mc->max; | ||
473 | unsigned int mask = (1 << fls(max)) - 1; | ||
474 | unsigned int invert = mc->invert; | ||
475 | unsigned int val, val_mask; | ||
476 | int ret; | ||
477 | |||
478 | if (invert) | ||
479 | val = (max - ucontrol->value.integer.value[0]) & mask; | ||
480 | else | ||
481 | val = ((ucontrol->value.integer.value[0] + min) & mask); | ||
482 | val_mask = mask << shift; | ||
483 | val = val << shift; | ||
484 | |||
485 | ret = snd_soc_component_update_bits(component, reg, val_mask, val); | ||
486 | if (ret < 0) | ||
487 | return ret; | ||
488 | |||
489 | if (snd_soc_volsw_is_stereo(mc)) { | ||
490 | if (invert) | ||
491 | val = (max - ucontrol->value.integer.value[1]) & mask; | ||
492 | else | ||
493 | val = ((ucontrol->value.integer.value[1] + min) & mask); | ||
494 | val_mask = mask << shift; | ||
495 | val = val << shift; | ||
496 | |||
497 | ret = snd_soc_component_update_bits(component, rreg, val_mask, | ||
498 | val); | ||
499 | } | ||
500 | |||
501 | return ret; | ||
502 | } | ||
503 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw_range); | ||
504 | |||
505 | /** | ||
506 | * snd_soc_get_volsw_range - single mixer get callback with range | ||
507 | * @kcontrol: mixer control | ||
508 | * @ucontrol: control element information | ||
509 | * | ||
510 | * Callback to get the value, within a range, of a single mixer control. | ||
511 | * | ||
512 | * Returns 0 for success. | ||
513 | */ | ||
514 | int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, | ||
515 | struct snd_ctl_elem_value *ucontrol) | ||
516 | { | ||
517 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
518 | struct soc_mixer_control *mc = | ||
519 | (struct soc_mixer_control *)kcontrol->private_value; | ||
520 | unsigned int reg = mc->reg; | ||
521 | unsigned int rreg = mc->rreg; | ||
522 | unsigned int shift = mc->shift; | ||
523 | int min = mc->min; | ||
524 | int max = mc->max; | ||
525 | unsigned int mask = (1 << fls(max)) - 1; | ||
526 | unsigned int invert = mc->invert; | ||
527 | unsigned int val; | ||
528 | int ret; | ||
529 | |||
530 | ret = snd_soc_component_read(component, reg, &val); | ||
531 | if (ret) | ||
532 | return ret; | ||
533 | |||
534 | ucontrol->value.integer.value[0] = (val >> shift) & mask; | ||
535 | if (invert) | ||
536 | ucontrol->value.integer.value[0] = | ||
537 | max - ucontrol->value.integer.value[0]; | ||
538 | else | ||
539 | ucontrol->value.integer.value[0] = | ||
540 | ucontrol->value.integer.value[0] - min; | ||
541 | |||
542 | if (snd_soc_volsw_is_stereo(mc)) { | ||
543 | ret = snd_soc_component_read(component, rreg, &val); | ||
544 | if (ret) | ||
545 | return ret; | ||
546 | |||
547 | ucontrol->value.integer.value[1] = (val >> shift) & mask; | ||
548 | if (invert) | ||
549 | ucontrol->value.integer.value[1] = | ||
550 | max - ucontrol->value.integer.value[1]; | ||
551 | else | ||
552 | ucontrol->value.integer.value[1] = | ||
553 | ucontrol->value.integer.value[1] - min; | ||
554 | } | ||
555 | |||
556 | return 0; | ||
557 | } | ||
558 | EXPORT_SYMBOL_GPL(snd_soc_get_volsw_range); | ||
559 | |||
560 | /** | ||
561 | * snd_soc_limit_volume - Set new limit to an existing volume control. | ||
562 | * | ||
563 | * @codec: where to look for the control | ||
564 | * @name: Name of the control | ||
565 | * @max: new maximum limit | ||
566 | * | ||
567 | * Return 0 for success, else error. | ||
568 | */ | ||
569 | int snd_soc_limit_volume(struct snd_soc_codec *codec, | ||
570 | const char *name, int max) | ||
571 | { | ||
572 | struct snd_card *card = codec->component.card->snd_card; | ||
573 | struct snd_kcontrol *kctl; | ||
574 | struct soc_mixer_control *mc; | ||
575 | int found = 0; | ||
576 | int ret = -EINVAL; | ||
577 | |||
578 | /* Sanity check for name and max */ | ||
579 | if (unlikely(!name || max <= 0)) | ||
580 | return -EINVAL; | ||
581 | |||
582 | list_for_each_entry(kctl, &card->controls, list) { | ||
583 | if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name))) { | ||
584 | found = 1; | ||
585 | break; | ||
586 | } | ||
587 | } | ||
588 | if (found) { | ||
589 | mc = (struct soc_mixer_control *)kctl->private_value; | ||
590 | if (max <= mc->max) { | ||
591 | mc->platform_max = max; | ||
592 | ret = 0; | ||
593 | } | ||
594 | } | ||
595 | return ret; | ||
596 | } | ||
597 | EXPORT_SYMBOL_GPL(snd_soc_limit_volume); | ||
598 | |||
599 | int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, | ||
600 | struct snd_ctl_elem_info *uinfo) | ||
601 | { | ||
602 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
603 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
604 | |||
605 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; | ||
606 | uinfo->count = params->num_regs * component->val_bytes; | ||
607 | |||
608 | return 0; | ||
609 | } | ||
610 | EXPORT_SYMBOL_GPL(snd_soc_bytes_info); | ||
611 | |||
612 | int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, | ||
613 | struct snd_ctl_elem_value *ucontrol) | ||
614 | { | ||
615 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
616 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
617 | int ret; | ||
618 | |||
619 | if (component->regmap) | ||
620 | ret = regmap_raw_read(component->regmap, params->base, | ||
621 | ucontrol->value.bytes.data, | ||
622 | params->num_regs * component->val_bytes); | ||
623 | else | ||
624 | ret = -EINVAL; | ||
625 | |||
626 | /* Hide any masked bytes to ensure consistent data reporting */ | ||
627 | if (ret == 0 && params->mask) { | ||
628 | switch (component->val_bytes) { | ||
629 | case 1: | ||
630 | ucontrol->value.bytes.data[0] &= ~params->mask; | ||
631 | break; | ||
632 | case 2: | ||
633 | ((u16 *)(&ucontrol->value.bytes.data))[0] | ||
634 | &= cpu_to_be16(~params->mask); | ||
635 | break; | ||
636 | case 4: | ||
637 | ((u32 *)(&ucontrol->value.bytes.data))[0] | ||
638 | &= cpu_to_be32(~params->mask); | ||
639 | break; | ||
640 | default: | ||
641 | return -EINVAL; | ||
642 | } | ||
643 | } | ||
644 | |||
645 | return ret; | ||
646 | } | ||
647 | EXPORT_SYMBOL_GPL(snd_soc_bytes_get); | ||
648 | |||
649 | int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, | ||
650 | struct snd_ctl_elem_value *ucontrol) | ||
651 | { | ||
652 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
653 | struct soc_bytes *params = (void *)kcontrol->private_value; | ||
654 | int ret, len; | ||
655 | unsigned int val, mask; | ||
656 | void *data; | ||
657 | |||
658 | if (!component->regmap || !params->num_regs) | ||
659 | return -EINVAL; | ||
660 | |||
661 | len = params->num_regs * component->val_bytes; | ||
662 | |||
663 | data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA); | ||
664 | if (!data) | ||
665 | return -ENOMEM; | ||
666 | |||
667 | /* | ||
668 | * If we've got a mask then we need to preserve the register | ||
669 | * bits. We shouldn't modify the incoming data so take a | ||
670 | * copy. | ||
671 | */ | ||
672 | if (params->mask) { | ||
673 | ret = regmap_read(component->regmap, params->base, &val); | ||
674 | if (ret != 0) | ||
675 | goto out; | ||
676 | |||
677 | val &= params->mask; | ||
678 | |||
679 | switch (component->val_bytes) { | ||
680 | case 1: | ||
681 | ((u8 *)data)[0] &= ~params->mask; | ||
682 | ((u8 *)data)[0] |= val; | ||
683 | break; | ||
684 | case 2: | ||
685 | mask = ~params->mask; | ||
686 | ret = regmap_parse_val(component->regmap, | ||
687 | &mask, &mask); | ||
688 | if (ret != 0) | ||
689 | goto out; | ||
690 | |||
691 | ((u16 *)data)[0] &= mask; | ||
692 | |||
693 | ret = regmap_parse_val(component->regmap, | ||
694 | &val, &val); | ||
695 | if (ret != 0) | ||
696 | goto out; | ||
697 | |||
698 | ((u16 *)data)[0] |= val; | ||
699 | break; | ||
700 | case 4: | ||
701 | mask = ~params->mask; | ||
702 | ret = regmap_parse_val(component->regmap, | ||
703 | &mask, &mask); | ||
704 | if (ret != 0) | ||
705 | goto out; | ||
706 | |||
707 | ((u32 *)data)[0] &= mask; | ||
708 | |||
709 | ret = regmap_parse_val(component->regmap, | ||
710 | &val, &val); | ||
711 | if (ret != 0) | ||
712 | goto out; | ||
713 | |||
714 | ((u32 *)data)[0] |= val; | ||
715 | break; | ||
716 | default: | ||
717 | ret = -EINVAL; | ||
718 | goto out; | ||
719 | } | ||
720 | } | ||
721 | |||
722 | ret = regmap_raw_write(component->regmap, params->base, | ||
723 | data, len); | ||
724 | |||
725 | out: | ||
726 | kfree(data); | ||
727 | |||
728 | return ret; | ||
729 | } | ||
730 | EXPORT_SYMBOL_GPL(snd_soc_bytes_put); | ||
731 | |||
732 | int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol, | ||
733 | struct snd_ctl_elem_info *ucontrol) | ||
734 | { | ||
735 | struct soc_bytes_ext *params = (void *)kcontrol->private_value; | ||
736 | |||
737 | ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES; | ||
738 | ucontrol->count = params->max; | ||
739 | |||
740 | return 0; | ||
741 | } | ||
742 | EXPORT_SYMBOL_GPL(snd_soc_bytes_info_ext); | ||
743 | |||
744 | int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag, | ||
745 | unsigned int size, unsigned int __user *tlv) | ||
746 | { | ||
747 | struct soc_bytes_ext *params = (void *)kcontrol->private_value; | ||
748 | unsigned int count = size < params->max ? size : params->max; | ||
749 | int ret = -ENXIO; | ||
750 | |||
751 | switch (op_flag) { | ||
752 | case SNDRV_CTL_TLV_OP_READ: | ||
753 | if (params->get) | ||
754 | ret = params->get(tlv, count); | ||
755 | break; | ||
756 | case SNDRV_CTL_TLV_OP_WRITE: | ||
757 | if (params->put) | ||
758 | ret = params->put(tlv, count); | ||
759 | break; | ||
760 | } | ||
761 | return ret; | ||
762 | } | ||
763 | EXPORT_SYMBOL_GPL(snd_soc_bytes_tlv_callback); | ||
764 | |||
765 | /** | ||
766 | * snd_soc_info_xr_sx - signed multi register info callback | ||
767 | * @kcontrol: mreg control | ||
768 | * @uinfo: control element information | ||
769 | * | ||
770 | * Callback to provide information of a control that can | ||
771 | * span multiple codec registers which together | ||
772 | * forms a single signed value in a MSB/LSB manner. | ||
773 | * | ||
774 | * Returns 0 for success. | ||
775 | */ | ||
776 | int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol, | ||
777 | struct snd_ctl_elem_info *uinfo) | ||
778 | { | ||
779 | struct soc_mreg_control *mc = | ||
780 | (struct soc_mreg_control *)kcontrol->private_value; | ||
781 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
782 | uinfo->count = 1; | ||
783 | uinfo->value.integer.min = mc->min; | ||
784 | uinfo->value.integer.max = mc->max; | ||
785 | |||
786 | return 0; | ||
787 | } | ||
788 | EXPORT_SYMBOL_GPL(snd_soc_info_xr_sx); | ||
789 | |||
790 | /** | ||
791 | * snd_soc_get_xr_sx - signed multi register get callback | ||
792 | * @kcontrol: mreg control | ||
793 | * @ucontrol: control element information | ||
794 | * | ||
795 | * Callback to get the value of a control that can span | ||
796 | * multiple codec registers which together forms a single | ||
797 | * signed value in a MSB/LSB manner. The control supports | ||
798 | * specifying total no of bits used to allow for bitfields | ||
799 | * across the multiple codec registers. | ||
800 | * | ||
801 | * Returns 0 for success. | ||
802 | */ | ||
803 | int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol, | ||
804 | struct snd_ctl_elem_value *ucontrol) | ||
805 | { | ||
806 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
807 | struct soc_mreg_control *mc = | ||
808 | (struct soc_mreg_control *)kcontrol->private_value; | ||
809 | unsigned int regbase = mc->regbase; | ||
810 | unsigned int regcount = mc->regcount; | ||
811 | unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; | ||
812 | unsigned int regwmask = (1<<regwshift)-1; | ||
813 | unsigned int invert = mc->invert; | ||
814 | unsigned long mask = (1UL<<mc->nbits)-1; | ||
815 | long min = mc->min; | ||
816 | long max = mc->max; | ||
817 | long val = 0; | ||
818 | unsigned int regval; | ||
819 | unsigned int i; | ||
820 | int ret; | ||
821 | |||
822 | for (i = 0; i < regcount; i++) { | ||
823 | ret = snd_soc_component_read(component, regbase+i, ®val); | ||
824 | if (ret) | ||
825 | return ret; | ||
826 | val |= (regval & regwmask) << (regwshift*(regcount-i-1)); | ||
827 | } | ||
828 | val &= mask; | ||
829 | if (min < 0 && val > max) | ||
830 | val |= ~mask; | ||
831 | if (invert) | ||
832 | val = max - val; | ||
833 | ucontrol->value.integer.value[0] = val; | ||
834 | |||
835 | return 0; | ||
836 | } | ||
837 | EXPORT_SYMBOL_GPL(snd_soc_get_xr_sx); | ||
838 | |||
839 | /** | ||
840 | * snd_soc_put_xr_sx - signed multi register get callback | ||
841 | * @kcontrol: mreg control | ||
842 | * @ucontrol: control element information | ||
843 | * | ||
844 | * Callback to set the value of a control that can span | ||
845 | * multiple codec registers which together forms a single | ||
846 | * signed value in a MSB/LSB manner. The control supports | ||
847 | * specifying total no of bits used to allow for bitfields | ||
848 | * across the multiple codec registers. | ||
849 | * | ||
850 | * Returns 0 for success. | ||
851 | */ | ||
852 | int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, | ||
853 | struct snd_ctl_elem_value *ucontrol) | ||
854 | { | ||
855 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
856 | struct soc_mreg_control *mc = | ||
857 | (struct soc_mreg_control *)kcontrol->private_value; | ||
858 | unsigned int regbase = mc->regbase; | ||
859 | unsigned int regcount = mc->regcount; | ||
860 | unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; | ||
861 | unsigned int regwmask = (1<<regwshift)-1; | ||
862 | unsigned int invert = mc->invert; | ||
863 | unsigned long mask = (1UL<<mc->nbits)-1; | ||
864 | long max = mc->max; | ||
865 | long val = ucontrol->value.integer.value[0]; | ||
866 | unsigned int i, regval, regmask; | ||
867 | int err; | ||
868 | |||
869 | if (invert) | ||
870 | val = max - val; | ||
871 | val &= mask; | ||
872 | for (i = 0; i < regcount; i++) { | ||
873 | regval = (val >> (regwshift*(regcount-i-1))) & regwmask; | ||
874 | regmask = (mask >> (regwshift*(regcount-i-1))) & regwmask; | ||
875 | err = snd_soc_component_update_bits(component, regbase+i, | ||
876 | regmask, regval); | ||
877 | if (err < 0) | ||
878 | return err; | ||
879 | } | ||
880 | |||
881 | return 0; | ||
882 | } | ||
883 | EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx); | ||
884 | |||
885 | /** | ||
886 | * snd_soc_get_strobe - strobe get callback | ||
887 | * @kcontrol: mixer control | ||
888 | * @ucontrol: control element information | ||
889 | * | ||
890 | * Callback get the value of a strobe mixer control. | ||
891 | * | ||
892 | * Returns 0 for success. | ||
893 | */ | ||
894 | int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, | ||
895 | struct snd_ctl_elem_value *ucontrol) | ||
896 | { | ||
897 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
898 | struct soc_mixer_control *mc = | ||
899 | (struct soc_mixer_control *)kcontrol->private_value; | ||
900 | unsigned int reg = mc->reg; | ||
901 | unsigned int shift = mc->shift; | ||
902 | unsigned int mask = 1 << shift; | ||
903 | unsigned int invert = mc->invert != 0; | ||
904 | unsigned int val; | ||
905 | int ret; | ||
906 | |||
907 | ret = snd_soc_component_read(component, reg, &val); | ||
908 | if (ret) | ||
909 | return ret; | ||
910 | |||
911 | val &= mask; | ||
912 | |||
913 | if (shift != 0 && val != 0) | ||
914 | val = val >> shift; | ||
915 | ucontrol->value.enumerated.item[0] = val ^ invert; | ||
916 | |||
917 | return 0; | ||
918 | } | ||
919 | EXPORT_SYMBOL_GPL(snd_soc_get_strobe); | ||
920 | |||
921 | /** | ||
922 | * snd_soc_put_strobe - strobe put callback | ||
923 | * @kcontrol: mixer control | ||
924 | * @ucontrol: control element information | ||
925 | * | ||
926 | * Callback strobe a register bit to high then low (or the inverse) | ||
927 | * in one pass of a single mixer enum control. | ||
928 | * | ||
929 | * Returns 1 for success. | ||
930 | */ | ||
931 | int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, | ||
932 | struct snd_ctl_elem_value *ucontrol) | ||
933 | { | ||
934 | struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); | ||
935 | struct soc_mixer_control *mc = | ||
936 | (struct soc_mixer_control *)kcontrol->private_value; | ||
937 | unsigned int reg = mc->reg; | ||
938 | unsigned int shift = mc->shift; | ||
939 | unsigned int mask = 1 << shift; | ||
940 | unsigned int invert = mc->invert != 0; | ||
941 | unsigned int strobe = ucontrol->value.enumerated.item[0] != 0; | ||
942 | unsigned int val1 = (strobe ^ invert) ? mask : 0; | ||
943 | unsigned int val2 = (strobe ^ invert) ? 0 : mask; | ||
944 | int err; | ||
945 | |||
946 | err = snd_soc_component_update_bits(component, reg, mask, val1); | ||
947 | if (err < 0) | ||
948 | return err; | ||
949 | |||
950 | return snd_soc_component_update_bits(component, reg, mask, val2); | ||
951 | } | ||
952 | EXPORT_SYMBOL_GPL(snd_soc_put_strobe); | ||