Unverified Commit 316ddb13 authored by Mark Brown's avatar Mark Brown
Browse files

Add "mclk" support for maxim,max9867

Merge series from richard.leitner@linux.dev:

This series adds support for the clocks properties in the
maxim,max9867 bindings. Furthermore the binding definitions are
converted from txt to yaml.

The clock property is needed to define the mclk for one of our
boards which uses the the i.MX8MP SAI MCLK as clock for the
maxim,max9867.
parents 47ef3e60 448b06ba
Loading
Loading
Loading
Loading
+0 −17
Original line number Diff line number Diff line
max9867 codec

This device supports I2C mode only.

Required properties:

- compatible : "maxim,max9867"
- reg : The chip select number on the I2C bus

Example:

&i2c {
	max9867: max9867@18 {
		compatible = "maxim,max9867";
		reg = <0x18>;
	};
};
+66 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/sound/maxim,max9867.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Maxim Integrated MAX9867 CODEC

description: |
  This device supports I2C only.
  Pins on the device (for linking into audio routes):
      * LOUT
      * ROUT
      * LINL
      * LINR
      * MICL
      * MICR
      * DMICL
      * DMICR

maintainers:
  - Ladislav Michl <ladis@linux-mips.org>

allOf:
  - $ref: dai-common.yaml#

properties:
  compatible:
    enum:
      - maxim,max9867

  '#sound-dai-cells':
    const: 0

  reg:
    maxItems: 1

  clocks:
    maxItems: 1

required:
  - compatible
  - reg
  - clocks

additionalProperties: false

examples:
  - |
    i2c {
        #address-cells = <1>;
        #size-cells = <0>;
        codec@18 {
            compatible = "maxim,max9867";
            #sound-dai-cells = <0>;
            reg = <0x18>;
            clocks = <&codec_clk>;
        };
    };

    codec_clk: clock {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <12288000>;
    };
...
+17 −2
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
// Copyright 2018 Ladislav Michl <ladis@linux-mips.org>
//

#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/module.h>
@@ -16,6 +17,7 @@
#include "max9867.h"

struct max9867_priv {
	struct clk *mclk;
	struct regmap *regmap;
	const struct snd_pcm_hw_constraint_list *constraints;
	unsigned int sysclk, pclk;
@@ -577,6 +579,11 @@ static int max9867_set_bias_level(struct snd_soc_component *component,
	struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component);

	switch (level) {
	case SND_SOC_BIAS_ON:
		err = clk_prepare_enable(max9867->mclk);
		if (err)
			return err;
		break;
	case SND_SOC_BIAS_STANDBY:
		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
			err = regcache_sync(max9867->regmap);
@@ -595,6 +602,7 @@ static int max9867_set_bias_level(struct snd_soc_component *component,
			return err;

		regcache_mark_dirty(max9867->regmap);
		clk_disable_unprepare(max9867->mclk);
		break;
	default:
		break;
@@ -663,11 +671,18 @@ static int max9867_i2c_probe(struct i2c_client *i2c)
	dev_info(&i2c->dev, "device revision: %x\n", reg);
	ret = devm_snd_soc_register_component(&i2c->dev, &max9867_component,
			max9867_dai, ARRAY_SIZE(max9867_dai));
	if (ret < 0)
	if (ret < 0) {
		dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
		return ret;
	}

	max9867->mclk = devm_clk_get(&i2c->dev, NULL);
	if (IS_ERR(max9867->mclk))
		return PTR_ERR(max9867->mclk);

	return 0;
}

static const struct i2c_device_id max9867_i2c_id[] = {
	{ "max9867", 0 },
	{ }