Pinmux driver almost certainly should be initialized before the rest of hardware devices (which may need specific pins already configured for them), and usually after generic GPIO drivers. Thus, its priority should be between KERNEL_INIT_PRIORITY_DEFAULT (default 40) and KERNEL_INIT_PRIORITY_DEVICE (default 50). Thus, we set PINMUX_INIT_PRIORITY to 45. There are exceptions to the rule above for particular boards. For example, BOARD=galileo has GPIO and pinmuxer on I2C bus and thus overrides PINMUX_INIT_PRIORITY to be much higher. Note that while PINMUX_INIT_PRIORITY was defined previously (at 60), it was used only for galileo, which overrides it anyway. This fix was prompted by investigation why eth_ksdk driver was non-functional after kernel priorities re-hashing: both eth_ksdk and pinmux used the same priority, and eth_ksdk happened to run before pinmux. While bumping eth_ksdk priority would help in the particular case, the same would likely reoccur with other drivers like I2C, SPI, etc. Change-Id: Ie5ca3135c1ee2fe8d9cf48d5c12e62eac63487f7 Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/* pinmux_dev_k64.c - Pinmux dev driver for Freescale K64 */
|
|
|
|
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <device.h>
|
|
#include <init.h>
|
|
#include <nanokernel.h>
|
|
#include <pinmux.h>
|
|
#include <soc.h>
|
|
#include <sys_io.h>
|
|
#include <pinmux/k64/pinmux.h>
|
|
|
|
static int fsl_k64_dev_set(struct device *dev, uint32_t pin,
|
|
uint32_t func)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
|
|
return _fsl_k64_set_pin(pin, func);
|
|
}
|
|
|
|
static int fsl_k64_dev_get(struct device *dev, uint32_t pin,
|
|
uint32_t *func)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
|
|
return _fsl_k64_get_pin(pin, func);
|
|
}
|
|
|
|
static const struct pinmux_driver_api api_funcs = {
|
|
.set = fsl_k64_dev_set,
|
|
.get = fsl_k64_dev_get
|
|
};
|
|
|
|
int pinmux_fsl_k64_initialize(struct device *port)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/* must be initialized after GPIO */
|
|
DEVICE_AND_API_INIT(pmux, CONFIG_PINMUX_DEV_NAME, &pinmux_fsl_k64_initialize,
|
|
NULL, NULL,
|
|
POST_KERNEL, CONFIG_PINMUX_INIT_PRIORITY,
|
|
&api_funcs);
|