powerpc/qe: Implement QE Pin Multiplexing API
With this API we're able to set a QE pin to the GPIO mode or a dedicated peripheral function. The API relies on the fact that QE gpio controllers are registered. If they aren't, the API won't work (gracefully though). There is one caveat though: if anybody occupied the node->data before us, or overwrote it, then bad things will happen. Luckily this is all in the platform code that we fully control, so this should never happen. I could implement more checks (for example we could create a list of successfully registered QE controllers, and compare the node->data in the qe_pin_request()), but this is unneeded if nobody is going to do silly things behind our back. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
committed by
Kumar Gala
parent
78c7705037
commit
1b9e89046c
@@ -17,6 +17,8 @@
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <asm/cpm.h>
|
||||
#include <asm/immap_qe.h>
|
||||
|
||||
@@ -112,6 +114,25 @@ extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
|
||||
int assignment, int has_irq);
|
||||
extern int par_io_data_set(u8 port, u8 pin, u8 val);
|
||||
|
||||
/*
|
||||
* Pin multiplexing functions.
|
||||
*/
|
||||
struct qe_pin;
|
||||
#ifdef CONFIG_QE_GPIO
|
||||
extern struct qe_pin *qe_pin_request(struct device_node *np, int index);
|
||||
extern void qe_pin_free(struct qe_pin *qe_pin);
|
||||
extern void qe_pin_set_gpio(struct qe_pin *qe_pin);
|
||||
extern void qe_pin_set_dedicated(struct qe_pin *pin);
|
||||
#else
|
||||
static inline struct qe_pin *qe_pin_request(struct device_node *np, int index)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
static inline void qe_pin_free(struct qe_pin *qe_pin) {}
|
||||
static inline void qe_pin_set_gpio(struct qe_pin *qe_pin) {}
|
||||
static inline void qe_pin_set_dedicated(struct qe_pin *pin) {}
|
||||
#endif /* CONFIG_QE_GPIO */
|
||||
|
||||
/* QE internal API */
|
||||
int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
|
||||
enum qe_clock qe_clock_source(const char *source);
|
||||
|
Reference in New Issue
Block a user