/*
 * Copyright (c) 2018 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <kernel.h>
#include <init.h>
#include <pinmux.h>
#include "iomux.h"

/*
 * :::::::::::: NOTE ::::::::::::
 * For a list of possible I/O MUX settings,
 * See soc/xtensa/intel_s1000/iomux.h
 */

/*
 * Initializes the I/O MUX with the setting needed per Intel S1000 CRB
 * For customizations, please refer to the table above for available settings
 * Please note that a call to pinmux_pin_set is only needed when a setting
 * that is not default is required
 */
static int intel_s1000_pinmux_init(struct device *dev)
{
	struct device *pinmux;

	pinmux = device_get_binding(CONFIG_PINMUX_NAME);

	if (pinmux == NULL) {
		return -ENXIO;
	}

	/* Select PDM instead of I2S0 since board has 8 microphones */
	pinmux_pin_set(pinmux, PIN_GROUP(I2S0), PINMUX_FUNC_B);

	/*
	 * I2S3 is wired to the host interface connector.
	 * Select GPIO to avoid any conflict with hosts that may be driving
	 * the signals.
	 */
	pinmux_pin_set(pinmux, PIN_GROUP(I2S3), PINMUX_FUNC_B);

	/* TI DAC is on I2C1. Usually, there is no device on I2C0 */
	pinmux_pin_set(pinmux, PIN_GROUP(I2C), PINMUX_FUNC_B);

	/* Intel S1000 CRB has an octal SPI flash. Select MST_DQ */
	pinmux_pin_set(pinmux, PIN_GROUP(EM_DQ), PINMUX_FUNC_B);

	return 0;
}

SYS_INIT(intel_s1000_pinmux_init, PRE_KERNEL_2, CONFIG_PINMUX_INIT_PRIORITY);
