Skip to content

Commit

Permalink
brcm80211: smac: use bcma core access functions in otp.c
Browse files Browse the repository at this point in the history
The code in otp.c now uses the bcma core access functions to
read the OTP information from the device.

Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Alwin Beukers <alwin@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Arend van Spriel authored and John W. Linville committed Dec 13, 2011
1 parent d3126c5 commit 373c78e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 42 deletions.
68 changes: 26 additions & 42 deletions drivers/net/wireless/brcm80211/brcmsmac/otp.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ struct otp_fn_s {
};

struct otpinfo {
uint ccrev; /* chipc revision */
struct bcma_device *core; /* chipc core */
const struct otp_fn_s *fn; /* OTP functions */
struct si_pub *sih; /* Saved sb handle */

Expand Down Expand Up @@ -133,9 +133,10 @@ struct otpinfo {
#define OTP_SZ_FU_144 (144/8) /* 144 bits */

static u16
ipxotp_otpr(struct otpinfo *oi, struct chipcregs __iomem *cc, uint wn)
ipxotp_otpr(struct otpinfo *oi, uint wn)
{
return R_REG(&cc->sromotp[wn]);
return bcma_read16(oi->core,
CHIPCREGOFFS(sromotp[wn]));
}

/*
Expand All @@ -161,19 +162,21 @@ static int ipxotp_max_rgnsz(struct si_pub *sih, int osizew)
return ret;
}

static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
static void _ipxotp_init(struct otpinfo *oi)
{
uint k;
u32 otpp, st;
int ccrev = ai_get_ccrev(oi->sih);


/*
* record word offset of General Use Region
* for various chipcommon revs
*/
if (oi->ccrev == 21 || oi->ccrev == 24
|| oi->ccrev == 27) {
if (ccrev == 21 || ccrev == 24
|| ccrev == 27) {
oi->otpgu_base = REVA4_OTPGU_BASE;
} else if (oi->ccrev == 36) {
} else if (ccrev == 36) {
/*
* OTP size greater than equal to 2KB (128 words),
* otpgu_base is similar to rev23
Expand All @@ -182,32 +185,29 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
oi->otpgu_base = REVB8_OTPGU_BASE;
else
oi->otpgu_base = REV36_OTPGU_BASE;
} else if (oi->ccrev == 23 || oi->ccrev >= 25) {
} else if (ccrev == 23 || ccrev >= 25) {
oi->otpgu_base = REVB8_OTPGU_BASE;
}

/* First issue an init command so the status is up to date */
otpp =
OTPP_START_BUSY | ((OTPPOC_INIT << OTPP_OC_SHIFT) & OTPP_OC_MASK);

W_REG(&cc->otpprog, otpp);
for (k = 0;
((st = R_REG(&cc->otpprog)) & OTPP_START_BUSY)
&& (k < OTPP_TRIES); k++)
;
bcma_write32(oi->core, CHIPCREGOFFS(otpprog), otpp);
st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
for (k = 0; (st & OTPP_START_BUSY) && (k < OTPP_TRIES); k++)
st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
if (k >= OTPP_TRIES)
return;

/* Read OTP lock bits and subregion programmed indication bits */
oi->status = R_REG(&cc->otpstatus);
oi->status = bcma_read32(oi->core, CHIPCREGOFFS(otpstatus));

if ((ai_get_chip_id(oi->sih) == BCM43224_CHIP_ID)
|| (ai_get_chip_id(oi->sih) == BCM43225_CHIP_ID)) {
u32 p_bits;
p_bits =
(ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_P_OFF) &
OTPGU_P_MSK)
>> OTPGU_P_SHIFT;
p_bits = (ipxotp_otpr(oi, oi->otpgu_base + OTPGU_P_OFF) &
OTPGU_P_MSK) >> OTPGU_P_SHIFT;
oi->status |= (p_bits << OTPS_GUP_SHIFT);
}

Expand All @@ -220,7 +220,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
oi->hwlim = oi->wsize;
if (oi->status & OTPS_GUP_HW) {
oi->hwlim =
ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
ipxotp_otpr(oi, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
oi->swbase = oi->hwlim;
} else
oi->swbase = oi->hwbase;
Expand All @@ -230,7 +230,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

if (oi->status & OTPS_GUP_SW) {
oi->swlim =
ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
ipxotp_otpr(oi, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
oi->fbase = oi->swlim;
} else
oi->fbase = oi->swbase;
Expand All @@ -240,11 +240,8 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
{
uint idx;
struct chipcregs __iomem *cc;

/* Make sure we're running IPX OTP */
if (!OTPTYPE_IPX(oi->ccrev))
if (!OTPTYPE_IPX(ai_get_ccrev(sih)))
return -EBADE;

/* Make sure OTP is not disabled */
Expand Down Expand Up @@ -282,21 +279,13 @@ static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
}

/* Retrieve OTP region info */
idx = ai_coreidx(sih);
cc = ai_setcoreidx(sih, SI_CC_IDX);

_ipxotp_init(oi, cc);

ai_setcoreidx(sih, idx);

_ipxotp_init(oi);
return 0;
}

static int
ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
{
uint idx;
struct chipcregs __iomem *cc;
uint base, i, sz;

/* Validate region selection */
Expand Down Expand Up @@ -365,14 +354,10 @@ ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
return -EINVAL;
}

idx = ai_coreidx(oi->sih);
cc = ai_setcoreidx(oi->sih, SI_CC_IDX);

/* Read the data */
for (i = 0; i < sz; i++)
data[i] = ipxotp_otpr(oi, cc, base + i);
data[i] = ipxotp_otpr(oi, base + i);

ai_setcoreidx(oi->sih, idx);
*wlen = sz;
return 0;
}
Expand All @@ -384,22 +369,21 @@ static const struct otp_fn_s ipxotp_fn = {

static int otp_init(struct si_pub *sih, struct otpinfo *oi)
{

int ret;

memset(oi, 0, sizeof(struct otpinfo));

oi->ccrev = ai_get_ccrev(sih);
oi->core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);

if (OTPTYPE_IPX(oi->ccrev))
if (OTPTYPE_IPX(ai_get_ccrev(sih)))
oi->fn = &ipxotp_fn;

if (oi->fn == NULL)
return -EBADE;

oi->sih = sih;

ret = (oi->fn->init) (sih, oi);
ret = (oi->fn->init)(sih, oi);

return ret;
}
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/wireless/brcm80211/include/chipcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

#include "defs.h" /* for PAD macro */

#define CHIPCREGOFFS(field) offsetof(struct chipcregs, field)

struct chipcregs {
u32 chipid; /* 0x0 */
u32 capabilities;
Expand Down

0 comments on commit 373c78e

Please sign in to comment.