gpio driver prepare patch

moves jtdev functions to pointers, to exchange late on.

Signed-off-by: Jan Willeke <willeke@smartmote.de>
This commit is contained in:
Jan Willeke 2015-02-03 19:42:23 +01:00 committed by Daniel Beer
parent 7e04b31e65
commit 9497265e72
4 changed files with 107 additions and 79 deletions

View File

@ -52,23 +52,23 @@
/* Bypass instruction */ /* Bypass instruction */
#define IR_BYPASS 0xFF /* 0xFF */ #define IR_BYPASS 0xFF /* 0xFF */
#define jtag_tms_set(p) jtdev_tms(p, 1) #define jtag_tms_set(p) p->f->jtdev_tms(p, 1)
#define jtag_tms_clr(p) jtdev_tms(p, 0) #define jtag_tms_clr(p) p->f->jtdev_tms(p, 0)
#define jtag_tck_set(p) jtdev_tck(p, 1) #define jtag_tck_set(p) p->f->jtdev_tck(p, 1)
#define jtag_tck_clr(p) jtdev_tck(p, 0) #define jtag_tck_clr(p) p->f->jtdev_tck(p, 0)
#define jtag_tdi_set(p) jtdev_tdi(p, 1) #define jtag_tdi_set(p) p->f->jtdev_tdi(p, 1)
#define jtag_tdi_clr(p) jtdev_tdi(p, 0) #define jtag_tdi_clr(p) p->f->jtdev_tdi(p, 0)
#define jtag_tclk_set(p) jtdev_tclk(p, 1) #define jtag_tclk_set(p) p->f->jtdev_tclk(p, 1)
#define jtag_tclk_clr(p) jtdev_tclk(p, 0) #define jtag_tclk_clr(p) p->f->jtdev_tclk(p, 0)
#define jtag_rst_set(p) jtdev_rst(p, 1) #define jtag_rst_set(p) p->f->jtdev_rst(p, 1)
#define jtag_rst_clr(p) jtdev_rst(p, 0) #define jtag_rst_clr(p) p->f->jtdev_rst(p, 0)
#define jtag_tst_set(p) jtdev_tst(p, 1) #define jtag_tst_set(p) p->f->jtdev_tst(p, 1)
#define jtag_tst_clr(p) jtdev_tst(p, 0) #define jtag_tst_clr(p) p->f->jtdev_tst(p, 0)
#define jtag_led_green_on(p) jtdev_led_green(p, 1) #define jtag_led_green_on(p) p->f->jtdev_led_green(p, 1)
#define jtag_led_green_off(p) jtdev_led_green(p, 0) #define jtag_led_green_off(p) p->f->jtdev_led_green(p, 0)
#define jtag_led_red_on(p) jtdev_led_red(p, 1) #define jtag_led_red_on(p) p->f->jtdev_led_red(p, 1)
#define jtag_led_red_off(p) jtdev_led_red(p, 0) #define jtag_led_red_off(p) p->f->jtdev_led_red(p, 0)
/* Reset target JTAG interface and perform fuse-HW check */ /* Reset target JTAG interface and perform fuse-HW check */
static void jtag_reset_tap(struct jtdev *p) static void jtag_reset_tap(struct jtdev *p)
@ -130,7 +130,7 @@ static unsigned int jtag_shift( struct jtdev *p,
unsigned int mask; unsigned int mask;
unsigned int tclk_save; unsigned int tclk_save;
tclk_save = jtdev_tclk_get(p); tclk_save = p->f->jtdev_tclk_get(p);
data_in = 0; data_in = 0;
for (mask = 0x0001U << (num_bits - 1); mask != 0; mask >>= 1) { for (mask = 0x0001U << (num_bits - 1); mask != 0; mask >>= 1) {
@ -145,11 +145,11 @@ static unsigned int jtag_shift( struct jtdev *p,
jtag_tck_clr(p); jtag_tck_clr(p);
jtag_tck_set(p); jtag_tck_set(p);
if (jtdev_tdo_get(p) == 1) if (p->f->jtdev_tdo_get(p) == 1)
data_in |= mask; data_in |= mask;
} }
jtdev_tclk(p, tclk_save); p->f->jtdev_tclk(p, tclk_save);
/* Set JTAG state back to Run-Test/Idle */ /* Set JTAG state back to Run-Test/Idle */
jtag_tclk_prep(p); jtag_tclk_prep(p);
@ -370,14 +370,14 @@ unsigned int jtag_init(struct jtdev *p)
unsigned int jtag_id; unsigned int jtag_id;
jtag_rst_clr(p); jtag_rst_clr(p);
jtdev_power_on(p); p->f->jtdev_power_on(p);
jtag_tst_set(p); jtag_tst_set(p);
jtag_tdi_set(p); jtag_tdi_set(p);
jtag_tms_set(p); jtag_tms_set(p);
jtag_tck_set(p); jtag_tck_set(p);
jtag_tclk_set(p); jtag_tclk_set(p);
jtag_rst_clr(p); jtag_rst_clr(p);
jtdev_connect(p); p->f->jtdev_connect(p);
jtag_rst_set(p); jtag_rst_set(p);
jtag_reset_tap(p); jtag_reset_tap(p);
@ -763,7 +763,7 @@ void jtag_write_flash(struct jtdev *p,
/* provide TCLKs /* provide TCLKs
* min. 33 for F149 and F449 * min. 33 for F149 and F449
*/ */
jtdev_tclk_strobe(p, 35); p->f->jtdev_tclk_strobe(p, 35);
address += 2; address += 2;
if (p->failed) if (p->failed)
@ -863,7 +863,7 @@ void jtag_erase_flash(struct jtdev *p,
jtag_dr_shift(p, 0x2409); jtag_dr_shift(p, 0x2409);
/* provide TCLKs */ /* provide TCLKs */
jtdev_tclk_strobe(p, number_of_strobes); p->f->jtdev_tclk_strobe(p, number_of_strobes);
/* Set RW to write */ /* Set RW to write */
jtag_ir_shift(p, IR_CNTRL_SIG_16BIT); jtag_ir_shift(p, IR_CNTRL_SIG_16BIT);

View File

@ -131,7 +131,7 @@ static void do_ppwcontrol(struct jtdev *p)
} }
} }
int jtdev_open(struct jtdev *p, const char *device) static int jtpif_open(struct jtdev *p, const char *device)
{ {
p->port = open(device, O_RDWR); p->port = open(device, O_RDWR);
if (p->port < 0) { if (p->port < 0) {
@ -157,7 +157,7 @@ int jtdev_open(struct jtdev *p, const char *device)
return 0; return 0;
} }
void jtdev_close(struct jtdev *p) static void jtpif_close(struct jtdev *p)
{ {
if (par_release(p->port) < 0) if (par_release(p->port) < 0)
pr_error("warning: jtdev: failed to release port"); pr_error("warning: jtdev: failed to release port");
@ -165,14 +165,14 @@ void jtdev_close(struct jtdev *p)
close(p->port); close(p->port);
} }
void jtdev_power_on(struct jtdev *p) static void jtpif_power_on(struct jtdev *p)
{ {
/* power supply on */ /* power supply on */
p->data_register |= POWER; p->data_register |= POWER;
do_ppwdata(p); do_ppwdata(p);
} }
void jtdev_power_off(struct jtdev *p) static void jtpif_power_off(struct jtdev *p)
{ {
/* power supply off */ /* power supply off */
p->data_register &= ~POWER; p->data_register &= ~POWER;
@ -184,19 +184,19 @@ void jtdev_power_off(struct jtdev *p)
do_ppwcontrol(p); do_ppwcontrol(p);
} }
void jtdev_connect(struct jtdev *p) static void jtpif_connect(struct jtdev *p)
{ {
p->control_register |= (TEST | ENABLE); p->control_register |= (TEST | ENABLE);
do_ppwcontrol(p); do_ppwcontrol(p);
} }
void jtdev_release(struct jtdev *p) static void jtpif_release(struct jtdev *p)
{ {
p->control_register &= ~(TEST | ENABLE); p->control_register &= ~(TEST | ENABLE);
do_ppwcontrol(p); do_ppwcontrol(p);
} }
void jtdev_tck(struct jtdev *p, int out) static void jtpif_tck(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= TCK; p->data_register |= TCK;
@ -206,7 +206,7 @@ void jtdev_tck(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
void jtdev_tms(struct jtdev *p, int out) static void jtpif_tms(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= TMS; p->data_register |= TMS;
@ -216,7 +216,7 @@ void jtdev_tms(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
void jtdev_tdi(struct jtdev *p, int out) static void jtpif_tdi(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= TDI; p->data_register |= TDI;
@ -226,7 +226,7 @@ void jtdev_tdi(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
void jtdev_rst(struct jtdev *p, int out) static void jtpif_rst(struct jtdev *p, int out)
{ {
/* reset pin is inverted by PC hardware */ /* reset pin is inverted by PC hardware */
if (out) if (out)
@ -237,7 +237,7 @@ void jtdev_rst(struct jtdev *p, int out)
do_ppwcontrol(p); do_ppwcontrol(p);
} }
void jtdev_tst(struct jtdev *p, int out) static void jtpif_tst(struct jtdev *p, int out)
{ {
if (out) if (out)
p->control_register |= TEST; p->control_register |= TEST;
@ -247,7 +247,7 @@ void jtdev_tst(struct jtdev *p, int out)
do_ppwcontrol(p); do_ppwcontrol(p);
} }
int jtdev_tdo_get(struct jtdev *p) static int jtpif_tdo_get(struct jtdev *p)
{ {
uint8_t input; uint8_t input;
@ -260,7 +260,7 @@ int jtdev_tdo_get(struct jtdev *p)
return (input & TDO) ? 1 : 0; return (input & TDO) ? 1 : 0;
} }
void jtdev_tclk(struct jtdev *p, int out) static void jtpif_tclk(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= TCLK; p->data_register |= TCLK;
@ -270,25 +270,25 @@ void jtdev_tclk(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
int jtdev_tclk_get(struct jtdev *p) static int jtpif_tclk_get(struct jtdev *p)
{ {
return (p->data_register & TCLK) ? 1 : 0; return (p->data_register & TCLK) ? 1 : 0;
} }
void jtdev_tclk_strobe(struct jtdev *p, unsigned int count) static void jtpif_tclk_strobe(struct jtdev *p, unsigned int count)
{ {
int i; int i;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
jtdev_tclk(p, 1); jtpif_tclk(p, 1);
jtdev_tclk(p, 0); jtpif_tclk(p, 0);
if (p->failed) if (p->failed)
return; return;
} }
} }
void jtdev_led_green(struct jtdev *p, int out) static void jtpif_led_green(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= LED_GREEN; p->data_register |= LED_GREEN;
@ -298,7 +298,7 @@ void jtdev_led_green(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
void jtdev_led_red(struct jtdev *p, int out) static void jtpif_led_red(struct jtdev *p, int out)
{ {
if (out) if (out)
p->data_register |= LED_RED; p->data_register |= LED_RED;
@ -308,31 +308,52 @@ void jtdev_led_red(struct jtdev *p, int out)
do_ppwdata(p); do_ppwdata(p);
} }
#else /* __linux__ */ #else /* __linux__ */
int jtdev_open(struct jtdev *p, const char *device) static int jtpif_open(struct jtdev *p, const char *device)
{ {
printc_err("jtdev: driver is not supported on this platform\n"); printc_err("jtdev: driver is not supported on this platform\n");
p->failed = 1; p->failed = 1;
return -1; return -1;
} }
void jtdev_close(struct jtdev *p) { } static void jtpif_close(struct jtdev *p) { }
void jtdev_power_on(struct jtdev *p) { } static void jtpif_power_on(struct jtdev *p) { }
void jtdev_power_off(struct jtdev *p) { } static void jtpif_power_off(struct jtdev *p) { }
void jtdev_connect(struct jtdev *p) { } static void jtpif_connect(struct jtdev *p) { }
void jtdev_release(struct jtdev *p) { } static void jtpif_release(struct jtdev *p) { }
void jtdev_tck(struct jtdev *p, int out) { } static void jtpif_tck(struct jtdev *p, int out) { }
void jtdev_tms(struct jtdev *p, int out) { } static void jtpif_tms(struct jtdev *p, int out) { }
void jtdev_tdi(struct jtdev *p, int out) { } static void jtpif_tdi(struct jtdev *p, int out) { }
void jtdev_rst(struct jtdev *p, int out) { } static void jtpif_rst(struct jtdev *p, int out) { }
void jtdev_tst(struct jtdev *p, int out) { } static void jtpif_tst(struct jtdev *p, int out) { }
int jtdev_tdo_get(struct jtdev *p) { return 0; } static int jtpif_tdo_get(struct jtdev *p) { return 0; }
void jtdev_tclk(struct jtdev *p, int out) { } static void jtpif_tclk(struct jtdev *p, int out) { }
int jtdev_tclk_get(struct jtdev *p) { return 0; } static int jtpif_tclk_get(struct jtdev *p) { return 0; }
void jtdev_tclk_strobe(struct jtdev *p, unsigned int count) { } static void jtpif_tclk_strobe(struct jtdev *p, unsigned int count) { }
void jtdev_led_green(struct jtdev *p, int out) { } static void jtpif_led_green(struct jtdev *p, int out) { }
void jtdev_led_red(struct jtdev *p, int out) { } static void jtpif_led_red(struct jtdev *p, int out) { }
#endif #endif
const struct jtdev_func jtdev_func_pif = {
.jtdev_open = jtpif_open,
.jtdev_close = jtpif_close,
.jtdev_power_on = jtpif_power_on,
.jtdev_power_off = jtpif_power_off,
.jtdev_connect = jtpif_connect,
.jtdev_release = jtpif_release,
.jtdev_tck = jtpif_tck,
.jtdev_tms = jtpif_tms,
.jtdev_tdi = jtpif_tdi,
.jtdev_rst = jtpif_rst,
.jtdev_tst = jtpif_tst,
.jtdev_tdo_get = jtpif_tdo_get,
.jtdev_tclk = jtpif_tclk,
.jtdev_tclk_get = jtpif_tclk_get,
.jtdev_tclk_strobe = jtpif_tclk_strobe,
.jtdev_led_green = jtpif_led_green,
.jtdev_led_red = jtpif_led_red
};

View File

@ -19,44 +19,50 @@
#ifndef JTDEV_H_ #ifndef JTDEV_H_
#define JTDEV_H_ #define JTDEV_H_
struct jtdev_func;
struct jtdev { struct jtdev {
int port; int port;
uint8_t data_register; uint8_t data_register;
uint8_t control_register; uint8_t control_register;
int failed; int failed;
const struct jtdev_func * f;
}; };
struct jtdev_func{
/* Initialize/destroy a parallel-port JTAG interface. jtdev_open() /* Initialize/destroy a parallel-port JTAG interface. jtdev_open()
* returns 0 on success or -1 if an error occurs. * returns 0 on success or -1 if an error occurs.
* *
* All other JTAG IO functions indicate errors by setting the failed * All other JTAG IO functions indicate errors by setting the failed
* field in the jtdev structure. * field in the jtdev structure.
*/ */
int jtdev_open(struct jtdev *p, const char *device); int (*jtdev_open)(struct jtdev *p, const char *device);
void jtdev_close(struct jtdev *p); void (*jtdev_close)(struct jtdev *p);
/* Connect/release JTAG */ /* Connect/release JTAG */
void jtdev_power_on(struct jtdev *p); void (*jtdev_power_on)(struct jtdev *p);
void jtdev_power_off(struct jtdev *p); void (*jtdev_power_off)(struct jtdev *p);
void jtdev_connect(struct jtdev *p); void (*jtdev_connect)(struct jtdev *p);
void jtdev_release(struct jtdev *p); void (*jtdev_release)(struct jtdev *p);
/* Low-level IO */ /* Low-level IO */
void jtdev_tck(struct jtdev *p, int out); void (*jtdev_tck)(struct jtdev *p, int out);
void jtdev_tms(struct jtdev *p, int out); void (*jtdev_tms)(struct jtdev *p, int out);
void jtdev_tdi(struct jtdev *p, int out); void (*jtdev_tdi)(struct jtdev *p, int out);
void jtdev_rst(struct jtdev *p, int out); void (*jtdev_rst)(struct jtdev *p, int out);
void jtdev_tst(struct jtdev *p, int out); void (*jtdev_tst)(struct jtdev *p, int out);
int jtdev_tdo_get(struct jtdev *p); int (*jtdev_tdo_get)(struct jtdev *p);
/* TCLK management */ /* TCLK management */
void jtdev_tclk(struct jtdev *p, int out); void (*jtdev_tclk)(struct jtdev *p, int out);
int jtdev_tclk_get(struct jtdev *p); int (*jtdev_tclk_get)(struct jtdev *p);
void jtdev_tclk_strobe(struct jtdev *p, unsigned int count); void (*jtdev_tclk_strobe)(struct jtdev *p, unsigned int count);
/* LED indicators */ /* LED indicators */
void jtdev_led_green(struct jtdev *p, int out); void (*jtdev_led_green)(struct jtdev *p, int out);
void jtdev_led_red(struct jtdev *p, int out); void (*jtdev_led_red)(struct jtdev *p, int out);
};
extern const struct jtdev_func jtdev_func_pif;
#endif #endif

View File

@ -353,8 +353,9 @@ static device_t pif_open(const struct device_args *args)
memset(dev, 0, sizeof(*dev)); memset(dev, 0, sizeof(*dev));
dev->base.type = &device_pif; dev->base.type = &device_pif;
dev->base.max_breakpoints = 0; dev->base.max_breakpoints = 0;
(&dev->jtag)->f = &jtdev_func_pif;
if (jtdev_open(&dev->jtag, args->path) < 0) { if ((&dev->jtag)->f->jtdev_open(&dev->jtag, args->path) < 0) {
printc_err("pif: can't open port\n"); printc_err("pif: can't open port\n");
free(dev); free(dev);
return NULL; return NULL;
@ -377,7 +378,7 @@ static void pif_destroy(device_t dev_base)
dev->jtag.failed = 0; dev->jtag.failed = 0;
jtag_release_device(&dev->jtag, 0xfffe); jtag_release_device(&dev->jtag, 0xfffe);
jtdev_close(&dev->jtag); (&dev->jtag)->f->jtdev_close(&dev->jtag);
free(dev); free(dev);
} }